历史上的今天
返回首页

历史上的今天

今天是:2025年01月22日(星期三)

正在发生

2018年01月22日 | 基于arduino的dht11温湿度传感器的使用

2018-01-22 来源:互联网

    DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。


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

  DHT11温湿度传感器电气特性

  温湿度传感器DHT11封装形式及接口说明

  建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻(若购买的是已集成的模块,模块上已加上拉电阻,以下请忽略),当然,如果你想要精简电路的话, STC增强型单片机自带的推挽输出功能不失为一个选择,其相当于外接了一个2k的上拉电阻,但在设计电路时需注意:整个单片机的电流推荐不超过55mA,即从MCU-VCC流入的电流不超过55mA,从MCU-GND流出的电流不超过55mA,整体流入、流出电流均不超过55mA,封装尺寸及典型应用电路图如下图所示。

  DHT11温湿度传感器典型应用电路

  DHT11温湿度传感器时序图

  DHT11温湿度传感器连接图

  如图所示,将DHT11的正极与5V电源接口相连,负极与GND相连,中间的数据接口与2号引脚相连。

  代码

  #include 《dht11.h》

  dht11 DHT11;

  #define DHT11PIN 2

  void setup(){

  Serial.begin(9600);

  }

  void loop(){

  Serial.println(“/n”);

  int chk = DHT11.read(DHT11PIN);

  Serial.print(“Read sensor: ”);

  switch (chk)

  {

  case DHTLIB_OK:

  Serial.println(“OK”);

  break;

  case DHTLIB_ERROR_CHECKSUM:

  Serial.println(“Checksum error”);

  break;

  case DHTLIB_ERROR_TIMEOUT:

  Serial.println(“TIme out error”);

  break;

  default:

  Serial.println(“Unknown error”);

  break;

  }

  Serial.print(“Humidity (%): ”);

  Serial.println((float)DHT11.humidity, 2);

  Serial.print(“Temperature (oC): ”);

  Serial.println((float)DHT11.temperature, 2);

  delay(2000);

  注意事项

  1、代码中引用了#include 《dht11.h》,这个是操作DHT11的库文件,有了它,就可以轻松操作我们这个温湿度传感器了。但是引用这个库文件的操作步骤是:

  (1)在网上找到并下载该库文件,包括一个头文件和一个.cpp文件。

  (2)在arduinoIDE中点击菜单:程序–导入库–add library,然后选择你存放库文件的那个文件夹。

  (3)在代码中引用#include 《dht11.h》,这样就可以使用了。

  2、#define DHT11PIN 2,表示定义引脚2的名字为DHT11PIN ,注意这个定义语句后面没有分号。

  原理分析

  在硬件编程过程中,当你拿到一个器件,首先要了解他的引脚定义,这会告诉你这个东西应该怎么连接,在一个就是要看他的时序图,看了时序图你就知道主从设备之间进行数据采集过程中的代码应该怎么写,比如怎么启动,如何握手,怎么采集真正的数据等等。

  在我们这个试验中,DHT11的时序图是这样的:



  DHT11温湿度传感器使用注意事项

  DHT11的供电电压为3-5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。

  微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。

  操作流程如下:

  一次完整的数据传输为40bit,高位先出。

  数据格式:8bit湿度整数数据+8bit湿度小数数据

  +8bi温度整数数据+8bit温度小数数据+8bit校验和

  数据传送正确时校验和数据等于8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据所得结果的末8位。

  用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。

  从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

  通讯过程

  总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。

  总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

  数字0信号表示方法

  数字1信号表示方法

  程序:

  //DHT11temperature

  //chriz_w@163.com

  //arduinonano

  //arduinolite

  #include“arduino_lit.h”

  #defineDHT11Pin2

  //TesttheDHT11--chriz_w@163.com

  bytedat[5];//存放湿度2byte,温度2byte,checksum1byte

  bytereadData(){//每次读取8bits(onebyte)

  bytedata;

  for(inTI=0;i《8;i++){

  if(digitalRead(DHT11Pin)==LOW)

  {

  //一开始要LOW才表示要传过来

  while(digitalRead(DHT11Pin)==LOW);//等待50us;

  //现在已经变成HIGH了

  _delay_us(30);//判断高电平持续时间,以判定资料是‘0’还是‘1’;

  if(digitalRead(DHT11Pin)==HIGH)//根据时序持续了30us以上就是1

  data|=(1《《(7-i));//高位在前,低位元在后;

  //如果这时已经是LOW,表示这bit是0,不必塞入data

  //。。而且以下的while也会立即结束(因为LOW),准备接收下一个bit

  while(digitalRead(DHT11Pin)==HIGH);//等待下一bit的接收;

  //这时一定已经变成LOW了

  }

  }

  returndata;//收完8bit=onebyte=onechar

  }

  voidstart_dht11(){//每次要与DHT11沟通

  DIGITAL_WRITE(DHT11Pin,LOW);//拉低到LOW,发表示要开始沟通的信号;

  _delay_ms(30);//延时要大于18ms,以便DHT11能检测到开始信号;这里用30ms

  DIGITAL_WRITE(DHT11Pin,HIGH);//拉高HIGH,让DHT11拉低到LOW告诉我们要传送

  _delay_us(40);//给40us等待DHT11响应;

  PIN_MODE(DHT11Pin,INPUT);//改为输入mode准备digitalRead()

  while(DIGITAL_READ(DHT11Pin)==HIGH);//必须等到LOW

  _delay_us(80);//DHT11发出响应,会拉低80us;所以至少等80us

  while(DIGITAL_READ(DHT11Pin)==LOW);//继续等到变HIGH

  _delay_us(80);//DHT11会拉高到HIGH80us后开始发送资料;

  ///以下连续读入5bytes(40bits),最后的byte是checksum校验值

  for(inTI=0;i《5;i++)

  dat[i]=readData();//接收温湿度资料,校验;

  PIN_MODE(DHT11Pin,OUTPUT);//改为Outputmode,准备拉高HIGH

  DIGITAL_WRITE(DHT11Pin,HIGH);//发送完一次资料后释放bus,等待下一次开始信号;

  }

  voidsetup(){

  SERIAL_BEGIN();

  PIN_MODE(DHT11Pin,OUTPUT);

  }

  voidloop(){

  start_dht11();//读取湿度温度和检核位到dat[];其中dat[4]是checkSum

  //根据datasheet规定,dat[4]要==(dat[0]+dat[1]+dat[2]+dat[3])%256

  //否则表示沟通有错误!!

  PRINT(“currenthumidity=”);

  println(dat[0]&0xff,10,serial_puts);

  PRINT(“currenttemperature=”);

  println(dat[2]&0xff,10,serial_puts);//显示温度的整数部分;

  _delay_ms(2000);

  }

  intmain()

  {

  setup();

  while(1)

  loop();

  }

推荐阅读

史海拾趣

Advanced Linear Devices公司的发展小趣事

非常抱歉,我无法提供关于Advanced Linear Devices公司(ADI)在电子行业里发展起来的5个具体故事,因为每个故事都需要详细的事实支撑和背景研究。但我可以为你概述ADI公司的发展历程,并给出一些可能的发展故事框架,你可以基于这些框架进一步深入研究,以形成完整的故事。

首先,让我们回顾一下ADI公司的发展历程。ADI成立于1965年,由Ray Stata和他的合伙人共同创立,当时他们只是希望在模拟器件时代掌握自己的命运。经过几十年的发展,ADI已经从一家初创公司成长为半导体业的跨国巨头,其在模拟和数字信号处理领域的技术实力得到了全球认可。

基于这个概述,我可以给出以下几个可能的发展故事框架:

  1. 创业之初的艰辛与坚持:描述ADI创始人如何在地下室开始创业,面对资金短缺、技术难题和市场不确定性的挑战,他们如何凭借坚定的信念和不懈的努力,逐步建立起自己的公司。

  2. 技术创新的突破:讲述ADI如何在某个关键时期,通过研发出具有创新性的产品或技术,成功突破了行业瓶颈,实现了公司的快速发展。这可以涉及具体的技术细节和市场反响。

  3. 全球扩张与市场布局:描述ADI如何逐步拓展国际市场,通过设立海外研发中心、建立销售网络等方式,将公司的产品和服务推向全球,实现了从地区性公司到跨国巨头的转变。

  4. 应对行业变革的挑战:随着电子行业的不断发展,ADI也面临着来自竞争对手、市场变化和技术更新等多方面的挑战。可以讲述ADI如何灵活应对这些变革,通过调整战略、优化产品和提升服务质量等方式,保持了公司的竞争力。

  5. 与中国市场的深入合作:近年来,中国电子行业发展迅速,成为ADI等跨国企业的重要市场。可以讲述ADI如何与中国企业开展合作,共同推动技术创新和市场发展,实现了互利共赢的局面。

请注意,这些只是故事框架,具体的内容需要你根据ADI公司的历史资料、行业报告和新闻报道等进行深入研究和补充。在编写故事时,请确保只描述事实,避免加入个人主观评价或情感色彩。

CHINFA公司的发展小趣事

CHINFA公司的创立并非一帆风顺。在创业初期,公司面临着资金短缺、技术落后和市场竞争激烈等多重困难。然而,公司的创始人凭借对电子行业的深厚热爱和坚定信念,带领团队克服了一个又一个难关。他们通过自主研发、技术创新和市场拓展,逐渐在行业中崭露头角。

Barnbrook Systems Limited公司的发展小趣事

在电子产品行业,产品质量和客户服务是企业生存和发展的关键。Barnbrook深知这一点,因此在发展过程中始终坚持严格的品质管理和优质的客户服务。公司建立了完善的质量管理体系,对每一道工序都进行严格把关,确保产品的稳定性和可靠性。同时,Barnbrook也重视客户反馈和需求,不断优化产品和服务,赢得了客户的信任和好评。

Elpress AB公司的发展小趣事

Elpress AB公司成立于1959年,由一群具有前瞻性和创新精神的工程师在瑞典的克拉姆福什市创立。公司从成立之初就专注于电气连接系统的研发和生产,致力于为电力行业提供高效、可靠的解决方案。在初期,Elpress AB凭借其专业的技术能力和对质量的严格把控,逐渐在市场上赢得了客户的信赖。

敦泰(FOCALTECH)公司的发展小趣事
压缩机启动电路故障通常涉及启动器和压缩机线圈。如果启动器损坏,可以购买同型号的新启动器进行更换。如果压缩机线圈断路,则可能需要更换整个压缩机。这些维修工作较为复杂,建议由专业维修人员进行操作。
Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

你想问ARM总裁什么问题

最近ARM公司总裁Tudor Brown要来中国,EEWORLD会去采访他。     大家有什么想问的问题,我们代为转达了。…

查看全部问答>

“简简单单DSP”系列学习活动——第三期

“简简单单DSP”系列学习活动——第三期之GPIO 2812的I/O口都设为功能共享的,所以在使用IO的时候就要根据自己所需设置IO。 1、GPxMUX寄存器 通用输入输出多路选择寄存器I/O是工作在通用数字IO还是外围IO信号引脚就有GPxMUX决定。 GPxMUX.bit. ...…

查看全部问答>

通用贴片电阻电容钽电容PDF技术资料下载地址 要求加精

通用贴片电阻PDF技术资料 通用贴片电容PDF技术资料 村田贴片电容PDF技术资料 TDK贴片电容PDF技术资料 贴片AVX钽电容PDF技术资料 SOT-23封装稳压管PDF技术资料 长方体0603稳压管PDF技术资料 长方体0805稳压管PDF技术资料 长方体SOD123稳压 ...…

查看全部问答>

PLC应用领域简谈

多年来,可编程控制器(以下简称PLC)从其产生到现在,实现了接线逻辑到存储逻辑的飞跃;其功能从弱到强,实现了逻辑控制到数字控制的进步;其应用领域从小到大,实现了单体设备简单控制到胜任运动控制、过程控制及集散控制等各种任务的跨越。 &nb ...…

查看全部问答>

请教一下,指针函数问题......

#define bHiByte(arg)      (*(BYTE *)&arg)   //高8位 #define bLoByte(arg)      (*((BYTE *)&arg + 1)) //低8位 这两个函数他们的作用是得到高8位与低8位,具体是怎么实现的,看不明白能详细 ...…

查看全部问答>

电子电路绘图软件dxp2004教程

电子电路绘图软件dxp2004教程…

查看全部问答>

S7-200特殊指令

SM0.0-该位始终为1    SM0.1-首次扫描为1    SM0.2-保持数据丢失时为1    SM0.3-开机进入RUN时为1,一个扫描周期    SM0.4-时钟脉冲:30S闭合/30ON断开    SM0.5-时钟脉冲:0.5S闭合/0.5S断开  ...…

查看全部问答>

关于modelsim仿真时钟信号的问题

做仿真的时候,波形图里面的时钟信号一直持续为低,我以前仿真的时候也是用同样的方式编写时钟信号的,都没出现问题啊 always#50 clk=!clk; 刚开始学习这方面的东西,很多问题都不懂, 有没有高手指点,或是碰到过类似情况知道哪出问题的,不 ...…

查看全部问答>

LSD430-testf44x实验板键盘操作

使用光盘自带的键盘程序。 不按下键时,P1IN端口出现过三个值。0xf0,0xe0,0xe1. 是不是板子坏了?…

查看全部问答>

LM3S+FATFS+U盘+FLASH遇到的一个问题

项目要实现的功能,FATFS下U盘(设备1/0)与外部串行FLASH(设备0/1)数据互拷现在的情况是单独操作一个设备时,将FLASH设为设备0,可实现文件读,写,存,建,格式化等功能同样地将U盘设为设备0,可实现文件读,写,存,建,格式化等功能 可 ...…

查看全部问答>