亲爱的读者们,大家好~
自上一章《UI界面设计》后,我们的开发工作已经完成了60%左右了。这一章呢,小编将介绍报警模块的设计。之前所做的工作,只是完成对环境参量的测量和显示。现在要对所获取的参量进行分析,即根据实际情况设置相关的阈值,判断是否异常,若出现异常,则采取报警,同时提醒工作人员,并且系统也会采取一定的措施来解决问题。
在本制作中,只是象征性的做一下报警设计。举个例子,假如湿度出现异常(过高),超出上限,报警,同时需要启动抽湿机,当环境湿度达到正常值后,停止抽湿机,报警随之停止。这才是一个真正的反馈控制系统。但本制作,由于材料有限,只有一个电机,虽然能够有一定效果,但功能还是受限,所以就省略了。
因此,在报警模块,我们这样设计:当温湿度超过阈值范围(过大或过小),则蜂鸣器报警,报警指示灯亮;当空气质量超过上限时,蜂鸣器报警,报警指示灯亮,同时启动直流电机(代替空气净化装置);当测量距离超过安全距离时,蜂鸣器报警,报警指示灯亮。
1.资源介绍
蜂鸣器,一般用作系统的报警,分为有源蜂鸣器和无源蜂鸣器。
无源蜂鸣器可以产生不同频率的声音,而有源蜂鸣器,内部有振荡电路,产生的声音频率固定,而此处我们只是简单的报警,所以采用有源蜂鸣器。
报警指示灯采用LED灯即可,这里无须介绍。
关于空气净化装置,我们这里用电机代替。这里,我们需要采用电机驱动电路,采用L298N电机驱动模块。下面简要介绍一下该模块。
L298N电机驱动模块:在模块的电源部分,有VMS(12v)、VCC(5v)、GND3个接口。电源正极接VMS,电源负极接GND,这样就给电机驱动模块上电了。MotorA和MotorB的四个接口,分别接电机的端口,所以该模块可驱动两个电机。ENA和ENB分别是使能端,IN1、IN2、IN3和IN4分别是控制电机的端口,可驱动电机正反转。这里我们只驱动1个电机,使用ENA,IN1,IN2和MotorA。
2.软件编程
(1)蜂鸣器报警
首先,配置GPIO口,将PA6设置成推挽输出模式,这里不再给出代码,大家应该都会的。
然后编写蜂鸣器报警代码。
void buzzer(void)
{
u8 i;
for(i=0; i<100; i++)
{
Beep_L;
delay_ms(1);
Beep_H;
delay_ms(1);
}
}
这里,只需将蜂鸣器端口以一定的频率上下振荡,蜂鸣器就能发出声音,频率高,声音相对大一些。
(2)LED报警灯
将相关的LED报警灯配置成推挽输出模式即可。
(3)电机驱动模块
将电机的ENA、IN1、IN2端口设置成推挽输出模式,初始化不再给出。
void motorRun(void)
{
if(flag)//电机启动/停止标志位
{
ENA_H;//使能端有效,电机转动
}
else
{
ENA_L;//使能端无效,电机停止
}
IN1_H;
IN2_L;
}
这里,电机的启动和停止,只需控制驱动电机的使能端,让它使能或者失能即可。电机两个端口分别给高、低电平即能转起来了。
(4)编写报警处理函数
/*报警函数*/
void alarm(void)
{
//温度异常报警
if(temperature>=temper_H||temperature<=temper_L)
{
LED0_ON();
temper_sign = 1;
}
else
{
LED0_OFF();
temper_sign = 0;
}
//湿度异常报警
if(humidity>=humid_H||humidity<=humid_L)
{
LED1_ON();
humid_sign = 1;
}
else
{
LED1_OFF();
humid_sign = 0;
}
//空气质量异常报警
if(value>=air_upperlimit)
{
LED2_ON();
air_sign = 1;
flag = 1;
}
else
{
LED2_OFF();
air_sign = 0;
flag = 0;
}
//距离异常报警
if(distance/100>=length)
{
LED3_ON();
length_sign = 1;
}
else
{
LED3_OFF();
length_sign = 0;
}
if(temper_sign==0&&humid_sign==0&&air_sign==0&&length_sign==0)
{
cancel = 0;//正常情况,关闭取消报警
}
if(temper_sign|humid_sign|air_sign|length_sign)
{
if(!cancel)
{
buzzer();
}
}
motorRun();
}
这里,判断温湿度、空气质量、测量距离是否正常,然后分情况处理,同时设置好相关的标志位,比如监控显示标志位,电机启动/停止标志位。还有,如果都正常的话,将取消报警标志位置位。
UI界面报警部分:
到目前为止,我们所做的都是基于stm32的下位机的开发。而在后面的章节中,小编将介绍如何将单片机采集的数据通过蓝牙模块传输给手机,实时地在手机界面上显示,同时绘制一些相关的曲线。如果技术可行的话,还可以通过手机蓝牙软件实时监控我们的多功能时钟,完成上位机与下位机的通信交互。大家敬请期待吧~