【NUCLEO-L476RG开发】DHT11温湿度传感器驱动
DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 的技术参数如下:
工作电压范围: 3.3V-5.5V
工作电流 :平均 0.5mA
输出:单总线数字信号
测量范围:湿度 20~90%RH,温度 0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度 1%,温度 1℃
误差比较大,测量范围较小,也就只能当个玩具了。
DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte( 40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。 DHT11 的数据格式为: 8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。
程序采用mbed开发环境
引脚连接:
DHT11的Dout引脚接Nucleo板子Arduino插座的A0
DHT11读取函数:
int ReadDHT11(void)
{
// IO must be in hi state to start
if(WaitPinHigh(250) == ERROR_TIMEOUT)
{
return ERROR_BUS_BUSY;
}
// start the transfer
pin.output();
pin = 0;
wait_ms(18);
pin = 1;
wait_us(30);
pin.input();
// wait till the sensor grabs the bus
if(WaitPinLow(40) == ERROR_TIMEOUT)
{
return ERROR_NOT_PRESENT;
}
// sensor should signal low 80us and then hi 80us
if(WaitPinHigh(100) == ERROR_TIMEOUT)
{
return ERROR_SYNC_TIMEOUT;
}
if(WaitPinLow(100) == ERROR_TIMEOUT)
{
return ERROR_NO_PATIENCE;
}
int i, bit;
uint8_t buf;
// capture the data(40 bit)
for(i=0; i<5; i++)
{
buf = 0;
for(bit=0; bit<8; bit++)
{
if(WaitPinHigh(75) == ERROR_TIMEOUT)
{
return ERROR_DATA_TIMEOUT;
}
// logic 0 is 28us max, 1 is 70us
wait_us(40);
buf |= pin << (7 - bit);
if(WaitPinLow(50) == ERROR_TIMEOUT)
{
return ERROR_DATA_TIMEOUT;
}
}
}
for(i=0; i<5; i++)
{
printf("buf[%d] = 0x%02x\r\n", i, buf);
}
// valid check
if(buf != buf + buf + buf + buf)
{
return ERROR_CHECKSUM;
}
Temperature = float(buf);
Humidity = float(buf);
return SUCCESS;
}主函数:
int main(void)
{
int ret;
printf("******This is a DHT11 Test******\r\n");
for(;;)
{
ret = ReadDHT11();
if(ret == SUCCESS)
{
printf("Temperature : %4.2f\r\n", Temperature);
printf("Humidity : %4.2f\r\n\r\n", Humidity);
}
else
{
printf("Error : %d\n", ret);
}
wait(5);
}
}
多谢分享, 多谢分享 谢谢,又多了个参考 多谢分享:)
多谢分享:lol:lol:lol 赞一个 :lol:lol:lol:lol
页:
[1]