基于与STM32的加湿器之温湿度驱动

1.简介

  温湿度计是一种用于测量和监测环境中温度和湿度的仪器,其工作原理基于热力学原理和物理原理。通过测量和显示环境中的温度和湿度,帮助用户了解当前环境的温湿度状况,从而采取相应的措施来调节或控制环境,以达到最佳的生产、存储或生活条件。

2.工作原理

  温度传感器通常使用热敏电阻或热电偶等传感器来测量被测物体的温度。当被测物体的温度发生变化时,传感器会产生与温度相关的电阻或电压变化,这些变化会被转换成电信号或数字信号输出给仪表;湿度传感器常采用电容式湿度传感器来测量相对湿度。该传感器由一个金属氧化物电极和一个介质组成,介质中包含一个固定量的水分子。当被测物体的相对湿度发生变化时,介质中的水分子数量也会发生变化,从而导致电容值的变化,电容值的变化会被转换成数字信号输出给仪表。

3.分类与类型

  温湿度计可按不同的标准进行分类,主要包括以下几种:
  按测量方法分类:干湿球湿度计、露点温度计、毛发湿度计、库伦湿度计、电化学湿度计、光学型湿度计等。
  按显示类型分类:指针温湿度计和数字温湿度计。指针温湿度计通过指针在表盘上的位置来指示温湿度值,而数字温湿度计则通过液晶屏幕以数字形式显示温湿度值。
  按精度级别分类:民用温湿度计和工业温湿度计。工业温湿度计通常具有更高的测量精度和稳定性,适用于对温湿度要求较高的场合。

4.DHT11温湿度模块

  DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。
在这里插入图片描述

4.1 硬件接口电路

在这里插入图片描述
  注意:
  微处理器与 DHT11 的连接典型应用电路如上图所示,DATA 上拉后与微处理器的 I/O 端口相连。
  1.典型应用电路中建议连接线长度短于 5m 时用 4.7K 上拉电阻,大于 5m 时根据实际情况降低上拉电阻的阻值。
  2. 使用 3.3V 电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。
  3. 每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取 2 次,但不建议连续多次读取传感器,每次读取传感器间隔大于 2 秒即可获得准确的数据。
  4. 电源部分如有波动,会影响到温度。如使用开关电源纹波过大,温度会出现跳动。
  硬件引脚说明:

引脚说明
VDD电源,工作电压3.3~5V
DATA串行数据,单总线PA11引脚
NC空脚
GND电源地

  DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

4.2 单总线通讯简介

  单总线传送数据位定义
  DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。
  数据格式:
  8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位。
  注:其中湿度小数部分为 0。
  校验位数据定义:
  “8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据”8bit 校验位等于,所得结果的末 8 位。
在这里插入图片描述
在这里插入图片描述

4.3 单总线时序

  用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。信号发送如图所示。
在这里插入图片描述
  注:主机从 DHT11 读取的温湿度数据总是前一次的测量值,如两次测间隔时间很长,请连续读两次以第二次获得的值为实时温湿度值。

5.DHT11驱动示例

  1.发送开始信号,等待设备响应。
  主机发起时序:由主机拉低至少18ms,且不超过30ms。接着释放总线,等待从机响应。(释放总线,延时约20~40us)。
在这里插入图片描述

//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0X00008000;}
#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0X00003000;}
IO操作函数											   
#define	DHT11_DQ_OUT(x) HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,(GPIO_PinState)x)
#define	DHT11_DQ_IN  HAL_GPIO_ReadPin(DHT11_GPIO_Port,DHT11_Pin)  //数据端口	PA0 /*******起始信号***************/
void DHT11_Rst(void)	   
{      DHT11_IO_OUT(); 	//配置为输出模式DHT11_DQ_OUT(0); 	//总线拉低Delay_Ms(20);    	//拉低至少18msDHT11_DQ_OUT(1); 	//总线拉高Delay_Us(30);     	//主机拉高20~40us
}

  从机响应信号:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 83 微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准备接收数据。
在这里插入图片描述

/***********等待DHT11的回应***************
**返回1:未检测到DHT11的存在
**返回0:存在
*******************************************/
u8 DHT11_Check(void) 	   
{   u8 retry=0;DHT11_IO_IN();//配置为输入模式	while (!DHT11_DQ_IN&&retry<100)//DHT11会拉低83us左右{retry++;Delay_Us(1);}if(retry>=100)return 1;	  	while (DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高87us{retry++;Delay_Us(1);}	 if(retry>=100)return 1;else retry=0;  return 0;
}

  2.读取数据‘0’和数据‘1’。
  位数据“0”的格式为: 54 微秒的低电平和 23-27 微秒的高电平;
  位数据“1”的格式为: 54 微秒的低电平加 68-74微秒的高电平。
  位数据“0”、“1”格式信号如图所示:
