【1】DHT11傳感器
DHT11是一種數字溫濕度傳感器,能夠通過數字信號輸出當前環境的溫度和濕度值。DHT11可以通過一條數據信號線連接到微控制器或其他外設,從而實現溫濕度的實時測量和數據讀取。
DHT11采用單總線通信協議,只需要連接一個數字信號線和兩個電源線,即可實現傳感器的數據讀取。傳感器本身具有一定的溫度和濕度校準能力,因此輸出的數據比較可靠。
DHT11傳感器的測量范圍為0~50°C的溫度和20%~90%的相對濕度,測量精度為±2°C和±5%RH。
【2】通信協議
DHT11采用單總線通信協議,使用一條數據信號線來傳輸數據,其中包括起始信號、數據位和校驗位。通信協議如下:
- 主機發送一個開始信號給DHT11,即將數據信號線拉低至少18ms以上。
- 主機發出啟動信號之后,拉低數據線至少80us,在這個過程中,DHT11將會檢測到主機發送的啟動信號,并做出回應。
- DHT11響應主機發出的啟動信號后,會拉高數據信號線至少80us,表示傳輸數據前的“準備工作”已經完成。
-
DHT11開始向主機發送數據,每個數據包包含40個位,高位先傳輸。在數據傳輸的過程中,DHT11會將數據信號線從低電平轉換為高電平,表示1的開始,持續時間26
28us,然后將數據線拉低,表示0的開始,持續時間70us。 - 在發送完40位數據后,DHT11會發送一個校驗位。校驗位的計算方法是將前四個字節數據相加,求出一個8位校驗碼,將此校驗碼與第五個字節進行比較,如果相等,則數據傳輸成功,否則需要重傳數據。
- 主機接收到數據后,需要將數據信號線拉高,以結束傳輸。
【3】讀取DHT11溫濕度數據
以下是一個讀取DHT11傳感器的溫度和濕度示例代碼:
Copy Code#include "stm32f10x.h"
#include "dht11.h"
?
#define DHT11_GPIO_PORT GPIOB
#define DHT11_GPIO_PIN GPIO_Pin_12
?
void delay_us(uint32_t us)
{
us *= (SystemCoreClock / 1000000) / 5;
while (--us);
}
?
void dht11_start(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
?
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
?
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
?
/* 發送開始信號 */
GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN);
delay_us(18000);
?
GPIO_SetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN);
delay_us(40);
?
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
?
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
}
?
uint16_t dht11_read_bit(void)
{
uint16_t retry = 0;
?
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET) {
retry++;
if (retry > 1000) {
return 0;
}
delay_us(1);
}
?
retry = 0;
?
while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == SET) {
retry++;
if (retry > 1000) {
return 0;
}
delay_us(1);
}
?
if (retry < 30) {
? ? ? ? ?return 0;
? ? } else {
? ? ? ? ?return 1;
? ? }
?}
??
?uint8_t dht11_read_byte(void)
?{
? ? ?uint8_t i;
? ? ?uint8_t data = 0;
??
? ? ?for (i = 0; i < 8; i++) {
? ? ? ? ?data <<= 1;
? ? ? ? ?if (dht11_read_bit()) {
? ? ? ? ? ? ?data |= 0x01;
? ? ? ? }
? ? }
??
? ? ?return data;
?}
??
?uint8_t dht11_read_data(dht11_data_t *data)
?{
? ? ?uint8_t i;
? ? ?uint8_t buf[5];
? ? ?uint8_t checksum = 0;
??
? ? ?dht11_start();
??
? ? ?if (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET) {
? ? ? ? ?/* 等待DHT11響應 */
? ? ? ? ?while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET);
??
? ? ? ? ?/* 等待DHT11發射數據 */
? ? ? ? ?while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == SET);
??
? ? ? ? ?/* 接收數據 */
? ? ? ? ?for (i = 0; i < 5; i++) {
? ? ? ? ? ? ?buf[i] = dht11_read_byte();
? ? ? ? }
??
? ? ? ? ?/* 校驗和 */
? ? ? ? ?checksum = buf[0] + buf[1] + buf[2] + buf[3];
??
? ? ? ? ?if (checksum == buf[4]) {
? ? ? ? ? ? ?data->humidity = buf[0];
data->temperature = buf[2];
return 1;
}
}
?
return 0;
}
?
int main(void)
{
dht11_data_t data;
?
GPIO_InitTypeDef GPIO_InitStruct;
?
/* 使能GPIOB時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
?
/* 配置DHT11引腳為輸入模式 */
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
?
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
?
while (1) {
if (dht11_read_data(&data)) {
printf("Temperature: %d°C Humidity: %d%%n", data.temperature, data.humidity);
} else {
printf("Error reading data from DHT11.n");
}
delay_us(2000000);
}
}
在這個示例代碼中,首先定義了一個dht11_data_t
結構體,用于保存讀取的溫度和濕度數據。然后,編寫了一些函數來執行DHT11讀取操作。
delay_us()
函數是一個簡單的延遲函數,用于等待一定量的時間。需要精確地計算一個微秒的延遲,并在循環中使用該延遲來等待一段時間。
dht11_start()
函數用于發送DHT11的開始信號。將DHT11引腳配置為輸出模式,并發送18毫秒的低電平信號,然后再發送40微秒的高電平信號。
dht11_read_bit()
函數用于讀取DHT11傳輸的數據位。等待DHT11輸出信號的變化,并根據變化的時間來判斷數據位的值。如果一個數據位的響應時間小于30微秒,則被判定為0,否則為1。
dht11_read_byte()
函數用于讀取一個字節的數據(8個數據位)。通過調用dht11_read_bit()
函數8次來讀取每個數據位,并將結果組合成一個字節。
dht11_read_data()
函數用于讀取整個DHT11數據包,包括溫度、濕度和校驗和。首先調用dht11_start()
函數發送開始信號,然后等待DHT11發送數據。使用dht11_read_byte()
函數讀取5個字節的數據,并驗證校驗和以確保數據完整和正確。
最后,在main()
函數中,初始化GPIO口和DHT11傳感器,并執行一個循環來讀取數據。如果讀取成功,則將溫度和濕度打印到串口終端上,否則輸出錯誤信息。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2560文章
52158瀏覽量
761430 -
單片機
+關注
關注
6057文章
44813瀏覽量
644354 -
通信協議
+關注
關注
28文章
971瀏覽量
40835 -
STM32
+關注
關注
2282文章
10986瀏覽量
361118 -
DHT11
+關注
關注
19文章
277瀏覽量
58133
發布評論請先 登錄
相關推薦
【正點原子STM32H7R3開發套件試用體驗】DS18B20、DHT11溫濕度采集
LORA無線溫濕度監測系統
dht11溫濕度傳感器工作原理介紹
Arduino Nano 和 NodeMCU ESP8266 讀取 DHT11 環境溫濕度數據及 OLED顯示

評論