學習ESP8266 13 DHT11讀取溫濕度

2021-10-11 11:43:18 字數 3473 閱讀 8390

dht11是乙個檢測溫濕度的模組,將溫濕度感測器獲取的訊號傳給內部8位的微控制器,微控制器進行處理,得到數字的溫濕度資料。

dht11與外部通訊方式是單匯流排。

主機是esp8266,從機是dht11。

很容易理解的過程:

esp8266:在麼?

dht11:我在。

dht11:現在的溫度是26℃,濕度是70%,完畢!

空閒電平:單匯流排通常要求外接乙個約 4.7kω 的上拉電阻,這樣,當匯流排閒置時,其狀態為高電平。

1)esp8266輸出低電平,且低電平保持時間18~30ms,典型值為20ms,程式中取25ms。

dht11_out(0

);//esp8266輸出低電平

dht11_delay_ms(25

);//範圍18~30ms,典型值為20ms

2)esp8266的io設為輸入,等待dht11輸出低電平的到來,最多等待100us,超時則認為通訊失敗。

dht11_in()

;while

(gpio_input_get

(gpio_id_pin(5)))

3)有低電平到來之後,計算低電平的時間,範圍在78~88us,典型值是83us的低電平,故超過90us可認為低電平時間過長了。

0)4)能執行到這裡,單匯流排上已經是高電平了,高電平持續範圍80~92us,可取60us之後,再讀取一次匯流排狀態,確認是否仍然為高電平。

os_delay_us(60

);//等待60us再檢測是否為高電平,確認一次if(

gpio_input_get

(gpio_id_pin(5

))==0

)return start_err;

else

return dht_ok;

}

3.2.1、 資料格式

8bit檢驗位是前4位元組資料的和校驗

3.2.2、讀取一位資料

位資料「0」的格式為: 54us(50~58us)的低電平和 23-27us的高電平;

位資料「1」的格式為: 54us(50~58us)的低電平加 68-74us的高電平。

1)首先要等待低電平的到來,超過50us認為讀取出錯。

2)有低電平了,要計時低電平的時間,根據手冊超過58us認為出錯,程式中稍稍延長,取62us.

3)此時進入高電平的階段,如果是23-27us的高電平認為是0,如果是68~74us的高電平認為是1,所以要跳過0的高電平時間,但又處於1的高電平期間,檢測47us時(27和68的中間值)的匯流排狀態,為0則0,為1則1。

//讀一位資料

u8 icache_flash_attr dht11_read_bit

(void

) retry =0;

while

(gpio_input_get

(gpio_id_pin(5

))==0

)os_delay_us(47

);// 跳過"0"的高電平時序,取27和68的中間值if(

gpio_input_get

(gpio_id_pin(5

))) data =1;

else

data =0;

return data;

}

3.2.3、讀取乙個位元組

注意,資料在匯流排上傳輸是高位在前,也就是說先接收到的位是最高位。

//讀dht11傳回來的乙個位元組

u8 icache_flash_attr dht11_read_byte

(void

)return data;

}

3.2.4、讀取40位資料(5個位元組)

迴圈5次讀取位元組就ok了,把資料放在陣列裡存著。

for

(i=0

;i<

5;i++

)//讀取原始的5個位元組

dht11_data_array[i]

=dht11_read_byte()

;

dht11會輸出54us的低電平,然後釋放匯流排(拉高)。

下面這一段**就是等待低電平,並計算低電平的時間是否過長。

while

(gpio_input_get

(gpio_id_pin(5

)))//計數低電平的時間

retry =0;

while

(gpio_input_get

(gpio_id_pin(5

))==0

)

和校驗,就是把前4個位元組加起來,看看是不是第5個位元組的內容。

if

(dht11_data_array[4]

!= dht11_data_array[0]

+dht11_data_array[1]

+dht11_data_array[2]

+dht11_data_array[3]

)return check_err;

//返回校驗錯誤

當溫度為負時,溫度小數部分的最高位會置1,所以可以據此來判斷溫度的正負並修正零下時的溫度資料。

dht11_data_array[5]用來存放溫度的正負,溫度為正為0,溫度為負為1.

dht11_data_array[3]是溫度的小數部分,溫度為負時把最高位去除。

if

(dht11_data_array[3]

&0x80

)else

//列印濕度

os_printf

("humi:%d.%drh\r\n"

,dht11_data_array[0]

,dht11_data_array[1]

);//列印溫度

os_printf

("temp:%d.%d℃\r\n"

,dht11_data_array[2]

,dht11_data_array[3]

);

ESP8266 SDK 2 0 學習記錄1

下面從第乙個例子開始 列印hello world 我的sdk目錄是f vm share esp8266 rtos sdk 2.0.0 用vscode開啟sdk目錄,在sdk目錄下新建helloworld資料夾,複製sdk目錄下的include和examples smart config目錄下的檔案到...

ESP8266學習歷程 1 GPIO配置

soc晶元之上的韌體,以及基於esp 12模組的硬體。使用esp8266的gpio最起碼得包含相關引腳的標頭檔案吧 1 include driver gpio.h gpio的初始化設定與stm32提供的標準庫大同小異,都是通過乙個結構體來進行配置,如下 123 4567 typedef struct...

ESP32 WROOM 32D學習記錄 1

今天在做esp32 idf中的blink實驗時,出現了程式燒錄後,串列埠無響應,同時配置的gpio沒有輸出高低電平。實驗器材 esp32 devkitc v4。開發軟體 eclipse msys32 串列埠助手。實驗結果 串列埠列印資訊,配置的gpio迴圈輸出高低電平,週期為2秒。1.程式編譯完成之...