久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3091|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

樹莓派溫濕度傳感器器件實(shí)驗(yàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
溫濕度傳感器器件介紹
DHT11是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。

溫濕度傳感器模塊溫濕度傳感器器件
引腳說明
VCC    供電3.5V-5.5V DC
DATA 串行數(shù)據(jù),單總線,必須接上拉電阻 5.1K左右,這樣空閑時(shí) DATA總是為高電平
GND   接地,電源負(fù)極
NC     空腳不連接
DHT11的工作原理
DHT11是通過單總線與微處理器通訊,只需要一根線,一次傳送40位數(shù)據(jù),高位先出。
數(shù)據(jù)格式
8bit濕度整數(shù)數(shù)據(jù) + 8bit濕度小數(shù)數(shù)據(jù) +8bit溫度整數(shù)數(shù)據(jù) + 8bit溫度小數(shù)數(shù)據(jù) + 8bit校驗(yàn)位。
校驗(yàn)算法
將濕度、溫度的整數(shù)小數(shù)累加,只保留低8位。MCU與DHT11通信約定:主從結(jié)構(gòu),DHT11為從機(jī),MCU作為主機(jī),只有主機(jī)呼叫從機(jī),從機(jī)才能應(yīng)答。
詳細(xì)流程
MCU發(fā)送起始信號(hào) -> DHT響應(yīng)信號(hào) -> DHT通知MCU準(zhǔn)備接受信號(hào) ->DHT發(fā)送準(zhǔn)備好的數(shù)據(jù) ->DHT結(jié)束信號(hào)-> DHT內(nèi)部重測環(huán)境溫濕度數(shù)據(jù)并記錄數(shù)據(jù)等待下一次MCU的起始信號(hào)。
由流程可知,每一次MCU獲取的數(shù)據(jù)總是DHT上一次采集的數(shù)據(jù),要想得到實(shí)時(shí)的數(shù)據(jù),連續(xù)兩次獲取即可,官方不建議連續(xù)多次讀取DHT,每次讀取的間隔時(shí)間大于5秒就足夠獲取到準(zhǔn)確的數(shù)據(jù),上電時(shí)DHT需要1S的時(shí)間穩(wěn)定。
MCU起始信號(hào)
1、設(shè)置DATA引腳為輸出狀態(tài)并輸出高電平
2、再將DATA輸出為低電平,持續(xù)時(shí)間大于18ms,此時(shí)DHT檢測到后從低功耗模式->高速模式
3、DATA引腳設(shè)置為輸入狀態(tài),由于上拉電阻的關(guān)系,DATA就變?yōu)楦唠娖剑瑥亩瓿梢淮纹鹗夹盘?hào)。

響應(yīng)信號(hào)、準(zhǔn)備信號(hào)
(DHT在MCU DATA引腳輸出低電平時(shí),從低功耗模式轉(zhuǎn)至高速模式,等待DATA引腳變?yōu)楦唠娖剑?br /> 1、DHT輸出 80us低電平 作為應(yīng)答信號(hào)
2、DHT輸出 80us高電平 通知微處理器準(zhǔn)備接受數(shù)據(jù)
3、連續(xù)發(fā)送 40位數(shù)據(jù)(上次采集的數(shù)據(jù))

DHT數(shù)據(jù)信號(hào)
數(shù)據(jù)為“0”格式:50us的低電平 +26-28us的高電平
數(shù)據(jù)為“1”格式:50us的低電平 +70us的高電平


DHT結(jié)束信號(hào)
DHT的DATA引腳輸出40位數(shù)據(jù)后,繼續(xù)輸出低電平50us后轉(zhuǎn)為輸入狀態(tài),由于上拉電阻,DATA隨之變?yōu)楦唠娖健HT內(nèi)部開始重測環(huán)境溫濕度數(shù)據(jù),并記錄數(shù)據(jù),等待外部的起始信號(hào)。

實(shí)驗(yàn)?zāi)康?br /> 利用溫濕度傳感器檢測空間內(nèi)的溫度和濕度,傳感器將數(shù)據(jù)收集到以后傳到RaspberryPi開發(fā)板中,經(jīng)過處理反映在LCD上,在LCD中第一行顯示的是溫度,第二行顯示的濕度。
組件清單
u  面包板*1
u  DHT11傳感器*1
u  串行LCD1602*1
u  導(dǎo)線若干
連接
  

  
IO1(wiringPi)/18(BCM)
        
DATE(OUT)
  
C++部分代碼      
        
#include    <stdio.h>
   
#include    <wiringPi.h>
   
#include    <wiringPiI2C.h>
   
