本篇介绍STM32如何外接温湿度传感器实现当前环境温湿度的读取,并显示到OLED屏幕上。

1 DTH11温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件。

1.1 数据读取协议

微控制器MCU与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右

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

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

1.1.1 起始信号

总线空闲状态为高电平,MCU把总线拉低等待DHT11响应,MCU把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。

DHT11接收到主机的开始信号后,等待MCU的开始信号结束,然后发送80us低电平响应信号

MCU发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,MCU发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。

1.1.2 数据数字信号

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1

数字0和数字1的表示,如下面图示:

  • 数字0:50us低电平开始后,26-28us的高电平表示0
  • 数字1:50us低电平开始后,70us的高电平表示1

如果读取响应信号为高电平,则DHT11没有响应,需要检查线路是否连接正常。

当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

1.1.3 温湿度数据格式

一次完整的数据传输为40bit,高位先出。数据分小数部分和整数部分,数据格式:

  • 8bit湿度整数数据
  • 8bit湿度小数数据
  • 8bit温度整数数据
  • 8bit温度小数数据
  • 8bit校验和

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

1.2 硬件接线

DHT11的数据读取只需要一根线,我使用的是PB8,另外,OLED用来显示温湿度的值,使用IIC通信,使用的是PB6和PB7。

2 程序编写

根据DHT11的数据读取协议,编写对应的数据读取函数。

2.1 DHT11复位和检测响应函数

首先是MCU向DHT11发送的起始信号,拉低20ms,再拉高30us。

u8 DHT11RstAndCheck(void)
{u8 timer = 0;__set_PRIMASK(1);          //关总中断DHT11_OUT = 0;                //输出低电平delay_ms(20);            //拉低至少18msDHT11_OUT = 1;               //输出高电平delay_us(30);                //拉高20~40uswhile (!DHT11_IN)          //等待总线拉低,DHT11会拉低40~80us作为响应信号{timer++;               //总线拉低时计数delay_us(1);}if (timer>100 || timer<20) //判断响应时间{__set_PRIMASK(0);      //开总中断return 0;}timer = 0;while (DHT11_IN)           //等待DHT11释放总线,持续时间40~80us{timer++;               //总线拉高时计数delay_us(1);}__set_PRIMASK(0);          //开总中断if (timer>100 || timer<20) //检测响应信号之后的高电平{return 0;}return 1;
}

2.2 数据读取

MCU向DHT11发送起始信号后,就可以接收DHT11的数据返回了,一次读取湿度和温度即可。

/*读取一字节数据,返回值-读到的数据*/
u8 DHT11ReadByte(void)
{u8 i;u8 byt = 0;__set_PRIMASK(1);      //关总中断for (i=0; i<8; i++){while (DHT11_IN);  //等待低电平,数据位前都有50us低电平时隙while (!DHT11_IN); //等待高电平,开始传输数据位delay_us(40);byt <<= 1;         //因高位在前,所以左移byt,最低位补0if (DHT11_IN)      //将总线电平值读取到byt最低位中{byt |= 0x01;}}__set_PRIMASK(0);      //开总中断return byt;
}/*读取一次数据,返回参数:Humi-湿度,Temp-温度;返回值: 0-成功,1-失败*/
u8 DHT11ReadData(float *Humi, float *Temp)
{s8 sta = 0;u8 i;u8 buf[5];if (DHT11RstAndCheck())         //检测响应信号{for(i=0;i<5;i++)            //读取40位数据{buf[i]=DHT11ReadByte(); //读取1字节数据}if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) //校验成功{u8 H_inte = buf[0]; //湿度整数部分数据u8 H_frac = buf[1]; //湿度小数部分数据u8 T_inte = buf[2]; //温度整数部分数据u8 T_frac = buf[3]; //温度小数部分数据char tmp1[8], tmp2[8];sprintf(tmp1, "%d.%d",H_inte,H_frac);sscanf(tmp1, "%f", Humi);sprintf(tmp2, "%d.%d",T_inte,T_frac);sscanf(tmp2, "%f", Temp);}sta = 0;}else //响应失败返回-1{*Humi = 88; //响应失败返回-1*Temp = 88; //响应失败返回-1sta = 1;}return sta;
}

2.3 初始化

使用DHT11之前,进行引脚的初始化和器件的初始化。

/*DHT11初始化函数*/
u8 DHT11Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC端口时钟GPIO_SetBits(GPIOB,GPIO_Pin_8);                     //设置PC13输出高电平,(先设置引脚电平可以避免IO初始化过程中可能产生的毛刺)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;           //设置DHT11数据引脚->PC13GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    //设置为开漏输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //设置输出速率为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);             //初始化GPIOC端口return DHT11RstAndCheck();                          //返回DHT11状态
}

3 测试

在移植过U8g2库的hello_world例程上进行修改,在屏幕上显示温湿度。注意摄氏度单位的小圆圈,不知道怎么直接以符号的形式显示出来,我这里是单独画了一个小空心圆。

