DHT11模块简介

DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。它具有超小体积、极低功耗的特点。它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上。非常适用于对精度和实时性要求不高的温湿度测量场合。

本文将以DFRobot开源硬件平台的DHT11模块和DFRduino开发板来演示,讲解DHT11的驱动和使用。

DHT11电气参数

电源电压:3~5.5V(典型值:5V);

温度量程:0~50℃,误差 ±2℃;

湿度量程:20~90%RH,误差 ±5%RH;

采样周期:大于等于1秒/次。

DHT11硬件原理图

数据总线DATA使用上拉电阻拉高,因此总线空闲时为高电平。上拉电阻阻值推荐范围:4.7K~5.1K。

必要时在VDD和GND之间并一个100nF的去耦电容。

DHT11的工作原理

DHT11使用单一总线通信,即DATA引脚和单片机连接的线。总线总是处于空闲状态通信状态这个2个状态之间。

当单片机没有与DHT11交互时,总线处于空闲状态,在上拉电阻的作用下,处于高电平状态。

当单片机和DHT11正在通信时,总线处于通信状态,一次完整的通信过程如下:

①单片机将驱动总线的IO配置为输出模式。准备向DHT11发送数据。

②单片机将总线拉低至少18ms,以此来发送起始信号。再将总线拉高并延时20~40us,以此来代表起始信号结束。

③单片机将驱动总线的IO配置为输入模式,准备接收DHT11回传的数据。

④当DHT11检测倒单片机发送的起始信号后,就开始应答,回传采集到的传感器数据。DHT11先将总线拉低80us作为对单片机的应答(ACK),然后接着将总线拉高80us,准备回传采集到的温湿度数据。温湿度数据以固定的帧格式发送,具体格式如下图:

可以发现一帧为40个bit,而每一个bit的传输时序逻辑为:每一个bit都以50us的低电平(DHT11将总线拉低)为先导,然后紧接着DHT11拉高总线,如果这个高电平持续时间为26~28us,则代表逻辑0,如果持续70us则代表逻辑1。

⑤当一帧数据传输完成后,DHT11释放总线,总线在上拉电阻的作用下再次恢复到高电平状态。

注意事项

1、DHT11上电后,要等待 1秒 以越过不稳定状态,在此期间不能发送任何指令。

2、DHT11属于低速传感器,两次通信请求之间的间隔时间不能太短,一般来说要不能低于1秒。

3、当前DHT11通信帧的小数部分默认都是0,厂商预留给以后实现。所以一般只读取整数值部分即可。校验和定义为:前4个Byte的总和的低8位。

Ardunio驱动代码

在DFRobot官网可以找到DHT11模块驱动库,但出于学习和讲解的目的,下面给出了我自己的驱动实现源代码。使用C语言编写,并在Arduino上测试。

//file:dht11.h
//author:lulipro
//date:2019-5-5
#ifndef DHT11_H__
#define DHT11_H__#include <stdint.h>#ifdef __cplusplus
extern "C" {
#endif#define DHT11_OK         (0)     //读取成功
#define DHT11_TIMEOUT    (-1)    //DHT11响应超时
#define DHT11_CHECKERROR (-2)    //数据帧校验错误void DHT11_init(uint8_t pin);
int  DHT11_read(uint8_t* temperature,uint8_t* humidity );#ifdef __cplusplus
}
#endif#endif

