温度探测器的工作原理(远程温湿度实时监测系统操作)

1温湿度检测器简介

(1)一种用于监测室内温度湿度的仪器。

(2)以先进的单片机为控制核心,采用进口高性能温湿度传感器,

(3)同时对温度、湿度信号进行测量控制,并实现液晶数字显示,

(4)还可通过按键对温、湿度分别进行上、下限设置和显示

(5)从而使仪表可以根据现场情况,自动启动风扇或加热器,对被测环境的实际温、湿度自动调节的设备。

温度探测器的工作原理(远程温湿度实时监测系统操作)

2温湿度检测器应用场景

(1)数据机房:漏水、配电、温湿度、烟感、门禁、UPS、空调等;

(2)配电机房:UPS、电流、电压、开关状态、发电机、蓄电池、电源、烟感等监测;

(3)仓库环境:如粮食、烟草、医药、化工、食品等,主要为温湿度、气体含量、水质、酸碱度等;

(4)管网节点:煤气、石油管道、铁路、隧道环境等;

(5)企业车间、商场等重要区域:环境,消防等监测。

3温湿度检测器功能

(1)实时模式:主要显示从DHT11获取到的实时数据;

(2)温度模式:主要显示温度的实时数据及上下限;

(3)湿度模式:主要显示湿度的实时数据及上下限;

(4)按键用来切换模式及设置温度及湿度的上下限;

(5)流水灯和蜂鸣器用来提醒用户及超出上下限的报警;

(6)虽然我们用的是 LCD1602,但是基本的功能逻辑是一样的。

功能流程图

温湿度检测器引脚分配

温湿度检测器使用知识点

4温湿度检测器实现

温湿度检测器的代码编写,在day20教程基础上完成。

4.1 全局变量定义

u8 dht_data[5] = {0}; // DHT11获取到数据存放的数组u8 sys_mode = 0; // 系统模式 0 实时模式 1 温度模式 2 湿度模式 u8 maxormin_flag = 0; // 最大最小值标志 0 最大值 1 最小值u8 tem_max = 25; // 温度最大值u8 tem_min = 19; // 温度最小值u8 humi_max = 19; // 湿度最大值u8 humi_min = 13; // 湿度最小值u8 maxormin_str[10] = {0}; // 显示内容数组

4.2 定时器2中断服务函数,用于定时读取温湿度信息

void TIM2_IRQHandler(void) //TIM2 中断{ if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查 TIM2 更新中断发生与否 { dht11_read_data(dht_data); LED2 = !LED2; TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中断标志 }}

4.3 按键0中断服务函数,用于设定模式

void EXTI0_IRQHandler(void) // 外部中断 EXTI0 的中断服务程序{ if(EXTI_GetITStatus(EXTI_Line0) != RESET)// 获取 LINE0 的状态,判断 KEY1 是否按下 { printf(“KEY1 \r\n”);// 输出 KEY1 到串口调试助手 beep_tips();// 蜂鸣器提醒用户 KEY1 按下 sys_mode ; if (sys_mode >= 3) sys_mode = 0; maxormin_flag = 0; LED1 = 0; BEEP = 0; EXTI_ClearITPendingBit(EXTI_Line0); // 清除 LINE0 上的中断标志位 }}

4.4 按键1中断服务函数,用于选择大小值

void EXTI1_IRQHandler(void) // 外部中断 EXTI1 的中断服务程序{ if(EXTI_GetITStatus(EXTI_Line1)!=RESET) // 获取 LINE1 的状态,判断 KEY2 是否按下 { printf(“KEY2 \r\n”); // 输出 KEY2 到串口调试助手 beep_tips(); // 蜂鸣器提醒用户 KEY2 按下 maxormin_flag = !maxormin_flag; EXTI_ClearITPendingBit(EXTI_Line1); // 清除 LINE1 上的中断标志位 }}

4.5 按键2中断服务函数,用于将最大值加1,如果当前选择的是温度最大值,按一次按键此值加1,如果当前选择的是湿度最大值,按一次按键则此值加1

void EXTI2_IRQHandler(void)// 外部中断 EXTI2 的中断服务程序{ if(EXTI_GetITStatus(EXTI_Line2)!=RESET) // 获取 LINE2 的状态,判断 KEY3 是否按下 { printf(“KEY3 \r\n”); // 输出 KEY3 到串口调试助手 beep_tips(); // 蜂鸣器提醒用户 KEY3 按下 if (sys_mode == 1) { if (maxormin_flag == 0) { tem_max ; } else { tem_min ; } } else if (sys_mode == 2) { if (maxormin_flag == 0) { humi_max ; } else{ humi_min ; } } EXTI_ClearITPendingBit(EXTI_Line2); // 清除 LINE2 上的中断标志位 }}

