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

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

3天内不再提示

基于物联网的远程温湿度监测系统(2)编写 DHT11 驱动

机智云 2022-04-25 14:28 次阅读

前言

本项目主要通过使用STM32F103C8T6作为主控MCUESP8266作为数据透传模块,接入机智云AIoT云平台,通过在线智能产品,实现了远程联网、温湿度监测、APP控制等功能。


在上文中,主要介绍了“创建云端产品,烧录Gagent”,以便让设备能够联网,当然其中也备注了ESP8266烧写Gagent固件时的注意事项,说明定义数据点的作用。


在本文中,从原理开始讲解,阐述DHT11驱动的编写。


进入正文

1、DHT11 简要介绍

DHT11 器件采用简化的单总线通信,DATA 引脚用于微处理器与 DHT11 之间的通讯和同步,一次传送 40 位数据,高位先出。

69ce4e64-c3ef-11ec-8521-dac502259ad0.png

举例:

69ed654c-c3ef-11ec-8521-dac502259ad0.png

2、时序分析(附代码)

用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,信号发送如图所示。

6a02e8e0-c3ef-11ec-8521-dac502259ad0.png

注意:主机(MCU)从 DHT11 读取的温湿度数据总是前一次的测量值。

总线空闲:

DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平,此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。

MCU 发出请求信号:

MCU I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后MCU I/O设置为输入状态。由于上拉电阻,MCU I/O 即 DHT11 的 DATA 数据线也随之变高,之后等待 DHT11 作出回答信号。

DHT11 发出应答信号:

当 DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80us的低电平作为应答信号,紧接着输出 80us 的高电平通知 MCU 准备接收数据,MCU I/O 此时处于输入状态,检测到 DHT11 回应信号后,等待 80us 的高电平后的数据接收。

6a17c288-c3ef-11ec-8521-dac502259ad0.png

MCU 接收 40 位数据

由 DHT11 的 DATA 引脚输出 40 位数据,MCU 根据 I/O 电平的变化来判断是 “0” 还是 “1” 。

位数据 “0” 的格式为:

50us 的低电平和 26-28us的高电平。

6a2ce62c-c3ef-11ec-8521-dac502259ad0.png

位数据 “1” 的格式为:

50us 的低电平加 70us 的高电平。

6a4ba6e8-c3ef-11ec-8521-dac502259ad0.png

DHT11 发出结束信号

DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50us 后转为输入状态,由于上拉电阻存在,变为高电平。

// 本驱动采用 HAL 库,us 级延时使用通用定时器实现,对 IO 引脚的状态的改变采用位操作以及直接寄存器操作

// 复位DHT11
void DHT11_Rst(void)
{                 
    DHT11_IO_OUT();   //设置为输出
  DHT11_DQ_OUT = 0;   //拉低
  HAL_Delay_ms(20);   //拉低至少18ms
  DHT11_DQ_OUT = 1;   //拉高 
  HAL_Delay_us(30);   //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)      
{   
uint8_t retry = 0;
  DHT11_IO_IN();      //设置为输入   
while(DHT11_DQ_IN && retry < 100)  //DHT11会拉低40~80us
  {
    retry++;
    HAL_Delay_us(1);
  }   
if(retry >= 100)
return 1;
else
    retry = 0;

while(!DHT11_DQ_IN && retry < 100)  //DHT11拉低后会再次拉高40~80us
  {
    retry++;
    HAL_Delay_us(1);
  }
if(retry >= 100)
return 1;      
return 0;
}

//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)        
{
uint8_t retry = 0;
while(DHT11_DQ_IN && retry < 100)//等待变为低电平
  {
    retry++;
    HAL_Delay_us(1);
  }
  retry = 0;
while(!DHT11_DQ_IN && retry < 100)//等待变高电平
  {
    retry++;
    HAL_Delay_us(1);
  }
  delay_us(40);//等待40us
if(DHT11_DQ_IN)
return 1;
else
return 0;       
}

//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        
uint8_t i,dat;
  dat = 0;
for (i=0;i<8;i++) 
  {
      dat <<= 1; 
      dat |= DHT11_Read_Bit();
  }                
return dat;
}

//从DHT11读取一次数据
//temp0~50°)
//humi20%~90%)
//返回值:0,正常;1,读取失败;2,校验和错误
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)    
{        
uint8_t buf[5];
uint8_t 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];  
      *temp = buf[2];
    }
else
return 2;  // 校验和错误
  }
else
return 1;
return 0;      
}

//初始化DHT11的 IO口, 同时检测DHT11的存在
//返回1:不存在
//返回0:存在        
uint8_t DHT11_Init(void)
{
  DHT11_GPIO_Init();

  DHT11_Rst();
return DHT11_Check();
}

3、使用串口观察数据

将 printf 函数重定向至与 PC 相连的串口上。由于重定向相关函数已经包含在机智云生成的代码中(gizwits_product.c),我们直接使用 printf 进行数据打印即可。

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}

以下为相关测试代码:

state = DHT11_Read_Data(&temperature, &humidity);
if(state == 2)
{
printf("the checksum is error\n");
}
else if(!state)
{
printf("temp = %d , humi = %d\n", temperature, humidity);
}
else
{
printf("DHT11 is not answer\n");
}

若采集到的数据没有问题,即可将机智云协议相关代码移植进工程中。

本文结束。


在下篇内容中,介绍结合STM32cubx实现机智云代码工程移植、采集数据上发、控制数据下拉、成品测试环节。

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

    关注

    2868

    文章

    41622

    浏览量

    358348
  • 监测系统
    +关注

    关注

    8

    文章

    2462

    浏览量

    80766
收藏 人收藏

    评论

    相关推荐

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

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

    【先楫HPM5361EVK开发板试用体验】温湿度传感器DHT11实践

    DHT11 接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11 不会主动进行温湿度采集。采集数据后转换到低速模式。 2
    发表于 01-03 23:46

    【LuckFox Pico 开发板免费试用】5.内核驱动温湿度传感器 DHT11

    前期写好的驱动,我这篇帖子也是基于此项目写的。 1. DHT11 简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合
    发表于 11-06 15:43

    Arduino篇—自制温湿度测量仪

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

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

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

    基于STM32的DHT11温湿度数据采集仿真设计

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

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

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

    立创·梁山派GD32F4】-DHT11温湿度传感器模块移植过程

    详情请跳转:https://lceda001.feishu.cn/wiki/JNvYwEU5SiGldFkNcxncYXhZnZc DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合
    发表于 08-30 15:15

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

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

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

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

    【CW32饭盒派开发板试用体验】+万互联之温湿度采集

    的网友或发现,上电采集的2次结果为0.这是因为DHT11温湿度传感器,上电有一定的启动时间。所以结果为0。 这是正常现象。我们可以在代码里面做优化处理。如下图所示: 延长程序的初始化时间,可以
    发表于 06-11 16:05

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

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

    STM32+DHT11监测环境的温湿度

    DHT11是一种数字温湿度传感器,能够通过数字信号输出当前环境的温度和湿度值。DHT11可以通过一条数据信号线连接到微控制器或其他外设,从而实现温湿
    的头像 发表于 05-17 09:22 3229次阅读
    STM32+<b class='flag-5'>DHT11</b><b class='flag-5'>监测</b>环境的<b class='flag-5'>温湿度</b>

    【CW32饭盒派开发板试用体验】DHT11温湿度检测

    毫秒采集一次数据并更新屏幕 { counttime=0; DHT11_Read_Data(&temperature,&humidity); // 读取温湿度
    发表于 05-08 19:43

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

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