在这里插入图片描述

/*******************读取1bit数据***************
**	数字0: 50~58us低电平,23~27us高电平
**	数字1:50~58us低电平,68~74us高电平
**返回值:1/0
*************************************************/
u8 DHT11_Read_Bit(void) 			 
{u8 retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;Delay_Us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平,第电平时间50~58us{retry++;Delay_Us(1);}Delay_Us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;		   
}

  读一字节数据示例(高位在前):

/**************读取1byte数据*************
**
**从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;
}

  读取一次温湿度数据示例(5个字节):

//从DHT11读取一次数据
//temp:温度值-20~60℃
//humi:湿度值5~95%RH
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        u8 buf[5]={0};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];*humi=buf[1];*temp++=buf[2];*temp=buf[3];}}else return 1;return 0;	    
}

  DHT11初始化

//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{	 /*1.开时钟*/		    DHT11_Rst();  //复位DHT11return DHT11_Check();//等待DHT11的回应
} 

6.温湿度采集

  循环采集温湿度数据,实时显示在LCD屏幕上:

while(1)
{Delay_Ms(1);time++;if(time>=1000){if(DHT11_Read_Data((u8*)&temp,(u8*)&humidity)==0){//printf("温度:%d.%d℃  湿度:%d %%\r\n",temp[0],temp[1],humidity[0]);if(lcd_show_flag==0){snprintf(buffer,sizeof(buffer),"%d.%dC ",temp[0],temp[1]);LCD_ShowStr(30,30,64,buffer,RED,WHITE);LCD_DrawLine(0,94,240,94,RED);LCD_DrawLine(0,95,240,95,RED);if(humidity[0]<100){snprintf(buffer,sizeof(buffer),"%02d%% ",humidity[0]);LCD_ShowStr(70,125,64,buffer,RED,WHITE);}LCD_DrawLine(0,189,240,189,RED);LCD_DrawLine(0,190,240,190,RED);}}time=0;}
}

7.运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373890.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3入门之创建vue3的单页应用(vite+vue)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【测开能力提升-fastapi框架】介绍简单使用

0. 前期说明 立了很多flag(开了很多专题)&#xff0c;但坚持下来的没几个。也干了很多测试工作(起初是硬件(Acoustic方向)测试 - 业务功能测试 - 接口测试 - 平台功能测试 - 数据库测试 - py自动化测试 - 性能测试 - 嵌入式测试 - 到最后的python测试开发)&#xff0c;最终还是…

自定义枚举对象序列化规则: 在Json中以枚举的code值表示枚举;枚举序列化时,新增枚举描述字段;String到IEnum的转换

文章目录 引言I 案例分析1.1 接口签名计算1.2 请求对象1.3 枚举对象序列化1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化1.5 请求对象默认值处理II 在JSON中以枚举的code值来表示枚举的实现方式2.1 自定义toString方法返回code2.2 使用@JsonValue注解,只…

Unity入门之重要组件和API(3) : Transform

前言 Transform类主要处理游戏对象(GameObject)的位移、旋转、缩放、父子关系和坐标转换。 1.位置和位移 1.1必备知识点&#xff1a;Vector3 Vector3 主要用来表示三维坐标系中的一个点或者一个向量。 【声明】 Vector3 v1 new Vector3(); Vector3 v2 new Vector3(10, 10…

应用监控SkyWalking调研

参考&#xff1a; 链路追踪( Skyworking )_skywalking-CSDN博客 企业级监控项目Skywalking详细介绍&#xff0c;来看看呀-CSDN博客 SkyWalking 极简入门 | Apache SkyWalking 使用 SkyWalking 监控 ClickHouse Server | Apache SkyWalking https://zhuanlan.zhihu.com/p/3…

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式&#xff08;多对多、多表查询、子查询等&#xff09;。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回&#xff1a;&#xff08;用一下sql语句&#xff…

构建与操作共享栈

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝既然选择了远方,当不负青春,砥砺前行! 共享栈是一种优化的栈实现方式,它允许两个或多个栈共享同一段连续的内存空间…

ch552g中使用SPI进行主从机通信时发现的问题

参考 基本硬件准备 两块独立的ch552g的板子&#xff0c;开始连接时数据传输出现数据错误&#xff0c;本来猜想是通信线连接问题&#xff0c;后来用了较短的连接线依然没有改善。 SPI通信的认知 SPI一般都是全双工实时通信&#xff0c;所以在发送数据时一般有短暂的停留使得…

MySQL黑马教学对应视屏笔记分享之聚合函数,以及排序语句的讲解笔记

聚合函数 注意&#xff1a;null值不参与聚合函数的计算。 分组查询 2.where与having的区别 执行时机不同&#xff1a;where是在分组之前进行过滤&#xff0c;不满足where条件&#xff0c;不参与分组&#xff1b;而having是分组之后对结果进行过滤。判断条件不同&#xff1a;w…

中职网络安全B模块渗透测试system0016

访问http://靶机IP/web1/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b; 可能会跳转8000端口删除进入80端口 进入后点击侦查一下&#xff0c;这里乱码了&#xff0c;我们点击查看是一个柯南&#xff0c;web但这是一个web题目肯定不是隐写术&#xff0c;所以说题目的…

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件&#xff1f;&#xff08;&#xff09; 训练文件&#xff1f;&#xff08;&#xff09; 模型文件&#xff1f;&#xff08;√&#xff09; 1.2 骨干网络与模块缝合 以Vision Transformer为例&#xff0c;模型文件里有很多类&#xff0c;我们只在最后…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 这一配置项在 Spring Boot 项目中的作用如下&#xff1a; 自动配置类的指定&#xff1a; 这一配置将 EnableAutoConfiguration 设置为 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

代码随想录算法训练营第四十九天| 647. 回文子串、 516.最长回文子序列

647. 回文子串 题目链接&#xff1a;647. 回文子串 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; dp[i][j] 表示字符串 s 从索引 i 到索引 j 这一段子串是否为回文子串。 当s[i]与s[j]不相等&#xff0c;那没啥好说的了&#xff0c;dp[i][j]一定是fa…

便宜SSL证书有哪些平台推荐 域名SSL证书作用

在数字化时代&#xff0c;网络安全已成为我们日常生活和工作中不可或缺的一部分。 申请便宜SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#xff0c;一般选择默认就可以了&#xff0c;也可以自定义CSR。 3…

STM32中断

CM3 内核支持 256 个中断&#xff0c;其中包含了 16 个内核中断和 240个外部中断&#xff0c;并且具有 256 级的可编程中断设置。但STM32 并没有使用CM3内核的全部东西&#xff0c;而是只用了它的一部分。STM32有 76 个中断&#xff0c;包括16 个内核中断和 60 个可屏蔽中断&am…

错位情缘悬疑升级

✨&#x1f525;【错位情缘&#xff0c;悬疑升级&#xff01;关芝芝与黄牡丹的惊世婚约】&#x1f525;✨在这个迷雾重重的剧场&#xff0c;一场前所未有的错位大戏正悄然上演&#xff01;&#x1f440; 你没看错&#xff0c;昔日兄弟的前女友关芝芝&#xff0c;竟摇身一变成了…

养老院生活管理系统

摘要 随着全球范围内人口老龄化趋势的日益加剧&#xff0c;养老院作为老年人生活的重要场所&#xff0c;其生活管理问题也显得愈发突出和重要。为了满足养老院在日常生活管理、老人健康监护、服务人员管理等多方面的需求&#xff0c;提高管理效率和服务质量。决定设计并实现了…

旷野之间8 - LLMOps 与 MLOps操作化 AI 模型

介绍 随着人工智能越来越多地应用于商业应用&#xff0c;简化人工智能系统&#xff08;尤其是机器学习模型&#xff09;的开发和持续管理的新实践也不断涌现。MLOps 已成为一种基于 DevOps 原则实施机器学习的流行方法。 现在&#xff0c;随着 GPT-3 等大型语言模型 (LLM) 的…

算法训练营day27--122.买卖股票的最佳时机II +55. 跳跃游戏 +45.跳跃游戏 II+1005.K次取反后最大化的数组和

一、 122.买卖股票的最佳时机II 题目链接&#xff1a;https://leetcode.cn/problems/binary-search/description/ 文章讲解&#xff1a;https://www.programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html 视频…

数字统计

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别// 注意 while 处理多个 caseint a in.nextInt();i…