您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)樹莓派如何使用DHT11溫濕度傳感器,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一、相關(guān)介紹
DHT11介紹:
DHT11是一款比較便宜的溫濕度傳感器模塊。讀取數(shù)據(jù)只需要占用一個(gè)IO口。能夠同時(shí)測(cè)量溫度和相對(duì)濕度。
需要注意的是,文檔中寫明一句話:小數(shù)部分用于擴(kuò)展,現(xiàn)只能讀出0。所以小數(shù)部分目前永遠(yuǎn)是0!
樹莓派IO口介紹
我使用的是B版樹莓派,接口如下圖。其中的NAME一列是樹莓派實(shí)際的IO口功能。PIN#一列是后面要介紹的wiringpi和pi4j庫(kù)文件編程使用的接口編號(hào)。
wiringpi介紹
wiringpi是通過C語(yǔ)言控制樹莓派GPIO口的頭文件。在C語(yǔ)言中包含這個(gè)頭文件之后可以很簡(jiǎn)單的調(diào)用已經(jīng)封裝好的方法來控制樹莓派GPIO口。程序需要先安裝。
wiringpi官網(wǎng):http://wiringpi.com/
wiringpi下載和安裝:http://wiringpi.com/download-and-install/
wiringpi文檔:http://wiringpi.com/reference/
編譯和運(yùn)行:
寫好C文件后,通過如下命令進(jìn)行編譯:
gcc -Wall -o executefilename cfilename.c -lwiringPigcc是編譯器,-Wall是在編譯時(shí)顯示警告信息,-o executefilename cfilename.c是將cfilename.c文件編譯成文件名為executefilename的可執(zhí)行文件,-lwiringPi是將wiringPi頭文件包含在可執(zhí)行文件中。
編譯完之后會(huì)生成文件名為executefilename的文件,使用root權(quán)限執(zhí)行如下命令即可運(yùn)行:
sudo ./executefilename
pi4j介紹
pi4j是基于wiringpi開發(fā)的通過java來控制樹莓派GPIO口的庫(kù)文件。在java程序中引入相關(guān)類就可以使用已經(jīng)封裝好的方法控制樹莓派GPIO口。
pi4j官網(wǎng):http://pi4j.com/
pi4j下載:http://pi4j.com/download.html
pi4j安裝:http://pi4j.com/install.html
pi4j文檔:http://pi4j.com/apidocs/index.html
編譯和運(yùn)行:
使用了pi4j后,編譯.java文件和運(yùn)行.class文件時(shí),需要使用root權(quán)限。例如:
編譯:
sudo javac -classpath .:classes:/opt/pi4j/lib/'*' YourJavaFile.java運(yùn)行:
sudo java -classpath .:classes:/opt/pi4j/lib/'*' YourClassFile.class如果使用sudo編譯和運(yùn)行時(shí)提示找不到j(luò)avac和java,這是由于root用戶沒有加載環(huán)境變量,所以找不到j(luò)ava的執(zhí)行命令??梢允褂萌缦旅钋袚Q到帶有環(huán)境變量的root用戶后,再執(zhí)行編譯和運(yùn)行:
sudo su - root
二、硬件連接
由于本人較懶,而且目前是新手狀態(tài)使用ubuntu,不知道用什么軟件來做圖,所以用文字簡(jiǎn)單描述一下硬件的連接。
DHT11引腳有格子空的為正面,引腳朝下,從左數(shù)4個(gè)引腳分別為
DHT11引腳名稱 DHT11引腳功能 連接到樹莓派的GPIO 1.VCC 正極,連接3.3V或5V 物理接口1,即3.3V 2.DATA 數(shù)據(jù)輸入輸出 物理接口7,即GPIO 7 3.NC 懸空(就是不連任何地方) 不連 4.GND 負(fù)極 物理接口 6,即GND 此外按照DHT11數(shù)據(jù)手冊(cè)要求,我在DATA和VCC之間連接了一個(gè)4.7K歐姆的電阻,起到上拉作用。
三、軟件編寫
使用wiringpi編寫C程序:
如下程序借鑒了網(wǎng)上一老外的程序,忘了原帖地址在哪。
#include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAX_TIME 85 #define DHT11PIN 7 #define ATTEMPTS 5 //retry 5 times when no response int dht11_val[5]={0,0,0,0,0}; int dht11_read_val(){ uint8_t lststate=HIGH; //last state uint8_t counter=0; uint8_t j=0,i; for(i=0;i<5;i++) dht11_val[i]=0; //host send start signal pinMode(DHT11PIN,OUTPUT); //set pin to output digitalWrite(DHT11PIN,LOW); //set to low at least 18ms delay(18); digitalWrite(DHT11PIN,HIGH); //set to high 20-40us delayMicroseconds(40); //start recieve dht response pinMode(DHT11PIN,INPUT); //set pin to input for(i=0;i<MAX_TIME;i++) { counter=0; while(digitalRead(DHT11PIN)==lststate){ //read pin state to see if dht responsed. if dht always high for 255 + 1 times, break this while circle counter++; delayMicroseconds(1); if(counter==255) break; } lststate=digitalRead(DHT11PIN); //read current state and store as last state. if(counter==255) //if dht always high for 255 + 1 times, break this for circle break; // top 3 transistions are ignored, maybe aim to wait for dht finish response signal if((i>=4)&&(i%2==0)){ dht11_val[j/8]<<=1; //write 1 bit to 0 by moving left (auto add 0) if(counter>16) //long mean 1 dht11_val[j/8]|=1; //write 1 bit to 1 j++; } } // verify checksum and print the verified data if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){ printf("RH:%d,TEMP:%d\n",dht11_val[0],dht11_val[2]); return 1; } else return 0; } int main(void){ int attempts=ATTEMPTS; if(wiringPiSetup()==-1) exit(1); while(attempts){ //you have 5 times to retry int success = dht11_read_val(); //get result including printing out if (success) { //if get result, quit program; if not, retry 5 times then quit break; } attempts--; delay(2500); } return 0; }上述程序保存為.c文件后編譯成可執(zhí)行文件,運(yùn)行后會(huì)在屏幕打印溫度和濕度。
程序中的數(shù)據(jù)接收處理部分細(xì)節(jié)如下:
if((i>=4)&&(i%2==0)){ //前3次分別是:1低電平,2高電平(即響應(yīng)信號(hào)),3低電平(即數(shù)據(jù)第一個(gè)低電平) //i%2==0 是因?yàn)槊看味际茄h(huán)讀取低電平和高電平,每次要循環(huán)2次才讀出一個(gè)bit處理 dht11_val[j/8]<<=1; //讀到后,j/8可以限制一個(gè)數(shù)的8個(gè)位,左移1位自動(dòng)補(bǔ)0,相當(dāng)于讀出0 if(counter>16) //counter計(jì)數(shù)如果超過16,則高電平長(zhǎng),應(yīng)讀1. dht11_val[j/8]|=1; //故再將上面數(shù)與1位或,使最后一位變成1 j++; //j++8個(gè)換成下一個(gè)數(shù)據(jù) }if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){ //這其中(dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF)是將5個(gè)數(shù)相加,和1與。 //目的是防止讀出數(shù)據(jù)都為0,和為0,0和1與后得0,所以if判斷條件不成立,返回讀取失敗碼。 //如果讀出數(shù)據(jù)是不為0的正常數(shù)據(jù),和1與后還得原數(shù)。
使用pi4j編寫java程序:
在使用pi4j編寫DHT11要求的時(shí)序時(shí),始終收不到DHT11回應(yīng)信號(hào),個(gè)人感覺是java達(dá)不到DHT11要求的微秒級(jí)時(shí)序,所以java程序沒有成功。
關(guān)于“樹莓派如何使用DHT11溫濕度傳感器”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。