(13)树莓派B+ 读取DHT11温度湿度模块的数值

本文介绍了如何使用树莓派B+读取DHT11温度湿度模块的数据。通过理解DHT11的时序信号,包括开始握手阶段和数据发送阶段,以及详细解析数据位的读取过程。使用RPi.GPIO库编写Python代码实现与DHT11的交互,计算湿度和温度值,并讨论了在没有上拉电阻时的工作情况和可能的误差问题。
摘要由CSDN通过智能技术生成
温度湿度模块看起来简单,只有三个引脚(实际4个接口),但仔细一想,3个引脚分别作为VCC、GND、DATA用处的话,因为传给树莓派GPIO的只有高电平、低电平,那么怎么来读取整型的温度数字和湿度数字呢?这么一想,并不简单!反而是因为引脚少,它需要高低变化的时序信号来表达数值,还有一些其它信号如开始信号等等。看样子这次我们得先深入了解一下DHT11模块了。
0. 先来看模块结构和特性

如上图,三根引脚分别是:“+”对应VCC 3.3V或者5V,中间OUT为DATA接GPIO口,“-”对应电源负极。

1. DHT11模块时序信号
百度一下就能搜到中文版的说明书,传送门:http://wenku.baidu.com/link?url=TZ8UkMmHxmwWfMUlThThtYJpEx1-um21yejWpvB_XSAog3TIr2AStTXNPTYb0FhJ_mgsWI0_KUf-LAAU4t6_aBELQBLL8NPSh315A1Bztw7
我们需要掌握两个关键的时序信号:开始握手阶段和数据发送阶段。
1)开始握手阶段


主机端GPIO发送开始信号首先拉低至少18ms,然后拉高20-40us,模式变为IN等待信号输入。
DHT11等待主机端开始信号(低电平)结束后,发送80us低电平响应开始信号。然后DHT11拉高电平80us。握手完毕。
2)数据发送阶段

一次的湿度和温度数据,DHT11需要发送40bits(0、1)数据,每一位数据之前都以50us低电平开始ÿ
要在树莓派上使用C语言读取DHT11湿度传感器的值,可以通过GPIO接口进行读取。下面是一个示例程序: ```c #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAX_TIMINGS 85 #define DHT_PIN 7 int data[5] = { 0, 0, 0, 0, 0 }; void read_dht_data() { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0; data[0] = data[1] = data[2] = data[3] = data[4] = 0; pinMode(DHT_PIN, OUTPUT); digitalWrite(DHT_PIN, LOW); delay(18); digitalWrite(DHT_PIN, HIGH); delayMicroseconds(40); pinMode(DHT_PIN, INPUT); for (uint8_t i = 0; i < MAX_TIMINGS; i++) { counter = 0; while (digitalRead(DHT_PIN) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) { break; } } laststate = digitalRead(DHT_PIN); if (counter == 255) break; if ((i >= 4) && (i % 2 == 0)) { data[j / 8] <<= 1; if (counter > 16) data[j / 8] |= 1; j++; } } } int main(void) { if (wiringPiSetup() == -1) exit(1); while (1) { read_dht_data(); printf("Humidity = %d.%d %% Temperature = %d.%d *C \n", data[0], data[1], data[2], data[3]); delay(2000); } return 0; } ``` 在上面的代码中,我们使用了wiringPi库来访问GPIO口。它提供了一组用于读写GPIO的函数,以及其他一些实用的功能。在代码中,我们首先定义了一些常量和变量,然后定义了一个read_dht_data()函数来读取DHT11传感器的数据。在函数中,我们先发送一个18ms的低电平信号,然后再发送一个40us的高电平信号。接着转换GPIO口为输入模式,开始读取数据。我们使用循环来读取每个位的值,最后将温度湿度的值存储在data数组中。最后,在主函数中,我们不断调用read_dht_data()函数来读取传感器数据,并打印出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值