DHT11 STM32 HAL驅動庫 整數

dht11.h

#ifndef __DHT11_H
#define __DHT11_H#include "stm32f1xx_hal.h"  // 根據實際芯片型號調整(如stm32f4xx_hal.h)// DHT11數據結構
typedef struct {GPIO_TypeDef *GPIOx;    // GPIO端口(如GPIOA)uint16_t GPIO_Pin;      // GPIO引腳(如GPIO_PIN_0)uint8_t Temperature;    // 溫度(整數部分,°C)uint8_t Humidity;       // 濕度(整數部分,%)
} DHT11_TypeDef;// 函數聲明
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11);// 微秒級延時函數(需用戶實現,或使用下方dht11.c中的模板)
void delay_us(uint16_t us);#endif /* __DHT11_H */

dht11.c

#include "dht11.h"
#include <stdint.h>// 私有函數聲明
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11);
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11);
static void Set_Pin_Output(DHT11_TypeDef *DHT11);
static void Set_Pin_Input(DHT11_TypeDef *DHT11);// 初始化DHT11
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) {DHT11->GPIOx = GPIOx;DHT11->GPIO_Pin = GPIO_Pin;DHT11->Temperature = 0;DHT11->Humidity = 0;
}// 讀取溫濕度數據(返回0成功,1失敗)
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11) {uint8_t data[5] = {0};if (DHT11_Start(DHT11) != 0) return 1; // 啟動失敗// 讀取40位數據(5字節)for (int i = 0; i < 5; i++) {data[i] = DHT11_ReadByte(DHT11);}// 校驗和驗證if ((data[0] + data[1] + data[2] + data[3]) != data[4]) {return 1; // 校驗失敗}DHT11->Humidity = data[0];DHT11->Temperature = data[2];return 0;
}// 啟動DHT11(發送開始信號)
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11) {Set_Pin_Output(DHT11);// 主機拉低至少18msHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_RESET);delay_us(18000);// 主機拉高20-40μsHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_SET);delay_us(30);// 切換為輸入模式,等待DHT11響應Set_Pin_Input(DHT11);// 檢測DHT11的低電平響應信號(超時檢測)uint32_t timeout = 10000; // 10ms超時while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET) {if (--timeout == 0) return 1;delay_us(1);}// 檢測DHT11的高電平信號(超時檢測)timeout = 10000;while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {if (--timeout == 0) return 1;delay_us(1);}return 0; // 啟動成功
}// 讀取一個字節的數據
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11) {uint8_t byte = 0;for (int i = 0; i < 8; i++) {// 等待低電平結束(數據位開始)while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET);// 延時40μs判斷高低電平(0: 26-28μs, 1: 70μs)delay_us(40);if (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {byte |= (1 << (7 - i)); // 高位在前}// 等待高電平結束while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET);}return byte;
}// 設置引腳為輸出模式
static void Set_Pin_Output(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 設置引腳為輸入模式
static void Set_Pin_Input(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 微秒級延時函數(需用戶根據實際定時器實現)
__weak void delay_us(uint16_t us) {/* 默認實現(需替換為您的實際延時函數) */for (uint16_t i = 0; i < us; i++) {for (uint16_t j = 0; j < 10; j++) { // 粗略延時(需校準)__NOP();}}
}

使用教程

#include "dht11.h"DHT11_TypeDef myDHT11;DHT11_Init(&myDHT11, GPIOA, GPIO_PIN_1);if (DHT11_ReadData(&myDHT11) == 0){//溫度處理 + LED1控制if(myDHT11.Temperature>TT){HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//LED1motorIndex=3;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);OLED_ShowString(112, 16, "H", OLED_8X16);//溫度過高顯示"H"}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);//LED1motorIndex=0;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);OLED_ShowString(112, 16, "L", OLED_8X16);//溫度正常顯示"L"}sprintf(str, "溫度:%d.0℃", myDHT11.Temperature);OLED_ShowString(1, 16, str, OLED_8X16);//濕度處理if(myDHT11.Humidity>HT){HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);//LED2OLED_ShowString(112, 32, "H", OLED_8X16);//濕度過高顯示"H"}else{HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);OLED_ShowString(112, 32, "L", OLED_8X16);//濕度正常顯示"L"}sprintf(str, "濕度:%dRH%%", myDHT11.Humidity);OLED_ShowString(1, 32, str, OLED_8X16);}

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

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

相關文章

【Actix Web 精要】Rust Web 服務開發核心技術與實戰指南

目錄 一、Actix Web 核心架構解析1.1 核心組件交互流程1.2 關鍵組件說明&#xff1a; 二、項目初始化與配置2.1 創建項目2.2 添加依賴 (Cargo.toml)2.3 項目結構 三、核心模塊實現3.1 配置管理 (src/config.rs)3.2 應用狀態管理 (src/main.rs)3.3 數據模型 (src/models/user.rs…

從URL到視頻:用Python和AI構建自動化內容講解視頻生成管道

摘要 本文旨在從技術層面&#xff0c;深入探討并實踐一個將任意網頁鏈接&#xff08;如飛書文檔、博客文章&#xff09;自動轉換為帶有配音和字幕的講解視頻的系統。我們將詳細拆解整個實現流程&#xff0c;覆蓋從內容抓取與解析、利用大語言模型&#xff08;LLM&#xff09;智…

Java 使用 Easy Excel 進行 Excel 數據導入導出

1. 通過 Maven 下載 Easy Excel 依賴包 在項目的 pom.xml 文件中添加以下依賴&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> <!-- 使用最新版本 -->…

國產化條碼類庫Spire.Barcode教程:如何使用 C# 讀取 PDF 中的條碼(兩種方法輕松實現)

在 PDF 文檔的 .NET 平臺處理流程中&#xff0c;使用 C# 讀取 PDF 條碼 是一項常見需求&#xff0c;特別適用于處理掃描件或電子表單。無論是物流、金融、醫療還是制造行業&#xff0c;PDF 文檔中經常包含用于追蹤或識別的條碼。這些條碼可能是嵌入圖像&#xff0c;也可能是矢量…

2023國賽數字取證-流量分析

數據取證 - 1 A 集團的?絡安全監控系統發現惡意份?正在實施?級可持續攻擊&#xff08;APT&#xff09;&#xff0c;并抓取了部分可疑流量包。請 您根據捕捉到的流量包&#xff0c;搜尋出?絡攻擊線索&#xff0c;分解出隱藏的惡意程序&#xff0c;并分析惡意程序的?為。 …

【預約小程序】-健身房預約課程小程序——仙盟創夢IDE

東方仙盟-坐擁萬個代碼 免費報表 阿雪技術觀 讓我們積極投身于技術共享的浪潮中&#xff0c;不僅僅是作為受益者&#xff0c;更要成為貢獻者。無論是分享自己的代碼、撰寫技術博客&#xff0c;還是參與開源項目的維護和改進&#xff0c;每一個小小的舉動都可能成為推動技術進…

SmartETL中數據庫操作與流程解耦的設計與應用

正如ETL這個概念本身所指示的&#xff0c;數據庫讀寫訪問是ETL的最常用甚至是最主要的操作。現代信息系統的設計與運行基本都是圍繞數據庫展開的&#xff0c;很多應用的核心功能都是對數據庫的CRUD&#xff08;創建、檢索、更新、刪除&#xff09;操作。 SmartETL框架設計之初…

【記錄解決問題】activiti--sql 轉義符設置

一、背景 %、&#xff01;、_在sql查詢時需要轉義&#xff0c;轉義的語法 like %?2% escape ?#{escapeCharacter()}二、activiti轉義配置 String wildcardEscapeClause ""; if (this.databaseWildcardEscapeCharacter ! null && this.databaseWildcard…

Unity AR構建維護系統的以AI驅動增強現實知識檢索系統

本博客概述了為維護開發的AI驅動增強現實&#xff08;AR&#xff09;知識檢索系統的開發過程&#xff0c;該系統集成了Unity用于AR、Python服務器用于后端處理&#xff0c;以及ChatGPT用于自然語言處理。該系統允許維護工人通過AR設備&#xff08;如HoloLens 2&#xff09;查詢…

Java面向對象核心:方法值傳遞與封裝機制精講

文章目錄 Java面向對象編程核心筆記一、方法值傳遞機制1. 基本數據類型傳遞2. 引用數據類型傳遞值傳遞總結 二、面向對象核心概念1. 類與對象關系2. 類定義規范3. 對象創建與使用 三、封裝機制詳解1. 封裝三大要素2. 封裝示例&#xff08;GirlFriend類&#xff09;3. 測試類4. …

【Actix Web】構建高性能 Rust API:Actix Web 最佳實踐與進階指南

目錄 一、高性能 API 架構設計1.1 系統架構圖1.2 核心組件 二、項目初始化與配置2.1 創建項目2.2 添加依賴 (Cargo.toml)2.3 配置文件 (config/default.toml) 三、核心模塊實現3.1 應用狀態管理 (src/state.rs)3.2 數據模型定義 (src/models.rs) 四、認證與授權系統4.1 JWT 認證…

vue項目中純前端實現導出pdf文件,不需要后端處理。

在 Vue 項目中&#xff0c;純前端實現導出 PDF 文件是完全可行的。通常可以借助一些 JavaScript 庫來將 HTML 內容或 DOM 元素轉換為 PDF 并下載&#xff0c;無需后端參與。 下面介紹幾種常用的方案和實現方法&#xff1a; 推薦方案&#xff1a;使用 html2canvas jsPDF 安裝…

c++虛擬內存

常見的內存困惑 當你編寫C程序時&#xff0c;是否遇到過&#xff1a; vector申請200MB內存&#xff0c;但系統顯示只占用20MB&#xff1f;程序在低配機器上崩潰&#xff0c;報出std::bad_alloc但內存顯示充裕&#xff1f;遍歷數組時特定位置耗時突然增加&#xff1f;相同代碼…

領域驅動設計(DDD)【22】之限定建模技術

文章目錄 一 限定初識二 限定識別三 限定實現 一 限定初識 一個 員工 可以擁有多份 工作經驗&#xff0c;而各個 工作經驗 的 時間段 不能相互重疊。可以得出一個推論&#xff1a;對于一個 員工 而言&#xff0c;每個 時間段 只能有一條 工作經驗。 UML中第二種表述方式&…

《P6492 [COCI 2010/2011 #6] STEP》

題目描述 給定一個長度為 n 的字符序列 a&#xff0c;初始時序列中全部都是字符 L。 有 q 次修改&#xff0c;每次給定一個 x&#xff0c;若 ax? 為 L&#xff0c;則將 ax? 修改成 R&#xff0c;否則將 ax? 修改成 L。 對于一個只含字符 L&#xff0c;R 的字符串 s&#…

macOS,切換 space 失效,向右切換space(move right a space) 失效

背景 準確來講&#xff0c;遇到的問題是向右切換space&#xff08;move right a space) 失效&#xff0c;并向左是成功的。 在鍵盤-快捷鍵-調度中心中&#xff0c;所有的快捷鍵均可用&#xff0c;但是“向右移動一個空間”總是失效。 已經檢查過不是快捷鍵沖突的問題&#x…

網飛貓官網入口 - 免費高清影視平臺,Netflix一站觀看

網飛貓是一個專注于提供豐富影視資源的在線平臺&#xff0c;涵蓋國內外熱門電影、電視劇、動漫、綜藝等多種類型。它不僅整合了Netflix的獨家內容&#xff0c;還提供了大量高清、藍光畫質的影視作品&#xff0c;支持多語言字幕&#xff0c;滿足不同用戶的觀影需求。網飛貓的界面…

Hyper-v-中的FnOs--飛牛Nas虛擬磁盤擴容(不清除數據)

在Hyper-v下的飛牛Nas要怎么在不刪除原有虛擬磁盤數據的情況下擴容呢 OK下面開始教學&#xff08;適用于Basic模式的虛擬磁盤擴容&#xff0c;Linear沒試過&#xff09; 先關閉飛牛Nas系統 找到飛牛Nas虛擬機&#xff0c;在設置下SCSI控制器找到要擴容的虛擬磁盤&#xff0c; 點…

掌握 MySQL 的基石:全面解讀數據類型及其影響

前言 上篇文章小編講述了關于MySQL表的DDL操作&#xff0c;在那里我多次使用了MySQL的數據類型&#xff0c;但是我并沒有去講述MySQL的數據類型&#xff0c;想必各位讀者已經很好奇MySQL的數據類型都有什么了&#xff0c;今天這篇文章我將會詳細的去講述MySQL的數據類型&#x…

buildadmin 如何制作自己的插件

官方文檔指引 提示&#xff1a;若不計劃發布到應用市場&#xff0c;可省略圖片等非必要功能 參考文檔&#xff1a;https://doc.buildadmin.com/senior/module/basicInfo.html 目錄 官方文檔指引開發說明模塊開發流程模塊包結構示例安裝開發工具 總結 開發說明 目標&#xff…