用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改为其他数值,当温度超过预设温度的时候,蜂鸣器会间断发声。
用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改为其他数值,当温度超过预设温度的时候,蜂鸣器会间断发声。
举报