零基礎STM32單片機編程入門(十五) DHT11溫濕度傳感器模塊實戰含源碼

文章目錄

    • 一.概要
    • 二.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
如果鏈接失效,可以聯系博主給最新鏈接
程序下載下來之后解壓就行

八.小結

在嵌入式開發中,溫濕度傳感器是一種十分常用的傳感器,可以用于天氣預報、智能家居、智慧大屏等等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46415.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

App Inventor 2 天氣預報App開發 - 第三方API接入的通用方法(2)

本文來自AppInventor2中文網&#xff08;www.fun123.cn&#xff09;參考文檔&#xff0c;調用第三方天氣接口獲取天氣JSON數據&#xff0c;解析并展示在App上。 App效果圖&#xff0c;展示未來7日的天氣預報&#xff0c;包括日期、天氣圖示和溫度&#xff1a; App原理介紹 通…

Linux/Windows 系統分區

1. Windows 系統 1.1 系統分區 系統分區也叫做磁盤分區&#xff0c;即分盤&#xff1b; 舉個例子&#xff0c;好比家里有一個大柜子&#xff0c;把衣服&#xff0c;鞋子&#xff0c;襪子都放在里面&#xff0c;由于沒有隔斷&#xff0c;找的時候非常麻煩&#xff0c;找是能找…

C++ Primer:3.2 標準庫類型string

其他章節&#xff1a;C Primer 學習心得 標準庫類型string表示可變長的字符序列&#xff0c;使用string類型必須首先頭文件&#xff0c;string定義在命名空間std中 #include <string> using std::string定義和初始化string對象 初始化類的對象是由類本身決定的&#x…

借力Jersey,鑄就卓越RESTful API體驗

目錄 maven 創建 jersey 項目 運行 支持返回 json 數據對象 1. 引言 在當今數字化時代&#xff0c;API&#xff08;應用程序編程接口&#xff09;已成為連接不同軟件系統和服務的橋梁。RESTful API以其簡潔、輕量級和易于理解的特點&#xff0c;成為了API設計的首選標準。本…

Hive函數之-posexplode()

1、概念描述&#xff1a; posexplode() 是一個內建函數&#xff0c;用于處理數組數據&#xff0c;并將數組的每個元素及其索引&#xff08;位置&#xff09;轉換為兩列的表格式數據。posexplode() 函數對于處理需要元素位置信息的數組特別有用。pos就是postion的縮寫&#xff…

Windows雙網卡上網原理以及配置方法

目錄 1. 背景 2. IP路由原理 3. windows雙網卡上網解決方案 3.1. 基礎配置解決方案 3.2. 高階配置解決方案 1. 背景 在windwos上使用多網卡在工作和生活中是一個常見的操作&#xff0c;比如為了獲取內部消息將有線連接到內部局域網中&#xff0c;為而了訪問外網又將電腦的…

華為云GaussDB部署指南:主備架構的常見問題與解決方案

文章目錄 華為云GaussDB部署指南&#xff1a;主備架構的常見問題與解決方案背景介紹部署步驟1.修改主機名2.軟件安裝檢查3.禁用交換內存4.創建數據目錄并掛載5.配置NTP時鐘同步6.添加資源限制參數7.修改網卡的MTU8.上傳安裝工具包9.編輯集群配置文件10.修改集群安裝模板11.安裝…

木舟0基礎學習Java的第二十天(線程,實現,匿名有名,休眠,守護,加入,設計,計時器,通信)

多線程 并發執行的技術 并發和并行 并發&#xff1a;同一時間 有多個指令 在單個CPU上 交替執行 并行&#xff1a;同一時間 有多個指令 在多個CPU上 執行 進程和線程 進程&#xff1a;獨立運行 任何進程 都可以同其他進程一起 并發執行 線程&#xff1a;是進程中的單個順…

【.NET全棧】ASP.NET開發Web應用——站點導航技術

文章目錄 前言一、站點地圖1、定義站點地圖文件2、使用SiteMapPath控件3、SiteMap類4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以編程的方式添加節點3、使用TreeView控件導航4、綁定到XML文件5、按需加載節點6、帶復選框的TreeView控件 三、Menu控件1、使用Menu控…

