0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32+DHT11监测环境的温湿度

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-17 09:22 次阅读

【1】DHT11传感器

DHT11是一种数字温湿度传感器,能够通过数字信号输出当前环境的温度和湿度值。DHT11可以通过一条数据信号线连接到微控制器或其他外设,从而实现温湿度的实时测量和数据读取。

DHT11采用单总线通信协议,只需要连接一个数字信号线和两个电源线,即可实现传感器的数据读取。传感器本身具有一定的温度和湿度校准能力,因此输出的数据比较可靠。

DHT11传感器的测量范围为0~50°C的温度和20%~90%的相对湿度,测量精度为±2°C和±5%RH。

【2】通信协议

DHT11采用单总线通信协议,使用一条数据信号线来传输数据,其中包括起始信号、数据位和校验位。通信协议如下:

  1. 主机发送一个开始信号给DHT11,即将数据信号线拉低至少18ms以上。
  2. 主机发出启动信号之后,拉低数据线至少80us,在这个过程中,DHT11将会检测到主机发送的启动信号,并做出回应。
  3. DHT11响应主机发出的启动信号后,会拉高数据信号线至少80us,表示传输数据前的“准备工作”已经完成。
  4. DHT11开始向主机发送数据,每个数据包包含40个位,高位先传输。在数据传输的过程中,DHT11会将数据信号线从低电平转换为高电平,表示1的开始,持续时间2628us,然后将数据线拉低,表示0的开始,持续时间70us。
  5. 在发送完40位数据后,DHT11会发送一个校验位。校验位的计算方法是将前四个字节数据相加,求出一个8位校验码,将此校验码与第五个字节进行比较,如果相等,则数据传输成功,否则需要重传数据。
  6. 主机接收到数据后,需要将数据信号线拉高,以结束传输。

【3】读取DHT11温湿度数据

以下是一个读取DHT11传感器的温度和湿度示例代码:

Copy Code#include "stm32f10x.h"
#include "dht11.h"
​
#define DHT11_GPIO_PORT GPIOB
#define DHT11_GPIO_PIN GPIO_Pin_12
​
void delay_us(uint32_t us)
{
  us *= (SystemCoreClock / 1000000) / 5;
  while (--us);
}
​
void dht11_start(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
​
  GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
​
  GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
​
  /* 发送开始信号 */
  GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN);
  delay_us(18000);
​
  GPIO_SetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN);
  delay_us(40);
​
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
​
  GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
}
​
uint16_t dht11_read_bit(void)
{
  uint16_t retry = 0;
​
  while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET) {
    retry++;
    if (retry > 1000) {
      return 0;
     }
    delay_us(1);
   }
​
  retry = 0;
​
  while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == SET) {
    retry++;
    if (retry > 1000) {
      return 0;
     }
    delay_us(1);
   }
​
  if (retry < 30) {
         return 0;
     } else {
         return 1;
     }
 }
 ​
 uint8_t dht11_read_byte(void)
 {
     uint8_t i;
     uint8_t data = 0;
 ​
     for (i = 0; i < 8; i++) {
         data <<= 1;
         if (dht11_read_bit()) {
             data |= 0x01;
         }
     }
 ​
     return data;
 }
 ​
 uint8_t dht11_read_data(dht11_data_t *data)
 {
     uint8_t i;
     uint8_t buf[5];
     uint8_t checksum = 0;
 ​
     dht11_start();
 ​
     if (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET) {
         /* 等待DHT11响应 */
         while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == RESET);
 ​
         /* 等待DHT11发射数据 */
         while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == SET);
 ​
         /* 接收数据 */
         for (i = 0; i < 5; i++) {
             buf[i] = dht11_read_byte();
         }
 ​
         /* 校验和 */
         checksum = buf[0] + buf[1] + buf[2] + buf[3];
 ​
         if (checksum == buf[4]) {
             data->humidity = buf[0];
      data->temperature = buf[2];
      return 1;
     }
   }
