欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
樹莓派溫濕度傳感器器件實驗
[打印本頁]
作者:
無狀態
時間:
2020-7-16 11:51
標題:
樹莓派溫濕度傳感器器件實驗
溫濕度傳感器器件介紹
DHT11是一款含有已校準數字信號輸出的溫濕度復合傳感器,它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。
溫濕度傳感器模塊溫濕度傳感器器件
引腳說明
VCC 供電3.5V-5.5V DC
DATA 串行數據,單總線,必須接上拉電阻 5.1K左右,這樣空閑時 DATA總是為高電平
GND 接地,電源負極
NC 空腳不連接
DHT11的工作原理
DHT11是通過單總線與微處理器通訊,只需要一根線,一次傳送40位數據,高位先出。
數據格式
8bit濕度整數數據 + 8bit濕度小數數據 +8bit溫度整數數據 + 8bit溫度小數數據 + 8bit校驗位。
校驗算法
將濕度、溫度的整數小數累加,只保留低8位。MCU與DHT11通信約定:主從結構,DHT11為從機,MCU作為主機,只有主機呼叫從機,從機才能應答。
詳細流程
MCU發送起始信號 -> DHT響應信號 -> DHT通知MCU準備接受信號 ->DHT發送準備好的數據 ->DHT結束信號-> DHT內部重測環境溫濕度數據并記錄數據等待下一次MCU的起始信號。
由流程可知,每一次MCU獲取的數據總是DHT上一次采集的數據,要想得到實時的數據,連續兩次獲取即可,官方不建議連續多次讀取DHT,每次讀取的間隔時間大于5秒就足夠獲取到準確的數據,上電時DHT需要1S的時間穩定。
MCU起始信號
1、設置DATA引腳為輸出狀態并輸出高電平
2、再將DATA輸出為低電平,持續時間大于18ms,此時DHT檢測到后從低功耗模式->高速模式
3、DATA引腳設置為輸入狀態,由于上拉電阻的關系,DATA就變為高電平,從而完成一次起始信號。
響應信號、準備信號
(DHT在MCU DATA引腳輸出低電平時,從低功耗模式轉至高速模式,等待DATA引腳變為高電平)
1、DHT輸出 80us低電平 作為應答信號
2、DHT輸出 80us高電平 通知微處理器準備接受數據
3、連續發送 40位數據(上次采集的數據)
DHT數據信號
數據為“0”格式:50us的低電平 +26-28us的高電平
數據為“1”格式:50us的低電平 +70us的高電平
DHT結束信號
DHT的DATA引腳輸出40位數據后,繼續輸出低電平50us后轉為輸入狀態,由于上拉電阻,DATA隨之變為高電平。DHT內部開始重測環境溫濕度數據,并記錄數據,等待外部的起始信號。
實驗目的
利用溫濕度傳感器檢測空間內的溫度和濕度,傳感器將數據收集到以后傳到RaspberryPi開發板中,經過處理反映在LCD上,在LCD中第一行顯示的是溫度,第二行顯示的濕度。
組件清單
u 面包板*1
u DHT11傳感器*1
u 串行LCD1602*1
u 導線若干
連接
51hei.png
(4.62 KB, 下載次數: 63)
下載附件
2020-7-21 02:21 上傳
51hei.png
(5.93 KB, 下載次數: 56)
下載附件
2020-7-21 02:21 上傳
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部分代碼
import RPi.GPIO as GPIO
import time
import LCD1602 as LCD
DHTPIN = 18
LCD.init_lcd()
time.sleep(2)
GPIO.setmode(GPIO.BCM)
MAX_UNCHANGE_COUNT = 100
STATE_INIT_PULL_DOWN = 1
STATE_INIT_PULL_UP = 2
STATE_DATA_FIRST_PULL_DOWN = 3
STATE_DATA_PULL_UP = 4
STATE_DATA_PULL_DOWN = 5
def read_dht11_dat():
GPIO.setup(DHTPIN, GPIO.OUT)
GPIO.output(DHTPIN, GPIO.HIGH)
time.sleep(0.05)
GPIO.output(DHTPIN, GPIO.LOW)
time.sleep(0.02)
GPIO.setup(DHTPIN, GPIO.IN, GPIO.PUD_UP)
unchanged_count = 0
last = -1
data = []
while True:
current = GPIO.input(DHTPIN)
data.append(current)
if last != current:
unchanged_count = 0
last = current
else:
unchanged_count += 1
if unchanged_count > MAX_UNCHANGE_COUNT:
break
state = STATE_INIT_PULL_DOWN
lengths = []
current_length = 0
for current in data:
current_length += 1
if state == STATE_INIT_PULL_DOWN:
if current == GPIO.LOW:
state = STATE_INIT_PULL_UP
else:
continue
if state == STATE_INIT_PULL_UP:
if current == GPIO.HIGH:
state = STATE_DATA_FIRST_PULL_DOWN
else:
continue
if state == STATE_DATA_FIRST_PULL_DOWN:
if current == GPIO.LOW:
state = STATE_DATA_PULL_UP
else:
continue
if state == STATE_DATA_PULL_UP:
if current == GPIO.HIGH:
current_length = 0
state = STATE_DATA_PULL_DOWN
else:
continue
if state == STATE_DATA_PULL_DOWN:
if current == GPIO.LOW:
lengths.append(current_length)
state = STATE_DATA_PULL_UP
else:
continue
if len(lengths) != 40:
print ("Data not good, skip")
return False
shortest_pull_up = min(lengths)
longest_pull_up = max(lengths)
halfway = (longest_pull_up + shortest_pull_up) / 2
bits = []
the_bytes = []
byte = 0
for length in lengths:
bit = 0
if length > halfway:
bit = 1
bits.append(bit)
print ("bits: %s, length: %d" % (bits, len(bits)))
for i in range(0, len(bits)):
byte = byte << 1
if (bits[i]):
byte = byte | 1
else:
byte = byte | 0
if ((i + 1) % 8 == 0):
the_bytes.append(byte)
byte = 0
print (the_bytes)
checksum = (the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF
if the_bytes[4] != checksum:
print ("Data not good, skip")
return False
return the_bytes[0], the_bytes[2]
def main():
print ("Raspberry Pi wiringPi DHT11 Temperature test program\n")
while True:
result = read_dht11_dat()
if result:
humidity, temperature = result
print ("humidity: %s %%, Temperature: %s C`" % (humidity, temperature))
LCD.print_lcd(0,0,'HUM: ' + str(humidity) + ' %')
LCD.print_lcd(0,1,'TEM: ' + str(temperature) + ' C')
time.sleep(1)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
destroy()
復制代碼
實驗結論
注意事項:若LCD燈光太暗,可以通過調節LCD背面藍色的可變電阻(注:接背面的跳線帽)
通過樹莓派GPIO口控制DT11溫濕度傳感器 和 LCD1602 ,了解DT11溫濕度傳感器工作原理和LCD顯示方式。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1