温湿度传感器SHT20的模拟I2C的no hold master的读取温度的程序
时间: 2023-12-10 07:41:53 浏览: 40
以下是SHT20模拟I2C的no hold master读取温度的程序,使用了STM32的HAL库:
```c
#include "stm32f1xx_hal.h"
#define SHT20_ADDR 0x80 // SHT20地址
#define SHT20_TEMP_NOHOLD_CMD 0xF3 // 温度读取命令
I2C_HandleTypeDef hi2c1;
// 初始化I2C总线
void I2C_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
// 向SHT20发送温度读取命令
void SHT20_SendTempCmd(void)
{
uint8_t cmd = SHT20_TEMP_NOHOLD_CMD;
HAL_I2C_Master_Transmit(&hi2c1, SHT20_ADDR, &cmd, 1, HAL_MAX_DELAY);
}
// 从SHT20读取温度数据
uint16_t SHT20_ReadTempData(void)
{
uint8_t data[2];
HAL_I2C_Master_Receive(&hi2c1, SHT20_ADDR, data, 2, HAL_MAX_DELAY);
uint16_t temp = ((uint16_t)data[0] << 8) | data[1];
return temp;
}
// 计算温度值
float SHT20_CalcTemp(uint16_t tempData)
{
float temp = -46.85 + 175.72 * (float)tempData / 65536.0;
return temp;
}
int main(void)
{
HAL_Init();
I2C_Init();
while (1)
{
SHT20_SendTempCmd(); // 发送温度读取命令
HAL_Delay(100); // 等待100ms,让SHT20完成温度转换
uint16_t tempData = SHT20_ReadTempData(); // 读取温度数据
float temp = SHT20_CalcTemp(tempData); // 计算温度值
printf("Temperature: %.2f°C\r\n", temp); // 打印温度值
HAL_Delay(1000); // 延时1秒
}
}
```
注意,SHT20的I2C地址是0x80,而不是0x40。在发送温度读取命令后,需要等待一段时间(通常为100ms),让SHT20完成温度转换。读取到的温度数据是16位的,需要根据SHT20的温度计算公式计算出实际的温度值。