dht11温湿度传感器_Arduino不调用库实现DHT11数据读取

55971a7c798dbe02750a393383a66c77.png

DHT11概述

9bdea5fe3dd3dcb522f7b6134c4e994e.png

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。DHT11技术文档

引脚参数

cc073259b74c749b3563e6bcab4cc852.png

Data脚通信

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分。

数据格式

一次完整的数据传输为40bit,高位先出:8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和

时序图

总时序图

4123927d47b98edfac1d49bc7c3d6df0.png

开始数据传送时序图

c20fa643611bab09af46840a8d076ce5.png

数据传送时序图

464cbe9c0c23de8d72a5ee005db1cb47.png

0ed8a8fa08f1a9f67a0b30edf462f655.png

通讯步骤

根据时序定义来完成通讯过程

  1. 总线空闲状态为高电平HIGH,主机把总线拉低LOW等待DHT11响应,主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号;
  2. 主机把总线拉高HIGH, 延迟等待20-40ms让DHT11 把总线拉低到LOW
  3. 主机检测到总线为LOW后延迟等待80us
  4. 主机检测到总线为HIGH后继续延迟等待80us即可开始进行数据读取;
  5. 主机等待50us,当检测到总线为HIGH时,延时30us再次检测总线状态,根据时序图定义,高电平持续时间大于30us时候为1小于为0即可获取到数据,不断重复8次即可获取到1字节的数据;
  6. 重复执行步骤5,5次即可获取到全部的数据

Arduino实现

设备连接

da12ee9d12a44a79859587c2682ad85c.png

7e1de1e7105651cad0900868b490415a.png

代码编写

//Test the DHT11
int dhPin = 2;  // 温湿度信号接脚连入 Arduino 的 Pin 8
byte dat[5];   // 存放湿度2byte, 温度 2 byte, checksum 1 byte
byte readData() {  // 每次读取 8 bits  ( one byte)byte data = 0 ; // 初始化数据,不然可能出错for (int i = 0; i < 8; i++) {if (digitalRead(dhPin) == LOW) {  // 一开始要 LOW 才表示要传过来while (digitalRead(dhPin) == LOW); //等待 50us;// 现在已经变成 HIGH 了delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;if (digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1data |= (1 << (7 - i)); //高位在前,低位元在后;//如果这时已经是 LOW, 表示这 bit 是 0, 不必塞入 data//..而且以下的 while 也会立即结束(因为 LOW), 准备接收下一个 bitwhile (digitalRead(dhPin) == HIGH); // 等待下一bit的接收;//这时一定已经变成 LOW 了}// if}// for(return data;   // 收完 8 bit = one byte = one char
} // readData(
void start_test(  ) {  // 每次要与 DHT11 沟通digitalWrite(dhPin, LOW); //拉低到 LOW,发送表示要开始沟通的信号;delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;我们用30msdigitalWrite(dhPin, HIGH);  // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送delayMicroseconds(40);  // 给40us等待 DHT11 响应;pinMode(dhPin, INPUT); // 改为输入 mode 准备 digitalRead( )while (digitalRead(dhPin) == HIGH);  // 必须等到 LOWdelayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80uswhile (digitalRead(dhPin) == LOW); // 继续等到变 HIGHdelayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送数据;/// 以下连续读入 5 bytes (40 bits), 最后的 byte 是 checksum 校验值for (int i = 0; i < 5; i++) dat[i] = readData(); //接收温湿度资料,校验位元;pinMode(dhPin, OUTPUT); // 改为 Output mode, 准备拉高HIGHdigitalWrite(dhPin, HIGH); //发送完一次资料后释放bus,等待下一次开始信号;
}
void setup(  ) {Serial.begin(9600);Serial.println("begin!");pinMode(dhPin, OUTPUT);
}
void loop(  ) {start_test( );  // 读取湿度温度和检核位到 dat[ ]; 其中dat[4]是checkSum// 根据datasheet规定, dat[4] 要 == (dat[0]+dat[1]+dat[2]+dat[3]) %256// 否则表示沟通有错误 !!Serial.print("Current humdity = ");Serial.print(dat[0], DEC); //显示湿度的整数部分;Serial.print('.');Serial.print(dat[1], DEC); //显示湿度的小数位;(其实是 0)Serial.println(" %");  // 注意有空格要用 " %"  不可用 ' %'Serial.print("Current temperature = ");Serial.print(dat[2], DEC); //显示温度的整数部分;Serial.print('.');Serial.print(dat[3], DEC); //显示温度的小数位;(其实是 0)Serial.println(" C");delay(1985);
}

