DTH11測量溫濕度學習(第十一天)

在這里插入圖片描述


👨?💻個人主頁:@開發者-削好皮的Pineapple!

👨?💻 hello 歡迎 點贊👍 收藏? 留言📝 加關注?!

👨?💻 本文由 削好皮的Pineapple! 原創

👨?💻 收錄于專欄:C語言到基于STM32 的智能礦探小車


請添加圖片描述

請添加圖片描述

文章目錄

    • ?前言?
    • 🎶一、DHT11模塊硬件連接
    • 🎶二、DHT11模塊工作原理及數據格式
      • 1. 工作原理
      • 2. 數據傳輸時序
        • (1)整體時序
        • (2)響應與數據準備階段
        • (3)數據位表示方法
      • 3. 數據格式
    • 🎶三、DHT11獲取溫濕度代碼實現
      • 1. 頭文件(dht11.h)
      • 2. 源文件(dht11.c)
        • 結束語🥇


?前言?

在嵌入式開發中,溫濕度檢測是許多項目的基礎功能,DHT11模塊因其操作簡便、成本較低等特點,常被用于溫濕度數據的采集。本文將圍繞基于STM32的DHT11模塊溫濕度檢測展開介紹,幫助開發者了解相關硬件連接、工作原理、數據格式及代碼實現。


🎶一、DHT11模塊硬件連接


DHT11模塊與開發板的連接較為簡單,具體接線方式如下:

  • vcc(+) --------- 3v3 / 5v:模塊電源引腳,可連接開發板的3.3V或5V電源
  • GND(-) --------- GND:模塊接地引腳,連接開發板的GND
  • DAT(out) ------- GPIO引腳上:模塊數據輸出引腳,開發板上自帶的DHT11模塊的DATA接在PG9上

通過以上連接,可實現DHT11模塊與開發板之間的通信,為后續的數據采集做好硬件準備。有關更詳細的硬件參數等信息,可參考手冊《DHT11說明書最新版.pdf》。

在這里插入圖片描述


🎶二、DHT11模塊工作原理及數據格式


1. 工作原理

總線空閑狀態為高電平,當主機需要獲取溫濕度數據時,會把總線拉低,且拉低時間必須大于18毫秒,以保證DHT11能檢測到起始信號。
DHT11接收到主機的開始信號后,會等待主機開始信號結束,然后發送80us低電平響應信號。
主機發送開始信號結束后,延時等待20-40us,之后就可以讀取DHT11的響應信號。主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可,此時總線由上拉電阻拉高。

2. 數據傳輸時序

(1)整體時序

一次完整的數據傳輸包含起始信號、響應信號及數據傳輸階段,時序圖如下:
在這里插入圖片描述

總線空閑狀態為高電平,主機拉低總線>18ms發送起始信號;DHT11收到后,先發送80us低電平響應,再拉高80us準備發送數據。

(2)響應與數據準備階段

在這里插入圖片描述

  • 總線為低電平時,說明DHT11發送響應信號;
  • 響應后總線拉高80us,進入數據發送準備階段;
  • 每一bit數據以50us低電平時隙開始,高電平持續時間決定數據位是0還是1;
  • 若讀取響應信號為高電平,說明DHT11無響應,需檢查線路;
  • 最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
(3)數據位表示方法
  • 數字0信號:低電平50us后,高電平持續26-28us,時序圖如下:
    在這里插入圖片描述

  • 數字1信號:低電平50us后,高電平持續70us,時序圖如下:
    在這里插入圖片描述

3. 數據格式

一次完整的數據傳輸為40bit,高位先出,格式為:
8bit濕度整數數據 + 8bit濕度小數數據 + 8bit溫度整數數據 + 8bit溫度小數數據 + 8bit校驗和

  • 校驗和 = 濕度整數 + 濕度小數 + 溫度整數 + 溫度小數
  • 通過校驗和可驗證數據傳輸的正確性。

🎶三、DHT11獲取溫濕度代碼實現


1. 頭文件(dht11.h)

#ifndef __DHT11_H_
#define __DHT11_H_//dht11初始化接口
void dht11_init(void);extern unsigned char  dht11_data[5];
void dht11_read_data(void);#endif

2. 源文件(dht11.c)