//file:dht11.c
//author:lulipro
//date:2019-5-5
#include "dht11.h"#include <Arduino.h>                  //for pinMode(),delay() 等
#include <string.h>                   //for memset()static uint8_t DHT11_dataPin_;       //驱动DHT11的数据线引脚
static uint8_t DHT11_recvData_[5];   //存放 从DHT11读取的数据的缓冲数组,40个bit
/***********************作用:初始化*参数:pin,Arduino驱动DHT11的总线使用的IO引脚*返回:无**********************/
void DHT11_init(uint8_t pin)
{DHT11_dataPin_ = pin;//delay(1000);
}
/**********************作用:读取一次DHT11的传感器数据*参数:temperature,指向存放温度数据的指针;humidity,指向存放湿度数据的指针*返回:函数的执行状态:DHT11_OK,DHT11_TIMEOUT,DHT11_CHECKEROR*********************/
int DHT11_read(uint8_t* temperature,uint8_t* humidity )
{uint8_t time_cnt;uint8_t i;uint8_t bit_position;memset(DHT11_recvData_,0,5);                     //缓冲数组内容清0/*--------------主机发送起始信号----------------*/pinMode(DHT11_dataPin_,OUTPUT);digitalWrite(DHT11_dataPin_, LOW);   // 主机将总线拉低(时间>=18ms),使得DHT11能够接收到起始信号。delay(20);                           //至少 18 msdigitalWrite(DHT11_dataPin_, HIGH);  // 主机将总线拉高,代表起始信号结束。delayMicroseconds(40);               //延时20~40us/*--------------引脚配置为输入模式,准备接收传感器回传的数据-------------------*/pinMode(DHT11_dataPin_,INPUT);  //配置为输入模式//DHT11将总线拉低至少80us,作为DHT11的响应信号(ACK)。   time_cnt=0;while(LOW == digitalRead(DHT11_dataPin_)){delayMicroseconds(5);  ++time_cnt;if(time_cnt > 16) return DHT11_TIMEOUT;    }//DHT11将总线拉高至少80us,为发送传感器数据做准备。time_cnt=0;while(HIGH == digitalRead(DHT11_dataPin_)){delayMicroseconds(5);  ++time_cnt;if(time_cnt > 16) return DHT11_TIMEOUT;    }/*-------------------DHT11数据帧的接收和解析------------------*/for( i=0 ; i < 40 ; ++i ){time_cnt = 0;while( LOW == digitalRead(DHT11_dataPin_) )   //拉低50us作为bit信号的起始标志
        {time_cnt++;delayMicroseconds(5);if(time_cnt>10) return DHT11_TIMEOUT;}time_cnt = 0;while(  HIGH == digitalRead(DHT11_dataPin_) )   //拉高。持续26~28us表示bit0,持续70us表示bit1
        {time_cnt++;delayMicroseconds(5);if(time_cnt>14) return DHT11_TIMEOUT;}if(time_cnt>6){    //说明是bit1bit_position = 7 - i%8;DHT11_recvData_[i/8] |= (uint8_t)(1<<bit_position);}}//------------检验和的比对-------------i = (uint8_t)(DHT11_recvData_[0] + DHT11_recvData_[1] + DHT11_recvData_[2] + DHT11_recvData_[3])  ;if(i != DHT11_recvData_[4] ) return DHT11_CHECKERROR;*humidity    = DHT11_recvData_[0];  //回传湿度数据*temperature = DHT11_recvData_[2];  //回传温度数据return DHT11_OK;
}

实验例子

硬件连接 

Arduino 5V     --- DHT11 VDD

Arduino pin5  --- DHT11 DATA

Arduino GND --- DHT11 GND

主程序 

#include "dht11.h"
#include <stdint.h>uint8_t temperature ,humidity ;  //保存温度和湿度的全局变量void setup (void)
{Serial.begin (115200);  //波特率115200DHT11_init(5);           //使用Arduino的pin 5驱动DHT11delay(1000);
}void loop(void)
{switch (DHT11_read(&temperature,&humidity)){case DHT11_OK: Serial.print("Temperature:");Serial.print(temperature,DEC);Serial.print("°C");Serial.print("  Humidity:");Serial.print(humidity,DEC);Serial.println("%RH");break;case DHT11_TIMEOUT: Serial.println("time out");  break;case DHT11_CHECKERROR: Serial.println("check error"); break;default: Serial.println("unknown error");  break;}delay(2000);}

Arduino社区贡献的DHT11库

在DFRobot DHT11使用教程页面的【样例代码】一节找到【下载样例程序和库文件】,点击即可下载Arduino社区开发的DHT11驱动库。

下载后完成后,解压出来。在Arduino安装目录下的【librraies】目录下新建文件夹【dht11】,并将解压出来的dht11.cpp和dht11.h复制到新建的【dht11】文件夹下,即可完成库的安装。

安装到Arduino的【librraies】目录下的库使用#include <xxx>的方式来包含其头文件。例如下面的测试代码:

//
//   FILE:  dht11_test1.pde
// PURPOSE: DHT11 library test sketch for Arduino
//
#include <dht11.h>     //包含驱动库的头文件
dht11 DHT;             //创建一个dht11模块对象
#define DHT11_PIN 4void setup(){Serial.begin(9600);   Serial.println("DHT TEST PROGRAM ");Serial.print("LIBRARY VERSION: ");Serial.println(DHT11LIB_VERSION);Serial.println();Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}void loop(){int chk;Serial.print("DHT11, \t");chk = DHT.read(DHT11_PIN);    // READ DATAswitch (chk){case DHTLIB_OK:  Serial.print("OK,\t"); break;case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); break;case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break;default: Serial.print("Unknown error,\t"); break;}// DISPLAT DATASerial.print(DHT.humidity,1);Serial.print(",\t");Serial.println(DHT.temperature,1);delay(2000);
}