串口输出

7c954bab54ace1f39e8aafb825ac140c.png

参考文档

不使用 DHTxx 庫, 如何自己读取 DHT11 湿度温度 ?

Arduino教程——DHT11数字温湿度传感器

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

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

相关文章

rete_RIP RETE时间来获得PHREAKY

rete我刚刚完成了有关新规则算法PHREAK的高级文档&#xff0c;PHREAK是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平&#xff0c;但希望仍然很有趣。 它建立在ReteOO之上&#xff0c;非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用了RETE算法并…

mysql 存储过程 插入记录_mysql 存储过程 插入记录

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

Java技巧:创建监视友好的ExecutorService

在本文中&#xff0c;我们将扩展具有监视功能的ExecutorService实现。 这种监视功能将帮助我们在实时生产环境中测量多个池参数&#xff0c;即活动线程&#xff0c;工作队列大小等。 它还将使我们能够衡量任务执行时间&#xff0c;成功任务计数和失败任务计数。 监控库 至于监…

java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串

当Java应用程序消耗大量内存时&#xff0c;它本身就会出现问题&#xff0c;并可能导致GC压力增加和GC暂停时间过长。在我之前的一篇文章中&#xff0c;我讨论了Java中常见的内存浪费源&#xff1a;重复字符串。两个 java.lang.String 对象&#xff0c; a 并 b 在重复时 a ! b &…

mysql五大子句_MySQL的查询语句中可以使用以下哪个子句来表示分组查询

【多选题】人类行为遗传学工作者倾向于把人的行为遗传分为哪几类【填空题】MySQL的连接操作包括内连接、( )和交叉连接。【判断题】社会生活类尤其是人文风光类纪录片的解说则多用文学、 散文手法, 既抒情又有解释说明, 语言华丽富于美感,情感真挚浓郁。【单选题】1 、作业区边…

批处理 设置电脑最佳性能_批处理最佳做法

批处理 设置电脑最佳性能大多数应用程序至少具有一个批处理任务&#xff0c;在后台执行特定的逻辑。 编写批处理作业并不复杂&#xff0c;但是您需要了解一些基本规则&#xff0c;我将列举一些我发现最重要的规则。 从输入类型的角度来看&#xff0c;处理项目可以通过轮询处理…

layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...

\n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ ‘ item.TITLE ‘\n‘ ‘ ‘ item.ZDRQ ‘\n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ \n‘ ‘ ‘ item.CDATE ‘\n‘ ‘ ‘ item.TJR ‘\n‘ ‘ \n‘ ‘ \n‘ ‘ ‘‘//消息的跳转页面$(".xiaoxi").click(fu…

mysql 5.6自动任务_mysql定时执行某任务