4.6 按键3中断服务函数,用于将最小值减1,如果当前选择的是温度最小值,按一次按键此值减1,如果当前选择的是湿度最小值,按一次按键则此值减1

void EXTI3_IRQHandler(void)// 外部中断 EXTI3 的中断服务程序{ if(EXTI_GetITStatus(EXTI_Line3)!=RESET) // 获取 LINE3 的状态,判断 KEY4 是否按下 { printf(“KEY4 \r\n”); // 输出 KEY4 到串口调试助手 beep_tips(); // 蜂鸣器提醒用户 KEY4 按下 EXTI_ClearITPendingBit(EXTI_Line3); // 清除 LINE3 上的中断标志位 if (sys_mode == 1) { if (maxormin_flag == 0) { tem_max–; } else { tem_min–; } } else if (sys_mode == 2) { if (maxormin_flag == 0){ humi_max–; } else { humi_min–; } } }}

4.7 主函数main中,局部变量定义

double temp_value = 0.0;// 用于存放温度数据的变量double humi_value = 0.0;// 用于存放湿度数据的变量u8 temp_str[10] = {0};// 用于存放温度数据的字符串数组u8 humi_str[10] = {0};// 用于存放湿度数据的字符串数组u8 key_data = 0; // 按键值

4.8 外设初始化函数

nvic_config(); // 中断分组的初始化delay_init();// 系统延时的初始化usart_init();// 串口通信的初始化tim2_init(4999,7199);// 10Khz 的计数频率,计数到 5000 为 500msled_init();beep_init(); key_exti_init(); lcd1602_init();// 外设 LCD1602 的初始化dht11_init();// 外设 DHT11 的初始化printf(“Hello world! \r\n”);lcd1602_write_string(1, 0, ” DHT Detector “);// 第一行显示 DHT Detectorlcd1602_write_string(2, 0, “T: H: “);// 第二行显示分别显示温湿度的实时数据

4.9 主函数while(1)中循环执行代码,根据不同的模式,显示不同的值

if (sys_mode == 0){ lcd1602_write_string(1, 0, ” DHT Detector “);// 第一行显示 DHT Detector humi_value = dht_data[0] dht_data[1]*0.01;// 计算湿度数据并存放在 humi_value 中 temp_value = dht_data[2] dht_data[3]*0.01;// 计算温度数据并存放在 humi_value 中 printf(“Temp: %.2f Humi: %.2f\r\n”,temp_value, humi_value);// 向串口打印输出温湿度数据 sprintf((char*)temp_str, “T:%.2f “, temp_value);//将温度数据转为字符串存放在temp_str中 sprintf((char*)humi_str, “H:%.2f”, humi_value); //将湿度数据转为字符串存放在temp_str中 lcd1602_write_string(2, 0, (char*)temp_str); // LCD1602 显示温度数据 lcd1602_write_string(2, 9, (char*)humi_str); // LCD1602 显示湿度数据 if ((temp_value > tem_max) || (temp_value < tem_min) || (humi_value > humi_max) || (humi_value < humi_min)) { LED1 = !LED1; BEEP = !BEEP; } else { LED1 = 0; BEEP = 0; } if (sys_mode != 0) { LED1 = 0; BEEP = 0; }}else if (sys_mode == 1){ humi_value = dht_data[0] dht_data[1]*0.01; temp_value = dht_data[2] dht_data[3]*0.01; sprintf((char*)temp_str, “T:%.2f “, temp_value); sprintf((char*)humi_str, “H:%.2f”, humi_value); lcd1602_write_string(1, 0, (char*)temp_str); lcd1602_write_string(1, 9, (char*)humi_str); sprintf((char*)maxormin_str, “Tmax:%d “, tem_max); lcd1602_write_string(2, 0, (char*)maxormin_str); sprintf((char*)maxormin_str, “Tmin:%d”, tem_min); lcd1602_write_string(2, 9, (char*)maxormin_str);}else if (sys_mode == 2){ humi_value = dht_data[0] dht_data[1]*0.01; temp_value = dht_data[2] dht_data[3]*0.01; sprintf((char*)temp_str, “T:%.2f “, temp_value); sprintf((char*)humi_str, “H:%.2f”, humi_value); lcd1602_write_string(1, 0, (char*)temp_str); lcd1602_write_string(1, 9, (char*)humi_str); sprintf((char*)maxormin_str, “Hmax:%d “, humi_max); lcd1602_write_string(2, 0, (char*)maxormin_str); sprintf((char*)maxormin_str, “Hmin:%d”, humi_min); lcd1602_write_string(2, 9, (char*)maxormin_str);}delay_ms(200);LED4 = !LED4;

以上代码实现了温湿度检测器的功能

扫码二维码

获取更多精彩

理工充电宝

发表评论

登录后才能评论