​
  return 0;
}
​
int main(void)
{
  dht11_data_t data;
​
  GPIO_InitTypeDef GPIO_InitStruct;
​
  /* 使能GPIOB时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
​
  /* 配置DHT11引脚为输入模式 */
  GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
​
  GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
​
  while (1) {
    if (dht11_read_data(&data)) {
      printf("Temperature: %d°C   Humidity: %d%%n", data.temperature, data.humidity);
     } else {
      printf("Error reading data from DHT11.n");
     }
    delay_us(2000000);
   }
}

在这个示例代码中,首先定义了一个dht11_data_t结构体,用于保存读取的温度和湿度数据。然后,编写了一些函数来执行DHT11读取操作。

delay_us()函数是一个简单的延迟函数,用于等待一定量的时间。需要精确地计算一个微秒的延迟,并在循环中使用该延迟来等待一段时间。

dht11_start()函数用于发送DHT11的开始信号。将DHT11引脚配置为输出模式,并发送18毫秒的低电平信号,然后再发送40微秒的高电平信号。

dht11_read_bit()函数用于读取DHT11传输的数据位。等待DHT11输出信号的变化,并根据变化的时间来判断数据位的值。如果一个数据位的响应时间小于30微秒,则被判定为0,否则为1。

dht11_read_byte()函数用于读取一个字节的数据(8个数据位)。通过调用dht11_read_bit()函数8次来读取每个数据位,并将结果组合成一个字节。

dht11_read_data()函数用于读取整个DHT11数据包,包括温度、湿度和校验和。首先调用dht11_start()函数发送开始信号,然后等待DHT11发送数据。使用dht11_read_byte()函数读取5个字节的数据,并验证校验和以确保数据完整和正确。

最后,在main()函数中,初始化GPIO口和DHT11传感器,并执行一个循环来读取数据。如果读取成功,则将温度和湿度打印到串口终端上,否则输出错误信息


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48093

    浏览量

    740053
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620828
  • 通信协议
    +关注

    关注

    28

    文章

    737

    浏览量

    39745
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738
  • DHT11
    +关注

    关注

    19

    文章

    264

    浏览量

    57175
