DHT11溫濕度傳感器詳解(stm32)
01
—
傳感器介紹
DHT11是一款含有已校準數字信號輸出的溫濕度復合傳感器,采用了自主研發的集成式數字溫濕度元件,應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。DHT11傳感器內包含一個溫濕度測量元件和一個高性能MCU。

以下是DHT11溫濕度傳感器的參數:
|
供電電壓 |
DC:3.3-5.5V |
|
工作范圍(溫度) |
-20~+60℃ |
|
量程范圍(濕度) |
5~95%RH |
|
溫度精度 |
±2℃ |
|
濕度精度 |
±5%RH |
|
重復性 |
溫度:±1℃ ;濕度:±1%RH |
|
遲滯(溫度) |
±0.3℃ |
|
遲滯(濕度) |
±0.3%RH |
02
—
傳感器原理
1.原理圖

單總線上必須有一個上拉電阻(R1)以實現單總線閑置時,其處于高電平狀態。
2.工作時序

3.工作原理:起始信號與響應信號

4.工作原理:讀數據時序

5.工作原理:DHT11數據格式
34H + 01H + 18H + 8CH = D9H
濕度高8位(整數)為34H,低8位(小數)為01H,將兩部分數值轉換為十進制后可以得出52.1,即濕度為52.1%RH。同理可以得出溫度為-24.12℃。此處溫度為負值時因為溫度數據的低8位的最高位Bit7為1;當最高位Bit7為0時,數值為正值。
03
—
程序設計
1. main.c文件
/*****************畢業設計******************STM32* 項目 : 1.DHT11溫度濕度傳感器實驗* 版本 : V1.0* 日期 : 2024.8.4* MCU : STM32F103C8T6* 接口 : 參看DHT11.h**********************BEGIN***********************/u8 temp;u8 humi;int main(void){SystemInit();//配置系統時鐘為72Mdelay_init(72);LED_Init();LED_On();USART1_Config();//串口初始化OLED_Init();printf("Start \n");delay_ms(1000);while(DHT11_Init()){printf("DHT11 Error \r\n");delay_ms(1000);}//顯示“溫度:”OLED_ShowChinese(1,1, 0);OLED_ShowChinese(1,2, 1);OLED_ShowChar(1, 5, ':');OLED_ShowChar(1, 9, 'C');//顯示“濕度:”OLED_ShowChinese(2,1, 2);OLED_ShowChinese(2,2, 1);OLED_ShowChar(2, 5, ':');OLED_ShowChar(2, 9, '%');while (1){DHT11_Read_Data(&temp,&humi);//printf("temp %d ,humi %d\r\n",temp,humi);LED_Toggle();delay_ms(1000);//顯示溫度數據OLED_ShowNum(1,6,temp,2);//顯示濕度數據OLED_ShowNum(2,6,humi,2);}}
2. dht11.h文件
##/*****************畢業設計******************STM32* 文件 : DHT11溫度濕度傳感器h文件* 版本 : V1.0* 日期 : 2024.8.4* MCU : STM32F103C8T6* 接口 : 見代碼**********************BEGIN***********************/***************根據自己需求更改****************///DHT11引腳宏定義###/*********************END**********************///輸出狀態定義##//控制DHT11引腳輸出高低電平##u8 DHT11_Init(void);//初始化DHT11u8 DHT11_Read_Data(u8 *temp,u8 *humi);//讀取溫濕度數據u8 DHT11_Read_Byte(void);//讀取一個字節的數據u8 DHT11_Read_Bit(void);//讀取一位的數據void DHT11_Mode(u8 mode);//DHT11引腳輸出模式控制u8 DHT11_Check(void);//檢測DHT11void DHT11_Rst(void);//復位DHT11
3. dht11.c文件
/*****************畢業設計******************STM32* 文件 : DHT11溫度濕度傳感器c文件* 版本 : V1.0* 日期 : 2024.8.4* MCU : STM32F103C8T6* 接口 : 見dht11.h文件**********************BEGIN***********************///復位DHT11void DHT11_Rst(void){DHT11_Mode(OUT); //SET OUTPUTDHT11_Low; //拉低DQdelay_ms(20); //主機拉低18~30msDHT11_High; //DQ=1delay_us(13); //主機拉高10~35us}//等待DHT11的回應//返回1:未檢測到DHT11的存在//返回0:存在u8 DHT11_Check(void){u8 retry=0;DHT11_Mode(IN);//SET INPUTwhile (GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry<100)//DHT11會拉低40~80us{retry++;delay_us(1);};if(retry>=100)return 1;else retry=0;while (!GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry<100)//DHT11拉低后會再次拉高40~80us{retry++;delay_us(1);};if(retry>=100)return 1;return 0;}//從DHT11讀取一個位//返回值:1/0u8 DHT11_Read_Bit(void){u8 retry=0;while(GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry<100)//等待變為低電平{retry++;delay_us(1);}retry=0;while(!GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry<100)//等待變高電平{retry++;delay_us(1);}delay_us(40);//等待40usif(GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN))return 1;else return 0;}//從DHT11讀取一個字節//返回值:讀到的數據u8 DHT11_Read_Byte(void){u8 i,dat;dat=0;for (i=0;i<8;i++){dat<<=1;dat|=DHT11_Read_Bit();}return dat;}//從DHT11讀取一次數據//temp:溫度值(范圍:0~50°)//humi:濕度值(范圍:20%~90%)//返回值:0,正常;1,讀取失敗u8 DHT11_Read_Data(u8 *temp,u8 *humi){u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//讀取40位數據{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=buf[0];*temp=buf[2];}}else return 1;return 0;}//初始化DHT11的IO口 DQ 同時檢測DHT11的存在//返回1:不存在//返回0:存在u8 DHT11_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK, ENABLE); //使能PA端口時鐘GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN; //PG11端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure); //初始化IO口GPIO_SetBits(DHT11_GPIO_PORT,DHT11_GPIO_PIN); //PG11 輸出高DHT11_Rst(); //復位DHT11return DHT11_Check();//等待DHT11的回應}void DHT11_Mode(u8 mode){GPIO_InitTypeDef GPIO_InitStructure;if(mode){GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;}else{GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;}GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);}
04
—
實驗演示

本文來自博客園,作者:jefften,轉載請注明原文鏈接:http://www.rzrgm.cn/jefften/p/18612745

浙公網安備 33010602011771號