文章目錄
- 一.概要
- 二.DHT11主要性能參數
- 三.DHT11溫度傳感器內部框圖
- 四.DTH11模塊原理圖
- 五.DHT11模塊跟單片機板子接線和通訊時序
- 1.單片機跟DHT11模塊連接示意圖
- 2.單片機跟DHT11模塊通訊流程與時序
- 六.STM32單片機DHT11溫度傳感器實驗
- 七.CubeMX工程源代碼下載
- 八.小結
一.概要
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。傳感器內部包括一個電阻式感濕元件和一個NTC測溫元件。
二.DHT11主要性能參數
模塊接口說明:
1.VCC 外接3.3V-5V
2.GND 外接GND
3.DATA 小板開關數字量輸出接口 接單片機IO口
三.DHT11溫度傳感器內部框圖
DHT11內部是由感濕原件、感溫元件和OTP內存直接連接在內部一個8位MCU上,通過DHT11內部的MCU計算得出測量溫度數值。
四.DTH11模塊原理圖
五.DHT11模塊跟單片機板子接線和通訊時序
1.單片機跟DHT11模塊連接示意圖
DATA線是單線雙向通訊
2.單片機跟DHT11模塊通訊流程與時序
MCU發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據。
數據格式為:8bit 濕度整數數據+8bit 濕度小數數據+8bit 溫度整數數據+8bit 溫度小數數據+8bit 校驗和,一共 5 字節(40bit)數據。
校驗和為前面 4 個字節數據累加和,取8bit數據,校驗和的目的是為了保證數據傳輸的可靠準確,如果傳輸的校驗和跟自己計算的校驗和不對,說明傳輸的數據中有錯誤。
MCU與DHT11通訊時序
MCU與DHT11通訊時序再細化,開始準備通訊的時序圖如下
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號.主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
MCU與DHT11通訊時序再細化,數據0信號表示方法
每一bit數據都以50us低電平時序開始,高電平的長短定了數據位是0還是1。
MCU與DHT11通訊時序再細化,數據1信號表示方法
每一bit數據都以50us低電平時序開始,高電平的長短定了數據位是0還是1。
六.STM32單片機DHT11溫度傳感器實驗
硬件準備:
STLINK接STM32F103C8T6小系統板,STLINK接電腦USB口。
板子與OLED用杜邦線連接:
板子G----液晶GND
板子3.3–液晶VCC
板子B10—液晶SCL
板子B11—液晶SDA
用杜邦線把模塊與開發板相連:
板子A0----模塊DATA
板子3.3—模塊VCC
板子G-----模塊GND
打開STM32CubeMX軟件,新建工程
Part Number處輸入STM32F103C8,再雙擊就創建新的工程
配置下載口引腳
配置外部晶振引腳
配置系統主頻
配置PA0為輸出,輸出也可以讀取引腳電平信號,還因為模塊內部有上拉電阻,所以不需要配上拉,在PA0改成輸入引腳配置的時候,程序里做了上拉配置。
配置工程文件名,保存路徑,KEIL5工程輸出方式
生成工程
用Keil5打開工程
添加OLED驅動文件
添加溫濕度傳感器相關代碼
主要代碼
/*** 函數功能: 使DHT11-DATA引腳變為上拉輸入模式* 輸入參數: 無* 返 回 值: 無* 說 明:無*/
static void DHT11_Mode_IPU(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Dout_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11_Dout_PORT, &GPIO_InitStruct);
}/*** 函數功能: 使DHT11-DATA引腳變為推挽輸出模式* 輸入參數: 無* 返 回 值: 無* 說 明:無*/
static void DHT11_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Dout_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11_Dout_PORT, &GPIO_InitStruct);
}/*** 函數功能: 從DHT11讀取一個字節,MSB先行* 輸入參數: 無* 返 回 值: 無* 說 明:無*/
static uint8_t DHT11_ReadByte ( void )
{uint8_t i, temp=0;for(i=0;i<8;i++) { /*每bit以50us低電平標置開始,輪詢直到從機發出 的50us 低電平 結束*/ while(DHT11_Data_IN()==Bit_RESET);/*DHT11 以26~28us的高電平表示“0”,以70us高電平表示“1”,*通過檢測 x us后的電平即可區別這兩個狀 ,x 即下面的延時 */delay_us(40); //延時x us 這個延時需要大于數據0持續的時間即可 if(DHT11_Data_IN()==Bit_SET)/* x us后仍為高電平表示數據“1” */{/* 等待數據1的高電平結束 */while(DHT11_Data_IN()==Bit_SET);temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1,MSB先行 }else // x us后為低電平表示數據“0”{ temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行}}return temp;
}/*** 函數功能: 一次完整的數據傳輸為40bit,高位先出* 輸入參數: DHT11_Data:DHT11數據類型* 返 回 值: ERROR: 讀取出錯* SUCCESS:讀取成功* 說 明:8bit 濕度整數 + 8bit 濕度小數 + 8bit 溫度整數 + 8bit 溫度小數 + 8bit 校驗和 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{ uint8_t temp;uint16_t humi_temp;/*輸出模式*/DHT11_Mode_Out_PP();/*主機拉低*/DHT11_Dout_LOW();/*延時18ms*/HAL_Delay(20);/*總線拉高 主機延時30us*/DHT11_Dout_HIGH(); delay_us(30); //延時30us/*主機設為輸入 判斷從機響應信號*/ DHT11_Mode_IPU();delay_us(30); //延時30us/*判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行*/ if(DHT11_Data_IN()==Bit_RESET) {/*輪詢直到從機發出 的80us 低電平 響應信號結束*/ while(DHT11_Data_IN()==Bit_RESET);/*輪詢直到從機發出的 80us 高電平 標置信號結束*/while(DHT11_Data_IN()==Bit_SET);/*開始接收數據*/ DHT11_Data->humi_high8bit= DHT11_ReadByte();DHT11_Data->humi_low8bit = DHT11_ReadByte();DHT11_Data->temp_high8bit= DHT11_ReadByte();DHT11_Data->temp_low8bit = DHT11_ReadByte();DHT11_Data->check_sum = DHT11_ReadByte();/*讀取結束,引腳改為輸出模式*/DHT11_Mode_Out_PP();/*主機拉高*/DHT11_Dout_HIGH();/* 對數據進行處理 */humi_temp=DHT11_Data->humi_high8bit*100+DHT11_Data->humi_low8bit;DHT11_Data->humidity =(float)humi_temp/100;humi_temp=DHT11_Data->temp_high8bit*100+DHT11_Data->temp_low8bit;DHT11_Data->temperature=(float)humi_temp/100; /*檢查讀取的數據是否正確*/temp = DHT11_Data->humi_high8bit + DHT11_Data->humi_low8bit + DHT11_Data->temp_high8bit+ DHT11_Data->temp_low8bit;if(DHT11_Data->check_sum==temp){ return SUCCESS;}else return ERROR;} elsereturn ERROR;
}int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,72M主頻/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */OLED_Init();//OLED初始化 OLED_Clear();//清屏/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */DHT11_Init(); //DHT11初始化while(1) { if(DHT11_Read_TempAndHumidity(&DHT11_Data))//讀取溫度,濕度{ }OLED_Clear();OLED_ShowCHinese(18,0,0);//光OLED_ShowCHinese(36,0,1);//子OLED_ShowCHinese(54,0,2);//物OLED_ShowCHinese(72,0,3);//聯OLED_ShowCHinese(90,0,4);//網OLED_ShowString(24,3,"DHT11 TEST");OLED_ShowString(0,6,"Tem: "); OLED_ShowNum(30,6,DHT11_Data.temperature,3,16);//顯示溫度 OLED_ShowString(60,6,"Hum: "); OLED_ShowNum(90,6,DHT11_Data.humidity,3,16);//顯示濕度 OLED_ShowString(120,6,"%"); HAL_Delay(1000);//等待1秒} /* USER CODE END 3 */
}
七.CubeMX工程源代碼下載
鏈接:https://pan.baidu.com/s/1A3xZVBXh6eVdUnkTNj0AGQ
提取碼:tezu
如果鏈接失效,可以聯系博主給最新鏈接
程序下載下來之后解壓就行
八.小結
在嵌入式開發中,溫濕度傳感器是一種十分常用的傳感器,可以用于天氣預報、智能家居、智慧大屏等等。