STM32
直播中

xymbmcu

12年用户 1040经验值
擅长:可编程逻辑
私信 关注
[问答]

如何去实现一种基于STM32和DHT11的温湿度测量和报警系统

DHT11数字温湿度传感器的特点是什么?
如何去实现一种基于STM32和DHT11的温湿度测量和报警系统?

回帖(1)

刘润生

2021-9-29 16:21:09
  用STM32和DHT11实现温湿度测量和报警
  最近到手了一块正点原子Nano板,上手试了试温湿度测量的功能,将配套的代码改了一下,就能够实现高温蜂鸣器报警了。
  DHT11传感器
  先来介绍一下DHT11数字温湿度传感器。
  这是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
  这就是图片啦,插到Nano板的时候要之一网孔多的那一面要向外(板子的手册这么写的)
  部分代码
  #include “sys.h”
  #include “delay.h”
  #include “usart.h”
  #include “led.h”
  #include “smg.h”
  #include “timer.h”
  #include “dht11.h”
  #include “beep.h”
  u8 smg_num[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};
  u8 smg_wei=2;//数码管位选
  u8 num=0;//数值
  u16 led_t=0;//led统计时间
  u16 dht11_t=0;//dht11采样时间
  u8 temperature;//温度值
  u8 humidity;//湿度值
  int main(void)
  {
  HAL_Init(); //初始化HAL库
  Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,73M
  delay_init(72); //初始化延时函数
  BEEP_Init(); //初始化蜂鸣器端口
  uart_init(115200); //串口初始化为115200
  LED_Init(); //初始化与LED连接的硬件接口
  LED_SMG_Init(); //数码管初始化
  printf(“NANO STM32rn”);
  printf(“DHT11 TESTrn”);
  while(DHT11_Init()) //DHT11初始化
  {
  printf(“DHT11 Errorrn”);
  delay_ms(200);
  LED3=!LED3;//LED3闪烁表示DHT11初始化失败
  }
  LED3=1;
  printf(“DHT11 OKrn”);
  TIM3_Init(19,7199);//数码管2ms定时显示
  while(1)
  {
  }
  }
  //回调函数,定时器中断服务函数调用
  void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  {
  if(htim==(&TIM3_Handler))
  {
  dht11_t++;
  if(dht11_t==500)//DHT11 1S采样
  {
  dht11_t=0;
  DHT11_Read_Data(&temperature,&humidity);//读取温湿度值
  if(temperature》33)
  {
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); //BEEP引脚拉低,响,等同BEEP=0;
  delay_ms(300);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //BEEP引脚拉高,不响,等同BEEP=1;
  delay_ms(300);
  }
  }
  switch(smg_wei)
  {
  case 2: num = smg_num[temperature/10]; break;//温度值
  case 3: num =smg_num[temperature%10];break;
  case 6: num = smg_num[humidity/10]; break;//湿度值
  case 7: num =smg_num[humidity%10];break;
  }
  LED_Write_Data(num,smg_wei);//写数据到数码管
  LED_Refresh();//更新显示
  smg_wei++;
  if(smg_wei==4) smg_wei=6;
  if(smg_wei==8) smg_wei=2;
  led_t++;
  if(led_t==250)//LED每500ms闪烁
  {
  led_t=0;
  LED0=!LED0;
  }
  }
  }
  以上是main函数的代码,其他部分没有更改,代码里出现串口是因为我还想实现串口通信,但是发现板子资料中的函数的写法好像和视频教程中的不太一样,所以还在摸索中…
  更改预设温度
  代码中在以下这一行更改预设温度
  if(temperature》33) 将33改为其他数值,当温度超过预设温度的时候,蜂鸣器会间断发声。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分