Hutool-Guava

目錄 一、Guava 二、Hutool 三、區別與聯系 四、使用場景 五、Guava工具類 1.集合工具類 2.字符串工具類 3.并發工具類 六、Hutool 1.字符串工具類 2.文件工具類 Hutool 和 Guava 都是 Java 開發中非常實用的工具庫&#xff0c;它們提供了許多方便的工具類和方法&am…

字節抖音電商 后端開發崗位 一面

筆者整理答案&#xff0c;以供參考 自我介紹 項目&#xff08;20分鐘&#xff09; RocketMQ延時消息的底層實現 回答&#xff1a; 延時消息的實現主要依賴于RocketMQ中的定時任務機制。消息被發送到Broker時&#xff0c;會先存儲在一個特定的延時消息隊列中。Broker會定時掃…

c++ extern 關鍵字

C中的extern關鍵字和跨語言互操作 變量的聲明與定義 extern關鍵字用于聲明在另一個翻譯單元&#xff08;文件&#xff09;中定義的變量或函數。通過extern關鍵字&#xff0c;可以在多個文件中訪問全局變量或函數。 變量聲明示例 文件&#xff1a;main.cpp #include <io…

chatglm2-6b-prompt嘗試

參考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通過prompt來實現zero-shot/fewshot的自然語言處理任務 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…

再議擴散模型

目錄 一、基礎知識 1、數學期望 2、概率表示 3、KL散度 二、擴散過程 三、理想的去噪過程 四、真實的去噪過程 五、噪聲生成 導言 筆者早些時候曾粗略看過擴散模型的流程&#xff0c;但對于底層算法&#xff08;尤其是概率論方面&#xff09;&#xff0c;理解不夠透徹…

pytorch學習(五)tensorboard使用

1. 創建環境 首先創建一個環境: conda create -n pytorch conda activate pytorch 然后安裝tensorboard pip install tensorboard 安裝opencv pip install opencv-python 2. 簡單的案例 標量和圖像的顯示&#xff1a; 2.1標量實現的方法是add_scalar,第一個參數是給顯…

探索Puppeteer的強大功能:抓取隱藏內容

背景/引言 在現代網頁設計中&#xff0c;動態內容和隱藏元素的使用越來越普遍&#xff0c;這些內容往往只有在特定的用戶交互或條件下才會顯示出來。為了有效地獲取這些隱藏內容&#xff0c;傳統的靜態爬蟲技術往往力不從心。Puppeteer&#xff0c;作為一個強大的無頭瀏覽器工…

印尼語翻譯通:AI驅動的智能翻譯與語言學習助手

在這個多元文化交織的世界中&#xff0c;語言是連接我們的橋梁。印尼語翻譯通&#xff0c;一款專為打破語言障礙而生的智能翻譯軟件&#xff0c;讓您與印尼語的世界輕松接軌。無論是商務出差、學術研究&#xff0c;還是探索印尼豐富的文化遺產&#xff0c;印尼語翻譯通都是您的…

代碼隨想錄算法訓練營第三十六天|1049. 最后一塊石頭的重量 II 、 494. 目標和 、 474.一和零

1049. 最后一塊石頭的重量 II 分成兩堆石頭&#xff0c;一堆石頭的總重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在計算target的時候&#xff0c;target sum / 2 因為是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目錄 .NET C# 使用 iText 生成PDF1 安裝 iText 7 庫&#xff1a;2 變量定義3 創建一個PDF4 段落5 旋轉文本6 代碼塊7 外部鏈接8 內部鏈接9 表格10 注釋11 線條12 二維碼13 嵌入圖像14 列表15 設置背景16 頁眉17 頁腳18 事件19 水印20 分欄21 源…

老古董Lisp(1):粗魯先生Lisp再出發

粗魯先生Lisp再出發 開始的原因 目標和夢想是最近考慮的一個問題。什么是目標&#xff1f;什么是夢想&#xff1f;夢想可以激勵改變&#xff0c;目標才能實現改變。 開始這個部分的時候&#xff0c;我的夢想是什么&#xff1f;我的目標是什么&#xff1f;我想要什么&#xf…