本文参考资料

DHT11官方手册

DFRobot DHT11模块

DFRobot DHT11使用教程

转载于:https://www.cnblogs.com/lulipro/p/10815338.html

DHT11温湿度传感器模块使用方法和驱动代码实现相关推荐

  1. Arduino DHT11温湿度传感器模块的使用(安装对应库和代码)

    最近需要使用DHT11完成开发,发现arduino官方找不到dht11模块的对应库和驱动,网上搜寻很久,分享一个可以实际使用的方法. 1.安装下面的两个dht11库. 都在里面了,自行下载安装就可以 ...

  2. ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】

    目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...

  3. 玩转传感器——DHT11温湿度传感器(STM32版)

    玩转传感器--DHT11温湿度传感器(STM32版) 文章目录 玩转传感器--DHT11温湿度传感器(STM32版) 前言 一.接口说明 1 接线图 2 电源引脚 3 串行接口(单线双向) 二.通信过 ...

  4. 基于STM32的DHT11温湿度传感器设计

    文章目录 前言 一.DHT11温湿度传感器是什么? 二.DHT11驱动程序详解 1.相关宏定义 2.输入输出GPIO配置 2.GPIO初始化设计 3.检测DHT11是否正常工作 4.读取DHT11数据 ...

  5. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  6. Arduino开发板使用DHT11温湿度传感器的方法

    在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备.简单地说,我们将使用Arduino和DHT11传感器设计数字湿度和温度计,并将 ...

  7. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  8. 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

    目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...

  9. ESP8266+DHT11温湿度传感器+小爱同学语音智能LED灯(状态可视化)

    ESP8266+DHT11温湿度传感器+LED灯(状态可视化) 接线(继电器与DHT11模块的GND与VCC分别对应接好ESP8266即可,下表只列出信号线接法): 模块 ESP8266 继电器IN ...

最新文章

  1. 基于FPGA实现的MobileNet V1,FPGA深度学习加速器设计 CNN Accelerators based on FPGAs
  2. 反射机制(1)认识Class类
  3. 如何将网站升级为HTTPS协议?
  4. 在2019年,如何成为更好的Node.js开发者?
  5. Leetcode 144. 二叉树的前序遍历 (每日一题 20210820)
  6. python ftp上传_Python FTP传输的简单示例
  7. CUDA学习(三十六)
  8. Linux中如何针对用户及组设置磁盘配额
  9. 最新游戏帐号交易平台源码+支持游戏币交易
  10. ubuntu中颜色拾取器的安装以及16进制ARGB值在线转颜色
  11. GlobalMapper20脚本应用(数据批量自动化处理)
  12. 1人30天44587行代码,分享舍得网开发经验
  13. 科学计算机怎么输入角度,怎么用科学计算器算角度
  14. Excel——如何批量从身份证号码中提取出年龄
  15. 如何实现打开网页自动弹出QQ对话框
  16. IBM笔记本电池保养细则
  17. TCP通讯中发送文件
  18. jQuery选择器详细介绍
  19. 卷积神经网络常见模块
  20. 入手评测 天玑1200和骁龙865对比哪个好

热门文章

  1. pinia中文文档 指导文档中文翻译版 pinia指导中文翻译
  2. 服务 自动启动参数_使用ansible部署springboot系列02服务托管与jvm参数管理
  3. mysql日期教程_MySQL日期函数详解
  4. 苦于E63没有秒表,网上找的不好用,就自己写个简单的
  5. GO语言学习之路11
  6. linux mint 16 安装chrome 浏览器
  7. Apache mod_rewrite规则重写的标志一览
  8. 用windbg分析minidump
  9. switch分解试验部分-LAB8:SVI实验
  10. Apache Gobblin 分布式大数据集成框架