查看event是否开启: show variables like %sche%;将事件计划开启: set global event_scheduler1;关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;简单实例.创建表 CREATE TABLE test(endti…

JVM体系结构:JVM类加载器和运行时数据区

各位读者好&#xff01; 在JVM系列的上一篇文章中&#xff0c;开发人员了解了Java虚拟机&#xff08;JVM&#xff09;及其体系结构。 本教程将帮助开发人员正确回答以下主题的问题&#xff1a; ClassLoader子系统 运行时数据区 1.简介 在继续之前&#xff0c;让我们看一下Ja…

mysql flush cache_mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法

转自&#xff1a;http://www.169it.com/article/5994930453423417575.html为了测试sql语句的效率&#xff0c;有时候要不用缓存来查询。使用SELECT SQL_NO_CACHE ...语法即可SQL_NO_CACHE的真正作用是禁止缓存查询结果&#xff0c;但并不意味着cache不作为结果返回给query。目前…

-%3erow mysql_MySQL查询优化

# MySQL查询优化* [请简述项目中优化MySQL语句执行效率的方法&#xff0c;从哪些方面入手&#xff0c;SQL语句性能如何分析&#xff1f;](https://www.kancloud.cn/ranjun940726/php_interview/596348#MySQLSQL_3)* [分析查询速度](https://www.kancloud.cn/ranjun940726/php_i…

apache karaf_Apache Karaf遇到Apache HBase

apache karaf介绍 Apache HBase是一个以Google Bigtable为蓝本的开源&#xff0c;分布式&#xff0c;版本化&#xff0c;面向列的商店。 如果您是普通读者&#xff0c;那么您可能已经知道Apache Karaf是什么&#xff0c;但是对于那些不是的读者&#xff1a;Apache Karaf是一个O…

mysql5.6特性_MySQL5.6新版本特性

MySQL已发布新的系列版本5.6.x&#xff0c;如果打算升级的朋友可以尝试&#xff0c;虽然目前没有收到新版本的使用反馈&#xff0c;但凭借MySQL占据市场份额来看&#xff0c;新版本的确值得期待。五大特性&#xff1a;优化器的改进MySQL Optimizer 团队做了大量的工作为了不断的…

实现threadlocal_ThreadLocal如何实现?

实现threadlocal这是我上周的帖子的后续文章&#xff0c;其中我解释了ThreadLocal用法背后的动机 。 从帖子中我们可以回忆起&#xff0c;如果您希望为每个线程拥有一个独立初始化的变量副本&#xff0c;则ThreadLocal确实是一个很酷的概念。 现在&#xff0c;好奇的人可能已经…

mysql timeout的单位_mysql的timeout-阿里云开发者社区

mysql的timeout很多时候我们连接mysql会在timeout这里跌倒&#xff0c;这里明确下mysql的timeout&#xff1a;下面是获取timeout的变量&#xff1a;mysql> show global variables like "%timeout%";---------------------------------------| Variable_name | Val…

带有Spring Boot 2.0的Spring Security:UserDetailsS​​ervice

正如我们在上一篇文章中所看到的&#xff0c;我们的spring应用程序的用户名和密码是通过环境变量配置的。 这对于原型目的是可以的&#xff0c;但是在现实生活中&#xff0c;我们必须提供另一种方式来使用户有资格登录到该应用程序。 为此&#xff0c;我们使用UserDetailsS​​…

java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

前言众所周知&#xff0c;《剑指offer》是一本“好书”。如果你是个算法菜鸡&#xff08;和我一样&#xff09;&#xff0c;那么最推荐的是先把剑指offer的题目搞明白。对于剑指offer题解这个系列&#xff0c;我的写作思路是&#xff0c;对于看过文章的读者&#xff0c;能够做到…

mysql数据库+ssh框架_SSH框架+Mysql数据库开发java web会员积分消费管理系统

项目描述会员消费管理&#xff1a;会员信息调取查询、会员消费商品添加金额计算、兑换商品等会员管理&#xff1a;会员增删改查积分管理&#xff1a;积分设置、商品积分设置等积分兑换、数据库备份还原、折扣管理、商品管理等运行环境jdk7(8)tomcat7(8)mysql5.7myeclipes或ecli…

spring和spring_Spring交易可见性

spring和spring在初始化应用程序上下文时&#xff0c;Spring在遇到带有Transactional标记的类时会创建代理。 Transactional可以应用于类级别或方法级别。 在类级别应用它意味着该类中定义的所有公共方法都是事务性的。 Spring创建的代理类型&#xff0c;即Jdk代理或CGLIB代理&…

python上传文件到linux服务器_python上传大文件到服务器报错

项目需要&#xff0c;在mac上将打包好的文件(四五百兆)自动上传到web后台&#xff0c;用了两种方式上传&#xff0c;都报了类似的错误&#xff0c;在windows和linux上测试不会报错&#xff0c;但是到了mac打包机上就会报错&#xff1a;①第一种报错&#xff1a;Traceback (most…