用STM32和DHT11实现温湿度测量和报警

用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 STM32\r\n");
	printf("DHT11 TEST\r\n");
	while(DHT11_Init())	//DHT11初始化	
	{
		printf("DHT11 Error\r\n");
		delay_ms(200);
		LED3=!LED3;//LED3闪烁表示DHT11初始化失败
	}
    LED3=1;	
	printf("DHT11 OK\r\n");
	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改为其他数值,当温度超过预设温度的时候,蜂鸣器会间断发声。
欢迎大家批评指正!

  • 17
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值