<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DHT11 :: 标签 :: yafeng 的博客</title>
    <link>https://yafengabc.github.io/tags/dht11/index.html</link>
    <description></description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 19 Sep 2026 16:30:07 +0800</lastBuildDate>
    <atom:link href="https://yafengabc.github.io/tags/dht11/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（四）实战DHT11解码</title>
      <link>https://yafengabc.github.io/cnblogs/p5100741/index.html</link>
      <pubDate>Tue, 05 Jan 2016 00:12:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5100741/index.html</guid>
      <description>DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH， 温度+-2℃，量程湿度20-90%RH， 温度0~50℃。&#xA;我买的封装好的模块，上边自带了上拉电阻，直接查到树莓派上即可灰、紫、蓝分别代表数据、3.3V、0V,接到树莓派的3，1，10脚，分别对应PIN8，3.3V，0V。&#xA;DHT11与单片机通讯协议为单线协议（1-wire），其实单线协议蛮厉害的，一个GPIO就能实现数据的读取，但是这个协议没有同步脉冲，所以对时序要求比较高，比如DHT11对高低电平定义如下：&#xA;低电平50us，然后一个26-28us的高电平，代表0&#xA;低电平50us，然后一个70us的高电平，代表1&#xA;也就是说，需要能分辨出40us以下的时间才能准确的测出，下边看看具体的时序：&#xA;总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。&#xA;数字0表示如下图：&#xA;数字1表示如下图：&#xA;可以看出，每一位包括一开始的响应信号，都是由一个低电平跟一个高电平组成，其中响应信号为80us+80us=160us&#xA;数字0为50+26=76us&#xA;数字1为50+70=120us&#xA;为读到DHT11的状态，我编写了以下的程序：&#xA;import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 tl=[] #存放每个数据位的时间 gpio.wiringPiSetup() #初始化wiringpi库 gpio.pinMode(owpin,1) #设置针脚为输出状态 gpio.digitalWrite(owpin,1) #输出高电平 gpio.delay(1) ###发开始指令，要求DHT11传输数据 gpio.digitalWrite(owpin,0) #拉低25ms开始指令 gpio.delay(25) gpio.digitalWrite(owpin,1) #输出高电平，开始指令结束 gpio.pinMode(owpin,0) #设针脚为输入状态 ###开始指令发送完毕，把管脚设置为高电平，并等待DHT11拉低管脚。传输数据 while(gpio.digitalRead(owpin)==1): pass #如果管脚一直是1，则一直等待。 ###若被拉低，说明传输开始，应答信号+40位数据+结束标志共42位 ###下边共循环45次，故意多循环几次看结果。 for i in range(45): #测试每个数据周期的时间（包括40bit数据加一个发送开始标志 tc=gpio.micros() #记下当前us数（从初始化开始算起，必要时重新初始化） &#39;&#39;&#39; 一个数据周期，包括一个低电平，一个高电平，从DHT11第一次拉低信号线开始 到DHT11发送最后一个50us的低电平结束（然后被拉高，一直维持高电平，所以 最后的完成标志是一直为高，超过500ms） &#39;&#39;&#39; while(gpio.digitalRead(owpin)==0):pass #一位数据由一个低电平 while(gpio.digitalRead(owpin)==1): #加一个高电平组成 if gpio.micros()-tc&gt;500: #如果超过500us就结束了本次循环,传输结束后 break #会被上拉电阻拉成高电平，防止进入死循环 tl.append(gpio.micros()-tc) #记录每个周期时间的us数，存到tl这个列表 print(tl) #打印结果 程序里有详细的解释，我就不再赘述，这里贴出我这里的执行结果：</description>
    </item>
    <item>
      <title>树莓派读取DHT11传感器的源代码</title>
      <link>https://yafengabc.github.io/cnblogs/p5096184/index.html</link>
      <pubDate>Sun, 03 Jan 2016 13:27:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5096184/index.html</guid>
      <description>import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 def getval(owpin): tl=[] #存放每个数据位的时间 tb=[] #存放数据位 gpio.wiringPiSetup() #初始化wiringpi库 gpio.pinMode(owpin,1) #设置针脚为输出状态 gpio.digitalWrite(owpin,1) #输出高电平 gpio.delay(1) gpio.digitalWrite(owpin,0) #拉低20ms开始指令 gpio.delay(25) gpio.digitalWrite(owpin,1) #抬高20-40us gpio.delayMicroseconds(20) gpio.pinMode(owpin,0) #设针脚为输入状态 while(gpio.digitalRead(owpin)==1): pass #等待DHT11拉低管脚 for i in range(45): #测试每个数据周期的时间（包括40bit数据加一个发送开始标志 tc=gpio.micros() #记下当前us数（从初始化开始算起，必要时重新初始化） &#39;&#39;&#39; 一个数据周期，包括一个低电平，一个高电平，从DHT11第一次拉低信号线开始 到DHT11发送最后一个50us的低电平结束（然后被拉高，一直维持高电平，所以 最后的完成标志是一直为高，超过500ms） &#39;&#39;&#39; while(gpio.digitalRead(owpin)==0):pass while(gpio.digitalRead(owpin)==1): if gpio.micros()-tc&gt;500: #如果超过500ms就结束了 break if gpio.micros()-tc&gt;500: #跳出整个循环 break tl.append(gpio.micros()-tc) #记录每个周期时间的us数，存到tl这个列表 # print(tl) #反注释后可打印时间列表 tl=tl[1:] #去掉第一项，剩下40个数据位 for i in tl: if i&gt;100: #若数据位为1，时间为50us低电平+70us高电平=120us tb.append(1) else: tb.append(0) #若数据位为0，时间为50us低电平+25us高电平=75us #这里取大于100us就为1 # print(tb) #反注释可查看每一位状态 return tb def GetResult(owpin): for i in range(10): SH=0;SL=0;TH=0;TL=0;C=0 result=getval(owpin) # print(len(result)) if len(result)==40: for i in range(8): #计算每一位的状态，每个字8位，以此为湿度整数，湿度小数，温度整数，温度小数，校验和 SH*=2;SH+=result[i] SL*=2;SL+=result[i+8] TH*=2;TH+=result[i+16] TL*=2;TL+=result[i+24] C*=2;C+=result[i+32] if ((SH+SL+TH+TL)%256)==C and C!=0: break else: print(&#34;Read Sucess,But checksum error! retrying&#34;) else: print(&#34;Read failer! Retrying&#34;) gpio.delay(200) return SH,SL,TH,TL SH,SL,TH,TL=GetResult(owpin) print(&#34;湿度:&#34;,SH,SL,&#34;温度:&#34;,TH,TL)</description>
    </item>
  </channel>
</rss>