基于stm32的多节点温度打印报警器

作品简介
该作品是基于stm32为控制器设计的多节点温度巡检系统,通过巡检将温度在显示屏上显示,同时将温度发送到电脑终端。
同时还具备定时报警和超温报警功能,系统采用ucosii系统实现。蜂鸣器的鸣响来实现报警。
设计原理
我们知道DS18B20是总线式数字报警器,每一个温度传感器只需要一根线就能实现温度传感器寄存器的设置与读取,只不过是需要
一定的时序要求完成。
本设计中还有AT24C02存储器的加入,存储器用来保存温度的报警阈值值。

通过ucosii建立4个任务。
任务1是报警轮巡检测任务,主要定时检测当前8个节点温度。检测温度的定时
时间精度1分钟可用串口设置。
任务2是按键轮训检测任务,主要检测是否有按键按下。此任务中可实现
当前时间的校准,节点1-8的温度查看,精度0.1℃,节点1-8报警阈值的设置。
任务3是报警任务分析,此任务中判断读取的温度是否超过设置的报警阈值,
如果超过,蜂鸣器鸣响,并将温度上报至上位机。
任务4是AT指令设置任务,该任务通过串口实现,通过在上位机的串口中输入AT指令
对设备的当前时间进行校准,报警阈值进行设定,定时巡检进行设定。

当前时间使用单片机的定时器3timer3实现500ms中断,经测试,时间误差在0.1s。
timer2实现ucosii操作系统的脉冲心脏,为ucosii提供时钟。
系统滴答systick,实现延时,为DS18B20,LCD1602,at24c02,提供精准延时。
串口1 中断接收来自上位机的指令。

接口定义

PB8--PB15======D0--D7
PB1==RS
PB2==EN
PA0-PA7========T0--T7
PA9-PA10=======UART1--UART2
PA8====K1
PA11====K2
PA12====K3
PB0====BEE
PC6==REDIR
   ==AT24C_SCK--AT24C_SDA
/*按键使用说明*/
左→右  K1 K2 K3
先按下K1一次,再 按K2是对当前时间的分钟位进行设定加。
再按下K1一次,再 按K2是对当前时间的小时位进行设定加。
再按下K1一次,退出当前时间的设定。

先按下K3一次,切换到T0时间,温度显示界面。
先按下K1一次,再 按K2是对温度T0报警阈值进行设定加。
再按下K1一次,退出当前时间的设定。

先按下K3一次,切换到T1时间,温度显示界面。
先按下K1一次,再 按K2是对温度T1报警阈值进行设定加。
再按下K1一次,退出当前时间的设定。


先按下K3一次,切换到T2时间,温度显示界面。
先按下K1一次,再 按K2是对温度T1报警阈值进行设定加。
再按下K1一次,退出当前时间的设定。

查看T3-T8一样。

AT指令设置说明
1设置当前时间 (24时)
  AT T0  xx yy  xx:00-23 yy:0-59
  例:设置当前时间为18:23  AT T0 18 23
2 设置第n个的报警阈值为m (n为1-8)(m为1-50)
  AT Tn  m
  例 设置第一个节点的温度阈值为25
      AT T1 25
3 设置定时上报时间n分钟
  AT CNT  n (n为1-255)

硬件电路图

                     控制器                                                                                                  LCD1602显示器

1.jpg2.jpg

                                                                                 AT24C02电路

                 3.jpg4.jpg

                               8路传感器

                          JTAG口

5.jpg

 

源码分析

此部分代码包括温度传感器的初始化,和记录温度的获得和打印。