#include    <string.h>
   
#include    <stdlib.h>
   
#include    "LiquidCrystal_I2C.h"
   
#include    "dht11.h"
   
int main()
   
{
   
    char val1[3],val2[3],val3[3],val4[3];
   
    init();
   
    delay(100);
   
wiringPiSetup();
   
  while(1)
   
    {
   
       pinMode(1,OUTPUT); // set mode to output
   
       digitalWrite(1, 1); // output a high level   
   
       delay(100);
   
        if(readSensorData())
   
        {
   
               printf("RH:%d.%d\n",(int)(databuf>>24)&0xff,(int)(databuf>>16)&0xff);
   
               printf("TMP:%d.%d\n",(int)(databuf>>8)&0xff,(int)databuf&0xff);
   
               int2str((int)(databuf>>24)&0xff,val1);
   
               int2str((int)(databuf>>16)&0xff,val2);
   
               int2str((int)(databuf>>8)&0xff,val3);
   
               int2str((int)(databuf)&0xff,val4);
   
               write(0, 0,"RH: ");
   
               write(5, 0,val1);
   
                write(7, 0,".");
   
               write(8, 0,val2);
   
               write(0, 1,"TMP: ");
   
               write(5, 1,val3);
   
   
   
   
                                 


  
           write(7, 1,".");
  
            write(8, 1,val4);
  
            databuf=0;
  
            delay(1000);
  
       }
  
    }   
  
}
  
  
Python部分代碼
  1. import RPi.GPIO as GPIO
  2.   
  3. import time
  4.   
  5. import LCD1602 as LCD
  6.   
  7.   
  8.   
  9. DHTPIN = 18
  10.   
  11. LCD.init_lcd()
  12.   
  13. time.sleep(2)
  14.   
  15. GPIO.setmode(GPIO.BCM)
  16.   
  17.   
  18. MAX_UNCHANGE_COUNT = 100
  19.   
  20.   
  21. STATE_INIT_PULL_DOWN = 1
  22.   
  23. STATE_INIT_PULL_UP = 2
  24.   
  25. STATE_DATA_FIRST_PULL_DOWN = 3
  26.   
  27. STATE_DATA_PULL_UP = 4
  28.   
  29. STATE_DATA_PULL_DOWN = 5
  30.   
  31.   
  32. def read_dht11_dat():
  33.   
  34. GPIO.setup(DHTPIN, GPIO.OUT)
  35.   
  36. GPIO.output(DHTPIN, GPIO.HIGH)
  37.   
  38. time.sleep(0.05)
  39.   
  40. GPIO.output(DHTPIN, GPIO.LOW)
  41.   
  42. time.sleep(0.02)
  43.   
  44. GPIO.setup(DHTPIN, GPIO.IN, GPIO.PUD_UP)
  45.   
  46.   
  47. unchanged_count = 0
  48.   
  49. last = -1
  50.   
  51. data = []
  52.   
  53. while True:
  54.   
  55.   current = GPIO.input(DHTPIN)
  56.   
  57.   data.append(current)
  58.   
  59.   if last != current:
  60.   
  61.     unchanged_count = 0
  62.   
  63.    last = current
  64.   
  65.   else:
  66.   
  67.     unchanged_count += 1
  68.   
  69.    if unchanged_count > MAX_UNCHANGE_COUNT:
  70.   
  71.     break
  72.   
  73.   
  74. state = STATE_INIT_PULL_DOWN
  75.   
  76.   
  77. lengths = []
  78.   
  79. current_length = 0
  80.   
  81.   
  82. for current in data:
  83.   
  84.    current_length += 1
  85.   
  86.   
  87.   if state == STATE_INIT_PULL_DOWN:
  88.   
  89.    if current == GPIO.LOW:
  90.   
  91.     state = STATE_INIT_PULL_UP
  92.   
  93.    else:
  94.   
  95.     continue
  96.   
  97.   if state == STATE_INIT_PULL_UP:
  98.   
  99.    if current == GPIO.HIGH:
  100.   
  101.     state =  STATE_DATA_FIRST_PULL_DOWN
  102.   
  103.    else:
  104.   
  105.     continue
  106.   
  107.   if state ==  STATE_DATA_FIRST_PULL_DOWN:
  108.   
  109.    if current == GPIO.LOW:
  110.   
  111.     state = STATE_DATA_PULL_UP
  112.   
  113.    else:
  114.   
  115.     continue
  116.   
  117.   if state == STATE_DATA_PULL_UP:
  118.   
  119.    if current == GPIO.HIGH:
  120.   
  121.      current_length = 0
  122.   
  123.     state = STATE_DATA_PULL_DOWN
  124.   
  125.    else:
  126.   
  127.     continue
  128.   
  129.   if state == STATE_DATA_PULL_DOWN:
  130.   
  131.    if current == GPIO.LOW:
  132.   
  133.     lengths.append(current_length)
  134.   
  135.     state = STATE_DATA_PULL_UP
  136.   
  137.    else:
  138.   
  139.     continue
  140.   
  141. if len(lengths) != 40:
  142.   
  143.   print ("Data not good,  skip")
  144.   
  145.   return False
  146.   
  147.   
  148. shortest_pull_up = min(lengths)
  149.   
  150. longest_pull_up = max(lengths)
  151.   
  152. halfway = (longest_pull_up + shortest_pull_up) / 2
  153.   
  154. bits = []
  155.   
  156. the_bytes = []
  157.   
  158. byte = 0
  159.   
  160.   
  161. for length in lengths:
  162.   
  163.   bit = 0
  164.   
  165.   if length > halfway:
  166.   
  167.    bit = 1
  168.   
  169.   bits.append(bit)
  170.   
  171. print ("bits: %s, length:  %d"  % (bits, len(bits)))
  172.   
  173. for i in range(0, len(bits)):
  174.   
  175.   byte = byte << 1
  176.   
  177.   if (bits[i]):
  178.   
  179.    byte = byte | 1
  180.   
  181.   else:
  182.   
  183.    byte = byte | 0
  184.   
  185.   if ((i + 1) % 8 == 0):
  186.   
  187.    the_bytes.append(byte)
  188.   
  189.    byte = 0
  190.   
  191. print (the_bytes)
  192.   
  193. checksum = (the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF
  194.   
  195. if the_bytes[4] != checksum:
  196.   
  197.   print ("Data not good,  skip")
  198.   
  199.   return False
  200.   
  201.   
  202. return the_bytes[0], the_bytes[2]
  203.   
  204.   
  205. def main():
  206.   
  207. print ("Raspberry Pi  wiringPi DHT11 Temperature test program\n")
  208.   
  209. while True:
  210.   
  211.   result = read_dht11_dat()
  212.   
  213.   if result:
  214.   
  215.    humidity, temperature = result
  216.   
  217.    print ("humidity: %s  %%,  Temperature: %s C`" % (humidity, temperature))
  218.   
  219.    LCD.print_lcd(0,0,'HUM: ' + str(humidity) + ' %')
  220.   
  221.    LCD.print_lcd(0,1,'TEM: ' + str(temperature) + ' C')
  222.   
  223.   time.sleep(1)
  224.   
  225.   
  226. def destroy():
  227.   
  228. GPIO.cleanup()
  229.   
  230.   
  231. if __name__ == '__main__':
  232.   
  233. try:
  234.   
  235.   main()
  236.   
  237. except  KeyboardInterrupt:
  238.   
  239.   destroy()
復(fù)制代碼

   
實(shí)驗(yàn)結(jié)論
注意事項(xiàng):若LCD燈光太暗,可以通過調(diào)節(jié)LCD背面藍(lán)色的可變電阻(注:接背面的跳線帽)


通過樹莓派GPIO口控制DT11溫濕度傳感器 和 LCD1602 ,了解DT11溫濕度傳感器工作原理和LCD顯示方式。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产毛片久久久久久久久春天 | 在线观看av网站 | 日韩欧美日韩在线 | 国产精品高潮呻吟久久av黑人 | 人人叉 | 国产精品永久久久久久久www | 日本精品视频 | 亚洲狠狠 | 国产成人99久久亚洲综合精品 | 国产一区二区三区久久久久久久久 | 亚洲午夜精品视频 | 国产精品美女久久久久久久久久久 | 亚洲欧美一区二区三区在线 | 国产美女黄色片 | 亚洲免费高清 | 国产欧美一区二区三区在线看 | 国产精品99久久久久久久久久久久 | 亚洲福利网 | h视频在线观看免费 | 久久久美女 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 精品国模一区二区三区欧美 | 99re免费| 国产免费一区二区 | 欧美国产日韩在线 | 国产成人99久久亚洲综合精品 | 国产精品视频免费观看 | 亚洲精品久久久久久国产精华液 | 狠狠操狠狠干 | 久久精品小短片 | 日韩精品久久久久 | 国产91久久久久久 | 国产精品永久久久久 | 亚洲国产网站 | 免费久久久久久 | 狠狠操电影 | 夜夜夜操 | 视频在线亚洲 | 在线免费观看黄色 | 色综合天天综合网国产成人网 | 国产在线精品一区二区 |