樹莓派使用DHT11溫濕度感測器(C語言程式)

2022-09-16 08:12:11 字數 4218 閱讀 5789

pi4j是基於wiringpi開發的通過j**a來控制樹莓派gpio口的庫檔案。在j**a程式中引入相關類就可以使用已經封裝好的方法控制樹莓派gpio口。

pi4j官網:

pi4j安裝:install.html

pi4j文件:apidocs/index.html

編譯和執行:

使用了pi4j後,編譯.j**a檔案和執行.class檔案時,需要使用root許可權。例如:

編譯:1

sudoj**ac -classpath .:classes:/opt/pi4j/lib/'*'yourj**afile.j**a

執行:1

sudoj**a -classpath .:classes:/opt/pi4j/lib/'*'yourclassfile.class

如果使用sudo編譯和執行時提示找不到j**ac和j**a,這是由於root使用者沒有載入環境變數,所以找不到j**a的執行命令。可以使用如下命令切換到帶有環境變數的root使用者後,再執行編譯和執行:

1

sudosu- root

二、硬體連線

由於本人較懶,而且目前是新手狀態使用ubuntu,不知道用什麼軟體來做圖,所以用文字簡單描述一下硬體的連線。

dht11引腳有格仔空的為正面,引腳朝下,從左數4個引腳分別為

dht11引腳名稱

dht11引腳功能

連線到樹莓派的gpio

1.vcc

正極,連線3.3v或5v

物理介面1,即3.3v

2.data

資料輸入輸出

物理介面7,即gpio 7

3.nc

懸空(就是不連任何地方)

不連4.gnd

負極物理介面 6,即gnd

此外按照dht11資料手冊要求,我在data和vcc之間連線了乙個4.7k歐姆的電阻,起到上拉作用。

三、軟體編寫

使用wiringpi編寫c程式:

01

#include

02

#include

03

#include

04

#include

05

#define max_time 85

06

#define dht11pin 7

07

#define attempts 5                 //retry 5 times when no response

08

intdht11_val[5]=;

09

10

intdht11_read_val()

35

lststate=digitalread(dht11pin);//read current state and store as last state.

36

if(counter==255)//if dht always high for 255 + 1 times, break this for circle

37

break;

38

// top 3 transistions are ignored, maybe aim to wait for dht finish response signal

39

if((i>=4)&&(i%2==0))

45

}

46

// verify checksum and print the verified data

47

if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xff)))

51

else

52

return0;

53

}

54

55

intmain(void)

64

attempts--;

65

delay(2500);

66

}

67

return0;

68

}

上述程式儲存為.c檔案後編譯成可執行檔案,執行後會在螢幕列印溫度和濕度。 

程式中的資料接收處理部分細節如下:

1

if((i>=4)&&(i%2==0))

1

if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xff))){

2

3

//這其中(dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xff)是將5個數相加,和1與。

4

//目的是防止讀出資料都為0,和為0,0和1與後得0,所以if判斷條件不成立,返回讀取失敗碼。

5

//如果讀出資料是不為0的正常資料,和1與後還得原數。

使用pi4j編寫j**a程式:

在使用pi4j編寫dht11要求的時序時,始終收不到dht11回應訊號,個人感覺是j**a達不到dht11要求的微秒級時序,所以j**a程式沒有成功。如果有哪位大神成功用j**a寫出dht11程式,希望能賜教一下。

**:

樹莓派連線DHT11溫濕度感測器(python)

vcc接5v或者3.3v data接gpio 我接的是bcm的16號針腳,物理針腳是36 gnd接gnd codesyntax lang python usr bin python import rpi.gpio as gpio import time channel 16 引腳號16 data 溫...

樹莓派連線DHT11溫濕度感測器(python)

vcc接5v或者3.3v data接gpio 我接的是bcm的16號針腳,物理針腳是36 gnd接gnd codesyntax lang python python view plain copy usr bin python import rpi.gpio as gpio import time ...

DHT11溫濕度感測器

原理圖 資料傳輸 使用序列介面 單線雙向 data 用於微處理器與 dht11之間的通訊和同步,採用單匯流排資料格式,一次 通訊時間4ms左右,資料分小數部分和整數部分,具體格式在下面說明,當前小數 部分用於以後擴充套件,現讀出為零.操作流程如下 一次完整的資料傳輸為40bit,高位先出。資料格式 ...