int main(void)
{   delay_init();       //延时函数初始化     LED_Init();           //初始化与LED连接的硬件接口IIC_Init();u8g2_t u8g2;u8g2Init(&u8g2);u8g2_SetFontMode(&u8g2, 1);u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);DHT11Init();float Temp = 0;float Humi = 0;char strTemp[32];char strHumi[32];while(1){u8g2_FirstPage(&u8g2);do{//draw(&u8g2);DHT11ReadData(&Humi, &Temp);sprintf(strTemp, "Temp: %.1f C", Temp);sprintf(strHumi, "Humi: %.1f %%", Humi);u8g2_ClearBuffer(&u8g2);u8g2_DrawStr(&u8g2, 0, 30, strTemp);u8g2_DrawCircle(&u8g2, 84, 22, 2, U8G2_DRAW_ALL);u8g2_DrawStr(&u8g2, 0, 60, strHumi);u8g2_SendBuffer(&u8g2);            delay_ms(3000);} while (u8g2_NextPage(&u8g2));}
}

测试效果如下:

4 总结

本篇介绍了如何在STM32上外接温湿度DHT11实现温湿度数据的读取,并通过OLED进行数据显示。

STM32外接DHT11显示温湿度相关推荐

  1. STM32单片机DHT11数字温湿度监测

    OLED液晶接口电路图 DHT11传感器接口电路图 STM32单片机DHT11数字温湿度监测程序源代码 #include "sys.h" #define LED_RED PBout ...

  2. 【嵌入式】51单片机+1602+dht11显示温湿度

    51单片机+1602+dht11显示温湿度例程代码如下: /*****************************************************************联系:请勿 ...

  3. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)

    参考:基于stm32软件IIC的oled显示温湿度 作者:ZPZ DayUp 发布时间: 2021-07-25 20:52:43 网址:https://blog.csdn.net/m0_5619768 ...

  4. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  5. STM32小项目之dht11在oled上显示温湿度

    前言: 实现一个简单的功能,最终多个功能合起来,就是一个大项目,也叫模块化编程:本篇文章不在讲述oled的用法和代码,因为代码太多了,粘不过来,需要的可以去看我另一篇文章专门讲解oled的. 本文牵扯 ...

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

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

  7. 基于STM32和ATH20实现OLED显示温湿度

    基于STM32和ATH20实现OLED显示温湿度 什么是OLED 一.主要代码 二. 硬件连接及结果 1.硬件连接 2.烧录显示 总结 参考文献 什么是OLED 有机电致发光器件(OLED)属于低电压 ...

  8. 【正点原子STM32连载】第四十章 DHT11数字温湿度传感器 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  9. 基于STM32大棚DHT11温湿度监测的Proteus仿真

    本设计仅供学习参考 基于STM32大棚DHT11温湿度监测的Proteus仿真 (代码+仿真+原理图+PCB) 原理图:Altium Designer 仿真图protues 8.9 程序编译器:kei ...

  10. android温湿度传感节点指令源代码,Arduino+DHT11+OLED显示温湿度信息(附详细文档+源码)...

    设计者:STCode (公众号同名) 第一章 绪论 1.1实训设计背景与意义 随着生活水平的提高和科技水平的发展,人们对自身和家庭安全方面的考虑也越来越多,越来越多的安全监测系统和设备进入到人们的生活 ...

最新文章

  1. 51CTO学院薛大龙软考班,再努力一点点就能成功了
  2. 在JavaScript中使用inline函数的问题
  3. 数据流重定向和管道命令, grep, tr,sort, wc, cut,split,tee,sleep(shell 02)
  4. 网易云课堂计算机体系,计算机系统结构 (三) CPU及其结构分析
  5. 一文带你了解隐马尔科夫模型
  6. [转帖]Mootools源码分析-49 -- Asset
  7. matlab肌电信号平滑滤波_MATLAB图像处理:43:用高斯平滑滤波器处理图像
  8. OmniConverter: Mac上的最简单好用的免费全能音视频转换器
  9. cron在线生成表达式
  10. c语言图形显示功能,C语言图形编程(二、图形显示).doc
  11. ceph peering流程分析
  12. 11_05.【Java】线程安全与线程同步
  13. lv官网编码查询_成都市居住证编号查询系统
  14. CDH安全认证及使用
  15. 10套精美而实用的CSS3按钮
  16. 二手房房源信息数据分析项目完整流程
  17. [ 网络协议篇 ] IGP 详解之 OSPF 详解(二)--- 四种网络类型 虚链路 详解
  18. 怎样设置txt的默认打开方式(比如用nodePad++)
  19. 任正非:外界过分吹捧华为,导致员工惰怠,华为必须保持清醒
  20. 用纯CSS3实现QQ LOGO

热门文章

  1. 【OPNsense】广东电信拨号用户通过OPNsense获取原生IPV6地址
  2. 企业微信网页应用开发 - 消息/事件回调接口
  3. Office卸载不干净,注册表项权限修改后仍然无法删除的问题
  4. STM32单片机中定义结构体类型指针
  5. HTML5 通过Vedio标签实现视频循环播放
  6. 使用Kettle读取Excel文件中的数据,存储在MySQL中
  7. PM-项目管理(Project Management)
  8. Android的Holo Theme
  9. 【PMP】风险应对策略
  10. 32. Make Sure public inheritance models is-a.