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.程式編譯完成之...