void TemCheckTask(void *p_arg)// 
 {
 u8 i;

u8 Prompt[18]="current time:     ";
u8 Prompt1[18]="      00:00       ";
 DebugOut(0, "\r\n  Into WENDU TASK!");
 ClearScreen();
  ShowString(0,0,Prompt);   //LCD1602初始化
 ShowString(0,1,Prompt1);
 sfm(6,shi);
 sfm(9,fen);
 tempre_para.Tmr_flg=1;
 DS18B20_Init(1);
 DS18B20_Init(2);
 DS18B20_Init(3);
 DS18B20_Init(4);
 DS18B20_Init(5);
 DS18B20_Init(6);
 DS18B20_Init(7);
 DS18B20_Init(8);
   while(1)
   {
  
  
   tempre_para.T1_va=DS18B20_Get_Temp(1);
   tempre_para.T1_m=tempre_para.T1_va%100%10;//十分位
   tempre_para.T1_val=tempre_para.T1_va/10;//小数点前边
 
   tempre_para.T2_va=DS18B20_Get_Temp(2);
   tempre_para.T2_m=tempre_para.T2_va%100%10;//十分位
   tempre_para.T2_val=tempre_para.T2_va/10;
  
   tempre_para.T3_va=DS18B20_Get_Temp(3);
   tempre_para.T3_m=tempre_para.T3_va%100%10;//十分位
   tempre_para.T3_val=tempre_para.T3_va/10;
  
   tempre_para.T4_va=DS18B20_Get_Temp(4);
    tempre_para.T4_m=tempre_para.T4_va%100%10;//十分位
   tempre_para.T4_val=tempre_para.T4_va/10;

  
 
   tempre_para.T5_va=DS18B20_Get_Temp(5);
     tempre_para.T5_m=tempre_para.T5_va%100%10;//十分位
   tempre_para.T5_val=tempre_para.T5_va/10;
 
   tempre_para.T6_va=DS18B20_Get_Temp(6);
    tempre_para.T6_m=tempre_para.T6_va%100%10;//十分位
   tempre_para.T6_val=tempre_para.T6_va/10;
  
   tempre_para.T7_va=DS18B20_Get_Temp(7); 
  

 tempre_para.T7_val=0;
   tempre_para.T7_m=tempre_para.T7_va%100%10;//十分位
   tempre_para.T7_val=tempre_para.T7_va/10;

 
   
   tempre_para.T8_va=DS18B20_Get_Temp(8);
   tempre_para.T8_m=tempre_para.T8_va%100%10;//十分位
   tempre_para.T8_val=tempre_para.T8_va/10;
    

  OSTimeDly(3);

    
  
  }
 
 
 
 }

下面代码用来扫描键盘是否有输入

void keyLoop(void *p_arg)//                                                          


      
 tempre_para.Tmr_cnt=AT24CXX_ReadOneByte(T1_Addrstart);
    shi=AT24CXX_ReadOneByte(T0_Addrstart+1);
 fen=AT24CXX_ReadOneByte(T0_Addrstart);  
  DebugOut(0, "\r\n  Into key task!");
 
     while(1)
  {
 
   KEY_Scan();
   OSTimeDly(250);
  }

 
}

下面代码用来报警的任务

 void  Alarm_TASK(void *p_arg)
 {


   DebugOut(0, "\r\n  Into analysis task!");
   while(SysTick_Config(72000));
   DebugOut(0, "\r\n SysTick_Config ok!");
   tempre_para.T1_h=AT24CXX_ReadOneByte(T1_Addrstart+1);

 tempre_para.T2_h=AT24CXX_ReadOneByte(T2_Addrstart+1); 
 tempre_para.T3_h=AT24CXX_ReadOneByte(T3_Addrstart+1); 
 tempre_para.T4_h=AT24CXX_ReadOneByte(T4_Addrstart+1); 
 tempre_para.T5_h=AT24CXX_ReadOneByte(T5_Addrstart+1);  
 tempre_para.T6_h=AT24CXX_ReadOneByte(T6_Addrstart+1); 
 tempre_para.T7_h=AT24CXX_ReadOneByte(T7_Addrstart+1); 
 tempre_para.T8_h=AT24CXX_ReadOneByte(T8_Addrstart+1);   
   while(1)
   {
 
  Beep(0);
  if(tempre_para.T1_val>=tempre_para.T1_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点1温度:%d",tempre_para.T1_val);//同时打印报警信息
   
   }
     if(tempre_para.T2_val>=tempre_para.T2_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点2温度:%d",tempre_para.T2_val);//同时打印报警信息
   
   }
     if(tempre_para.T3_val>=tempre_para.T3_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点3温度:%d",tempre_para.T3_val);//同时打印报警信息
   
   }
     if(tempre_para.T4_val>=tempre_para.T4_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点4温度:%d",tempre_para.T4_val);//同时打印报警信息
   
   }
     if(tempre_para.T5_val>=tempre_para.T5_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点5温度:%d",tempre_para.T5_val);//同时打印报警信息
   
   }
     if(tempre_para.T6_val>=tempre_para.T6_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点6温度:%d",tempre_para.T6_val);//同时打印报警信息
   
   }
     if(tempre_para.T7_val>=tempre_para.T7_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点7温度:%d",tempre_para.T7_val);//同时打印报警信息
  
   }
     if(tempre_para.T8_val>=tempre_para.T8_h)
   {
   
    Beep(1);
     DebugOut(0, "\r\n 发生报警!");//同时打印报警信息
     DebugOut(0, "\r\n 节点8温度:%d",tempre_para.T8_val);//同时打印报警信息
  
   }
   OSTimeDly(85);
   }
  
 }

 实物图

 TB2jslnbpXXXXazXpXXXXXXXXXX-656747741.jpg

sitemap