#include "stm32f4xx.h"
#include "dht11.h"
#include "delay.h"//DHT11的data引腳接在PG9上
#define DHT11_RCC RCC_AHB1Periph_GPIOG
#define DHT11_PORT GPIOG
#define DHT11_PIN GPIO_Pin_9 //GPIO引腳模式切換
//m=1:輸出模式;m=0:輸入模式
void gpio_mode_changed(int m)
{//使能時鐘RCC_AHB1PeriphClockCmd(DHT11_RCC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;if(m) //輸出模式配置{GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = DHT11_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;}else //輸入模式配置{GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Pin = DHT11_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;}GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}//dht11初始化接口
void dht11_init(void)
{gpio_mode_changed(1) ; //初始化為輸出模式GPIO_SetBits(DHT11_PORT, DHT11_PIN); //DATA引腳默認拉高
}//dht11發送起始信號
void dht11_start(void)
{gpio_mode_changed(1); //配置為輸出模式GPIO_ResetBits(DHT11_PORT, DHT11_PIN); //拉低總線>18msdelay_ms(18);GPIO_SetBits(DHT11_PORT, DHT11_PIN); //釋放總線delay_us(30); //等待20-40usgpio_mode_changed(0); //切換為輸入模式//等待DHT11響應while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);//等待響應結束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET);//等待數據發送開始while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);
}//讀取一個字節數據
unsigned char dht11_read_byte(void)
{gpio_mode_changed(0); //配置為輸入模式unsigned char d = 0; //存儲讀取到的字節for(int i = 0; i < 8; i++){//等待50us低電平時隙結束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == RESET);//延時35us:區分0和1(0的高電平≤28us,1的高電平≈70us)delay_us(35);//若仍為高電平,則為1if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET){d |= (1 << (7 - i)); //高位先存}//等待當前bit的高電平結束while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == SET);}return d;
}//讀取溫濕度數據
unsigned char dht11_data[5] = {0}; //存儲:濕度整+濕小小+溫度整+溫度小+校驗和
void dht11_read_data(void)
{dht11_start(); //發送起始信號//讀取40bit數據(5個字節)for(int i = 0; i < 5; i++){dht11_data[i] = dht11_read_byte();}
}
結束語🥇

🔥 訂閱專欄持續學習:C語言到基于STM32的智能礦探小車
💬 歡迎點贊、收藏、留言討論,一起攻克嵌入式開發!

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

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

相關文章

Go語言初識--標識符 可見性

Go語言初識–標識符 可見性 和C語言相似&#xff0c;go語言的基本組成有&#xff1a; 包聲明&#xff0c;編寫源文件時&#xff0c;必須在非注釋的第一行指明這個文件屬于哪個包&#xff0c;如package main。引入包&#xff0c;其實就是告訴Go 編譯器這個程序需要使用的包&…

Python實例之畫小豬佩奇

效果圖&#xff1a;python代碼以及解釋&#xff0c;沒有運用模塊。 """ 繪制小豬佩奇 """ from turtle import *def nose(x,y):"""畫鼻子"""penup()# 將海龜移動到指定的坐標goto(x,y)pendown()# 設置海龜的方向&…

Unity筆記——事件中心

事件中心是什么事件中心是 Unity 游戲開發中常用的架構設計&#xff0c;它基于觀察者模式 或 發布-訂閱模式&#xff0c;通過委托和事件構建的一種消息管理系統。主要用于降低代碼耦合度&#xff0c;實現模塊間的松耦合通信的消息處理系統能大幅提升代碼的可維護性和擴展性&…

Java: 反射機制的 ParameterizedType(參數化類型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一個接口&#xff0c;屬于反射 API 的一部分&#xff0c;主要用于表示參數化類型&#xff08;即帶有類型參數的泛型類型&#xff09;。它是 Java 反射機制中處理泛型類型信息的關鍵接口之一。 一、什么是參…

OkHttp 與 Retrofit 完美結合:打造高效的 Android 網絡請求

前言在現代 Android 開發中&#xff0c;網絡請求是幾乎每個應用都必不可少的功能。OkHttp 和 Retrofit 作為當前最流行的網絡請求庫組合&#xff0c;為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何將這兩者結合使用&#xff0c;充分發揮它們的優勢。一、OkHttp 和 Retr…

系統辨識建模

系統辨識建模 一、系統辨識建模的作用 1. 建立真實物理系統的數學模型 2. 為后續控制器/強化學習算法提供仿真環境 3. 提高控制精度和安全性 二、本文的系統辨識是怎么做的 1. 實驗采集 2. 數學建模 3. 在控制系統中的作用 三、實際用法流程(簡化版) 1. 系統辨識階段 2. 強化…

Android開發:Java與Kotlin深度對比

1. 語言特性與現代性 Java (特別是 Android 主要使用的 Java 8 及之前版本): 相對冗長&#xff1a; 需要編寫更多的樣板代碼&#xff08;如 getter/setter、findViewById 的顯式類型轉換、匿名內部類等&#xff09;。空指針異常 (NPE)&#xff1a; 類型系統默認允許 null&#…

米家打印機驅動:Wi-Fi 無線打印絲滑順暢不卡頓,從此告別對打印機干瞪眼

各位小米家居控們&#xff0c;你們有沒有過這種經歷&#xff0c;新買的打印機回家&#xff0c;結果電腦跟它像倆傲嬌的小情侶&#xff0c;死活不搭話&#xff1f;急得你想當場表演一個“打印機抱頭痛哭”&#xff1f;別急&#xff0c;今天就給你們安利個神隊友——米家打印機驅…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(7):自動詞 & 他動詞

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;7&#xff09;&#xff1a;自動詞 &#xff06; 他動詞1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff08;&#xff11;&#xff09;自動詞 &#xff06; 他動…

深入理解設計模式:訪問者模式詳解

在軟件開發中&#xff0c;我們經常會遇到需要對一個復雜對象結構進行操作的情況。隨著需求的不斷變化&#xff0c;我們可能需要在這個對象結構上添加各種新的操作。如果直接在對象結構中添加這些操作&#xff0c;會導致類的職責過重&#xff0c;且每次添加新操作都需要修改原有…

Linux timerfd 定時器封裝

使用 timerfd epoll() 實現&#xff0c;簡潔精確。沒定義 MU_ERROR 宏的話替換為 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【樣式效果】Vue3實現仿制iOS按鈕動態效果

iOS開關效果定義變量&#xff1a; <style scoped lang"scss">.layout {// 按鈕寬度$button-width: 500px;// 按鈕高度$button-height: 250px;// 按鈕里面圓形直徑$circle-diameter: 200px;// 按鈕背景與里面圓形間距$button-circle-offset:calc(($button-he…

京東瘋狂投資具身智能:眾擎機器人+千尋智能+逐際動力 | AI早報

每日分享全球最新AI資訊【應用商業八卦技術】&#xff0c;&#x1f30f;&#xff1a;未來世界2099應用 1、馬斯克推出兒童AI"Baby Grok"引熱議&#xff1a;安全性能否經受考驗&#xff1f; 2、螞蟻AQ健康應用霸榜蘋果商店&#xff0c;或將聯手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自動外鏈構建技術重構智能營銷新標準

AI時代SEO技術革命&#xff1a;企業如何突破流量增長瓶頸&#xff1f;隨著Google算法升級至MUM模型&#xff0c;傳統SEO工具已難以應對多模態內容優化需求。在搜索引擎日均處理120億次查詢的生態中&#xff0c;企業官網平均自然流量轉化周期長達6-8個月&#xff0c;因此諸如Jia…

Docker-compose:服務編排

Docker-compose 介紹 服務編排:按照一定的業務規則批量管理容器 在微服務架構的應用系統中,一般包含 N 個微服務,且每個微服務一般都會部署多個實例。此時,如果每個微服務都要手動啟停,維護的工作量會很大。 要從 Dockerfile build image 或者去 docker hub 拉取 image …

異地服務器備份Mysql數據

前言異地服務器備份Mysql數據即Mysql的server端與備份服務器不是同一個。Mysql服務端安裝在192.168.3.36中&#xff0c;現在需要在IP為192.168.209.129的服務器中使用mysqldump命令備份指定數據庫數據;192.168.209.129沒有裝過Mysql客戶端;1.安裝Mysql客戶端不安裝Mysql客戶端就…

NGINX 高級配置解析:`proxy_request_buffering` 使用詳解

在使用 NGINX 作為反向代理服務器時&#xff0c;處理客戶端請求體&#xff08;如上傳文件或大體積 POST 請求&#xff09;的方式會直接影響應用性能與資源使用。其中&#xff0c;proxy_request_buffering 是一個非常關鍵但容易被忽略的配置項。 本文將詳細介紹該指令的作用、典…

增加交叉驗證和超參數調優

前文中&#xff0c;只是給了基礎模型&#xff1a; PyTorch 實現 CIFAR-10 圖像分類&#xff1a;從數據預處理到模型訓練與評估-CSDN博客 今天我們增加交叉驗證和超參數調優&#xff0c; 先看運行結果&#xff1a; 在測試集上評估最終模型 最終模型在測試集上的準確率&…

解決pip指令超時問題

用pip指令&#xff0c;在安裝Django3.2時報錯&#xff0c;詢問ChatGpt后得到的解決方案pip 下載超時 —— 是 當前網絡連接到 PyPI 官方源太慢或不穩定&#xff0c;甚至可能連不上了&#xff0c;而 pip 默認的超時時間又太短&#xff0c;就導致了中途失敗&#xff1a;ReadTimeo…

Oracle定時清理歸檔日志

線上歸檔日志滿了&#xff0c;系統直接崩了&#xff0c;為解決這個問題&#xff0c;創建每月定時清理歸檔日志。 創建文件名 delete_archivelog.rman CONFIGURE ARCHIVELOG DELETION POLICY CLEAR; RUN {ALLOCATE CHANNEL c1 TYPE DISK;DELETE ARCHIVELOG ALL COMPLETED BEFORE…