基于stm32的多功能时钟7——报警模块设计

        亲爱的读者们,大家好~

        自上一章《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的下位机的开发。而在后面的章节中,小编将介绍如何将单片机采集的数据通过蓝牙模块传输给手机,实时地在手机界面上显示,同时绘制一些相关的曲线。如果技术可行的话,还可以通过手机蓝牙软件实时监控我们的多功能时钟,完成上位机与下位机的通信交互。大家敬请期待吧~

你可能感兴趣的:(基于stm32的多功能时钟7——报警模块设计)