收藏 人收藏

    评论

    相关推荐

    基于51单片机的SHT11温湿度监测系统,LCD1602显示,上下限按键设置

    正常后,LED灯熄灭,蜂鸣器关闭。 系统框架 温湿度监测系统主要是利用AT89C51单片机最小系统为核心,包括晶振电路、复位电路和排阻电路。 SHT11温湿度传感器对
    发表于 03-26 17:44

    【原创】DHT11传感器温湿度监测系统毕设,论文、代码、原理图和仿真介绍

    设计要求 1.设计一个基于51单片机和DHT11传感器的温湿度监测系统; 2.传感器DHT11实现对环境
    发表于 03-13 00:53

    广州海谷高温型温湿度变送器:为工业环境提供稳定、精确的温湿度监测

    广州海谷的WT04S高温型温湿度变送器,以其优秀的性能和稳定性,为工业环境中的温湿度监测提供了有力支持。这款变送器采用了独立式薄膜型湿敏电容作为湿度
    的头像 发表于 01-22 16:38 360次阅读
    广州海谷高温型<b class='flag-5'>温湿度</b>变送器:为工业<b class='flag-5'>环境</b>提供稳定、精确的<b class='flag-5'>温湿度</b><b class='flag-5'>监测</b>

    Arduino篇—自制温湿度测量仪

    DHT11数字温湿度传感器:DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器
    的头像 发表于 11-02 10:16 777次阅读
    Arduino篇—自制<b class='flag-5'>温湿度</b>测量仪

    基于瑞萨单片机的环境温湿度监测装置设计

    今日跟大家分享下瑞萨RA创意氛围赛选手的项目——基于瑞萨单片机的环境温湿度监测装置。
    的头像 发表于 10-16 16:28 462次阅读
    基于瑞萨单片机的<b class='flag-5'>环境</b><b class='flag-5'>温湿度</b><b class='flag-5'>监测</b>装置设计

    DHT11数字温湿度传感器主要参数

    一.DHT11介绍 DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,采用专用的数字模块采集技术和温湿度传感技术,
    的头像 发表于 09-11 11:17 5441次阅读
    <b class='flag-5'>DHT11</b>数字<b class='flag-5'>温湿度</b>传感器主要参数

    基于STM32DHT11温湿度数据采集仿真设计

    通过STM32采集DHT11温度传感器的数据,将温湿度信息显示在LCD显示屏上及虚拟串口上。
    的头像 发表于 09-01 09:32 1033次阅读
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>DHT11</b><b class='flag-5'>温湿度</b>数据采集仿真设计

    基于STM32大棚DHT11温湿度监测protues仿真设计

    基于‍STM32大棚DHT11温湿度监测protues仿真设计
    的头像 发表于 08-31 14:51 1008次阅读
    基于<b class='flag-5'>STM32</b>大棚<b class='flag-5'>DHT11</b><b class='flag-5'>温湿度</b><b class='flag-5'>监测</b>protues仿真设计

    XKCON祥控红酒储藏窖环境温湿度在线监测系统

    XKCON祥控红酒储藏窖环境温湿度在线监测系统由环境温湿度检测仪、监控主机与软件监控系统三部分组成,具备数据采集、多重报警等功能。
    的头像 发表于 08-07 16:37 464次阅读
    XKCON祥控红酒储藏窖<b class='flag-5'>环境</b><b class='flag-5'>温湿度</b>在线<b class='flag-5'>监测</b>系统

    基于PIC18系列单片机的DHT11温湿度采集系统设计

    基于PIC18系列(PIC18F4520)单片机+DHT11温湿度采集系统的设计与制作(Proteus仿真部分)
    的头像 发表于 06-16 16:36 686次阅读
    基于PIC18系列单片机的<b class='flag-5'>DHT11</b><b class='flag-5'>温湿度</b>采集系统设计

    DHT11驱动通过串口打印采集到的环境温湿度数据

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度综合传感器,常用于暖通空调、汽车、除湿器、自动控制等领域。
    发表于 06-13 15:25 690次阅读
    <b class='flag-5'>DHT11</b>驱动通过串口打印采集到的<b class='flag-5'>环境</b><b class='flag-5'>温湿度</b>数据

    STC89C52+DHT20设计的环境温湿度检测仪

    本项目基于STC89C52单片机和DHT20温湿度传感器,实现了一款环境温湿度检测仪。通过传感器采集环境的温度和
    的头像 发表于 05-26 09:13 3017次阅读
    STC89C52+<b class='flag-5'>DHT</b>20设计的<b class='flag-5'>环境</b><b class='flag-5'>温湿度</b>检测仪

    使用ESP8266驱动DHT11温湿度传感器

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度综合传感器,在Arduino提高篇中已对其进行了介绍,本篇使用ESP8266来驱动IOT Kit板载DHT11
    的头像 发表于 05-19 14:20 4525次阅读
    使用ESP8266驱动<b class='flag-5'>DHT11</b><b class='flag-5'>温湿度</b>传感器

    CH32V103基础教程71-温湿度及RTC显示

    本章教程主要使用温湿度传感器(DHT11)读取周围环境温湿度并通过OLED屏显示,同时显示时间。本章教程在第十二章、第六十九章、第七十章基础上进行,可以看作这三章的综合应用 1、IIC
    发表于 05-06 15:46

    【沁恒 CH32V208 开发板免费试用】CH32V208读取DHT11温湿度

    五一假期快结束了,我要加快进度完成测评了。下一个帖子做什么我纠结了很久。突然想起来我手里有一个DHT11温湿度传感器,好吧,用这个开发板读一下温湿度吧。DHT11是一款有已校准数字信
    发表于 05-03 09:46