87 lines
1.9 KiB
C
87 lines
1.9 KiB
C
#include "dht10.h"
|
||
|
||
uint16_t dht10_data_temperature; // 温度 100 倍
|
||
uint16_t dht10_data_humidity; // 湿度 100 倍
|
||
|
||
void
|
||
DHT10_Init ()
|
||
{
|
||
DelayUs (1);
|
||
}
|
||
|
||
void
|
||
DHT10_ReadData ()
|
||
{
|
||
uint8_t i;
|
||
|
||
uint8_t buffer[6] = { 0 };
|
||
|
||
uint32_t hum_or_temp_raw;
|
||
|
||
// 发送启动测量命令
|
||
IIC_Start ();
|
||
IIC_SendByte (DHT10_ADDR << 1); // 发送设备地址+写
|
||
// 发送命令字节
|
||
IIC_SendByte (0xAC);
|
||
IIC_SendByte (0x33);
|
||
IIC_SendByte (0x00);
|
||
|
||
IIC_Stop ();
|
||
|
||
// 等待测量完成(DHT10需至少75ms)
|
||
DelayMs (80);
|
||
|
||
// 读取6字节数据
|
||
IIC_Start ();
|
||
IIC_SendByte ((DHT10_ADDR << 1) | 1);
|
||
|
||
for (i = 0; i < 6; i++)
|
||
{
|
||
buffer[i] = IIC_RecvByte ();
|
||
// 前5字节发送Ack,第6字节发送NAck
|
||
if (i < 5)
|
||
IIC_SendAck (1);
|
||
else
|
||
IIC_SendAck (0);
|
||
}
|
||
IIC_Stop ();
|
||
|
||
// 校验和:前5字节之和的低8位
|
||
i = buffer[0] + buffer[1] + buffer[2] + buffer[3] + buffer[4];
|
||
if (i != buffer[5])
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 解析20位湿度数据(buffer[2]高4位为湿度数据)
|
||
hum_or_temp_raw = ((uint32_t)buffer[0] << 12) | ((uint32_t)buffer[1] << 4)
|
||
| (buffer[2] >> 4);
|
||
|
||
// 转换为实际值
|
||
// dht10_data->humidity = (float)hum_raw / 10.0f; // 湿度 实际值
|
||
dht10_data_humidity = (uint16_t)(hum_or_temp_raw * 10.0f); // 湿度 100倍
|
||
|
||
// 解析20位温度数据(buffer[5]高4位为温度数据)
|
||
hum_or_temp_raw = ((uint32_t)buffer[3] << 12) | ((uint32_t)buffer[4] << 4)
|
||
| (buffer[5] >> 4);
|
||
|
||
dht10_data_temperature
|
||
= (uint16_t)(hum_or_temp_raw * 10.0f) - 4000; // 温度 100倍
|
||
// dht10_data->temperature = (float)temp_raw / 10.0f - 40.0f; // 温度
|
||
// 实际值
|
||
|
||
return;
|
||
}
|
||
|
||
uint16_t
|
||
DHT10_GetTemperature ()
|
||
{
|
||
return dht10_data_temperature;
|
||
}
|
||
|
||
uint16_t
|
||
DHT10_GetHumidity ()
|
||
{
|
||
return dht10_data_humidity;
|
||
}
|