匿名
未登录
登录
丢石头百科
搜索
查看“实验九:DHT11温湿度传感器实验”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
实验九:DHT11温湿度传感器实验
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
*[[Basic Experiment Kits For Arduino]] *[[Basic Experiment Kits For Raspberry Pi]] == 数据结构 == DHT11数字温湿度传感器采用单总线数据格式,即单个数据引脚端口完成输入输出双向传输。一次通讯时间大约为4ms左右,一次完整的数据包是由5Byte(40Bit)组成。其中数据分小数部分和整数部分,按照高位在前,低位在后的传输顺序。具体格式如下: :'''数据格式为:8bit湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和''' 其中由于DHT11分辨率只能精确到个位,所以小数部分是数据全为0。校验和为前4个字节数据相加,校验的目的是为了保证数据传输的准确性。 另因为传感器输出的数据是未编码的二进制数据,因此在进行数据处理时,温度、湿度、整数、小数部分应分开处理。 例如:当某次传感器传出的40bit数据为 [[File:DHT11 Temperature And Humidity Sensor_数据结构.png|800px]] 由上述数值可以得出: 湿度 = byte1.byte2 = 00111101.00000000 = 61.0%RH 温度 = byte3.byte4 = 00011110.00000000 = 30.0℃ 校验和 = 01011011 = byte1+byte2+byte3+byte4+byte5 = 00111101+00000000+00011110+00000000(取相加结果的末8位,若相等,则校验正确) === 控制时序 === *DHT11采用单总线协议与单片机通信,主机发送一次复位信号后,DHT11从低功耗模式转换到高速模式,等待主机复位结束后,DHT11发送响应信号,并拉高总线准备传输数据,用户可选择读取部分数据。DHT11只有在接收到复位信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11不主动进行温湿度采集。当数据采集完毕且无开始信号后,DHT11自动切换到低速模式。 *整个通讯过程可分为一下几步: :1、DHT11初始化—触发DHT11采集数据 :*主机发送复位信号 :*DHT11发送响应信号 :2、DHT11发送采集数据 ==== DHT11初始化 ==== :[[File:DHT11 Temperature And Humidity Sensor_初始化.jpg|600px]] * '''主机发送复位信号''' **总线空闲状态为高电平,主机将总线拉低等待DHT11响应,拉低时间必须大于18ms,保证DHT11能检测到复位信号。 **主机在发送复位信号结束后,将总线拉高或切换为输入模式,延时时间为20~40us,此时复位信号发送完毕,主机等待接收DHT11的响应信号。 * '''DHT11发送响应信号''' **DHT11检测到复位信号后,触发一次采样,并拉低总线80us表示响应信号,告诉主机数据已经准备好了。 **DHT11发送80us响应信号后会拉高总线80us,之后开始传输数据。 ==== 数据传输 ==== DHT11在拉高总线80us后开始传输数据。每1bit数据都以50us低电平时隙开始,告诉主机开始传输一位数据了。以高电平的长短定义数据位是0还是1,如果检测到响应信号为高电平,则DHT11初始化失败,请检查线路是否连接正常。当最后1bit数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。 *数据‘0’时序 **当DHT11发送50us低电平时隙过后拉高总线,高电平持续26~28us,则表示数据“0”。 :[[File:DHT11 Temperature And Humidity Sensor_控制时序0.jpg|600px]] *数据‘1’时序 **当DHT11发送50us低电平时隙过后拉高总线,高电平持续70us,则表示数据“1”。 :[[File:DHT11 Temperature And Humidity Sensor_控制时序1.jpg|600px]] ==== 总时序 ==== :[[File:DHT11 Temperature And Humidity Sensor_总时序.jpg|800px]] *主机把总线拉低大于18ms,保证DHT11能检测到起始信号; *主机发送复位信号结束后,将总线拉高或改为输入模式,延时等待20-40us后,读取DHT11的响应信号; *主机检测到总线被拉低时(DHT11发送的起始信号),每隔1us计数一次,直至总线拉高,计算低电平时间是否为80us。若读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常; *主机检测总线被拉高后,重新计数检测高电平时间,如果检测到响应信号之后的高电平时间为80us,则准备开始接收数据。 *主机接收的每一bit数据都是以50us低电平时隙开始的,高电平的长短定了数据位是0还是1。 *当主机接收完最后一bit数据后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 *'''注意:''' **实际上DHT11的响应时间并不是标准的80us,往往存在误差,当响应时间处于 20~100us 之间时就可以认定响应成功。 **由于 DHT11 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断,操作完毕后再打开总中断。 **DHT11只有在接收到复位信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11不主动进行温湿度采集。 === 0/1时序区分 === *DHT11发送数据数据“0”和数据‘1’主要是通过高电平的时间区分的,数据‘0’的高电平持续 26~28us,数据“1”的高电平持续70us,每一位数据前都有50us的起始时隙。 *如果取一个中间值40us来区分数据“0”和数据“1”。当数据位之前的50us低电平时隙过后,总线会被拉高,此时延时40us后检测总线状态,如果为高,说明此时处于70us的时隙,则数据为“1”;如果为低,说明此时处于下一位数据50us的开始时隙,那么上一位数据肯定是“0”。 *由于误差的原因,数据“0”时隙并不是准确26~28us,可能比这短,也可能比这长。当数据“0”时隙大于26~28us时,如果延时太短,无法判断当前处于数据“0”的时隙还是数据“1”的时隙;如果延时太长,则会错过下一位数据前的开始时隙,导致检测不到后面的数据。 == Arduino == === 实验现象 === * 串口输出DHT11传感器的测量数据 === 电路连接 === *[[File:实验九:温湿度传感器实验.png|400px]] === 主要程序 === <pre> #include <Arduino.h> #include "DHT11.h" DHT11 myDHT11(2); void setup() //Arduino程序初始化程序放在这里,只在开机时候运行一次 { Serial.begin(9600); //设置通讯的波特率为9600 Serial.println("Welcome to use!"); //发送的内容 Serial.println("I love DIUSTOU"); //发送的内容 } void loop() //Arduino程序的主程序部分,循环运行内部程序 { myDHT11.DHT11_Read(); //读取温湿度值 Serial.print("HUMI = "); Serial.print(myDHT11.HUMI_Buffer_Int); Serial.println(" %RH"); Serial.print("TMEP = "); Serial.print(myDHT11.TEM_Buffer_Int); Serial.println(" C"); delay(1000); //延时1s } </pre> == 树莓派 == === 电路连接 === *[[File:实验九:温湿度传感器实验_接线1.png|400px]] === 程序运行 === ==== Python ==== * 安装gpiozero库 **可以使下面命令来安装该库 <pre> sudo apt update sudo apt install python3-gpiozero </pre> :*其它树莓派上的系统可以使下面命令来安装该库: <pre> sudo pip3 install gpiozero </pre> :*运行以下语句可以查看树莓派GPIO口定义 <pre> pinout </pre> * 安装adafruit-circuitpython-dht库 <pre> sudo pip3 install adafruit-circuitpython-dht sudo apt-get install libgpiod2 </pre> *下载树莓派参考例程,将文件解压后拷贝放在用户名目录下,运行 <pre> cd raspberrypi/9/python_gpiozero python sensor.py </pre> *此时可看见树莓派在正确运行DHT11程序,打印检测到的温度和湿度值。若想退出,按ctrl+C即可 *更多指令请查看[https://gpiozero.readthedocs.io/en/latest/installing.html gpiozero文档] == 例程下载 == *[[:File:Basic Experiment Kits For Arduino.zip|Arduino例程]] * [[:File:Basic Experiment Kits For Raspberry Pi.zip|树莓派5例程 python]] == 相关例程 == {{Arduino and Raspberry Pi Case}}
该页面使用的模板:
模板:Arduino and Raspberry Pi Case
(
查看源代码
)
模板:Study
(
查看源代码
)
返回至
实验九:DHT11温湿度传感器实验
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志