最近设计了一个项目基于STM32智能粮食存储设备的设计与实现,与大家分享一下:
一、基本介绍
项目名:基于单片机的粮仓环境检测的设计
单片机:STM32F103C8T6
项目编号:mcuclub-dz-028
功能简介:
1、通过火焰检测模块检测是否发生火灾,如果发生,则声光报警,并自动开启水泵进行灭火,同时通过WIFI模块将警报数据发送到手机端
2、通过MQ-135检测有害气体,如果有害气体超过设置最大值,则声光报警,并自动开启风扇进行通风
3、通过MQ-2检测烟雾,如果烟雾超过设置最大值,则声光报警,并自动开启风扇进行通风
4、通过DHT11检测环境温湿度,如果温度大于设置最大值,则声光报警,并自动开启制冷片降温;如果湿度大于设置最大值,则声光报警,则自动开启风扇除湿
5、通过红外热释电感应模块检测是否存在有害动物,如果有,则声光报警,同时通过WIFI模块将警报数据发送到手机端
6、通过按键可设置各阈值
7、通过OLED显示数据
8、通过WIFI模块,手机端可远程查看各数据,手机端可远程设置各阈值
二、32实物图
单片机型号:STM32F103C8T6
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
此次设计基于STM32智能粮食存储设备的设计与实现,其系统总体设计如图2-1所示,通过火焰检测模块检测是否发生火灾,如果发生,则声光报警,并自动开启水泵进行灭火,同时通过WIFI模块将警报数据发送到手机端;通过MQ-135检测有害气体,如果有害气体超过设置最大值,则声光报警,并自动开启风扇进行通风;通过MQ-2检测烟雾,如果烟雾超过设置最大值,则声光报警,并自动开启风扇进行通风;通过DHT11检测环境温湿度,如果温度大于设置最大值,则声光报警,并自动开启制冷片降温;如果湿度大于设置最大值,则声光报警,则自动开启风扇除湿;通过红外热释电感应模块检测是否存在有害动物,如果有,则声光报警,同时通过WIFI模块将警报数据发送到手机端;通过按键可设置各阈值;通过OLED显示数据;通过WIFI模块,手机端可远程查看各数据,手机端可远程设置各阈值。
六、软件设计流程
系统的主流程图如图4-2所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,包括切换界面、设置阈值等;紧接着进入第二个函数监测函数,该函数主要通过调用相应的驱动函数获取测量值,并通过WIFI模块将监测的数据传输到手机端,用户也可以通过手机端发送指令,设备根据用户发送的指令执行对应的处理;紧接着进入第三个函数显示函数,该函数显示监测值及阈值;最后进入第四个函数处理函数,如果火焰检测到,标记火灾警报,如果有害气超过最大值,标记有害气警报,如果烟雾超过最大值,标记烟雾警报,如果温度超过最大值,标记温度警报,如果湿度超过最大值,标记湿度警报,如果有害动物检测到,标记有害动物警报,如果有警报,开启声光报警,如果火焰警报,开水泵,如果有害气体警报或烟雾警报或湿度警报,开风扇,如果温度警报,开制冷,设置界面,关闭声光报警、继电器,有状态改变,发送状态值。
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0) //测量界面
{
if(flag_fire == 1) //如果火焰检测到,标记火灾警报
alarm_fire = 1;
else
alarm_fire = 0;
if(gas_value > gas_max) //如果有害气超过最大值,标记有害气警报
alarm_gas = 1;
else
alarm_gas = 0;
if(smog_value > smog_max) //如果烟雾超过最大值,标记烟雾警报
alarm_smog = 1;
else
alarm_smog = 0;
if(temp_value > temp_max*10) //如果温度超过最大值,标记温度警报
alarm_temp = 1;
else
alarm_temp = 0;
if(humi_value > humi_max*10) //如果湿度超过最大值,标记湿度警报
alarm_humi = 1;
else
alarm_humi = 0;
if(flag_animal == 1) //如果有害动物检测到,标记有害动物警报
alarm_animal = 1;
else
alarm_animal = 0;
//如果有警报,开启声光报警
if(alarm_fire == 1 || alarm_gas == 1 || alarm_smog == 1 || alarm_temp == 1 || alarm_humi == 1 || alarm_animal == 1)
{
if(time_num % 3 == 0)
{
LED = ~LED;
BEEP = ~BEEP;
}
if(alarm_fire == 1) //如果火焰警报,开水泵
RELAY_2 = 1;
else
RELAY_2 = 0;
if(alarm_gas == 1 || alarm_smog == 1 || alarm_humi == 1) //如果有害气体警报或烟雾警报或湿度警报,开风扇
RELAY_1 = 1;
else
RELAY_1 = 0;
if(alarm_temp == 1) //如果温度警报,开制冷
RELAY_3 = 1;
else
RELAY_3 = 0;
}
else
{
LED = 1;
BEEP = 0;
RELAY_1 = 0;
RELAY_2 = 0;
RELAY_3 = 0;
}
}
else //设置界面,关闭声光报警、继电器
{
LED = 1;
BEEP = 0;
RELAY_1 = 0;
RELAY_2 = 0;
RELAY_3 = 0;
}
//有状态改变,发送状态值
if(fire_old != flag_fire || gas_old != gas_value || gas_max_old != gas_max || smog_old != smog_value || smog_max_old != smog_max ||
temp_old != temp_value || temp_max_old != temp_max || humi_old != humi_value || humi_max_old != humi_max || animal_old != flag_animal ||
state_RELAY_1 != RELAY_1 || state_RELAY_2 != RELAY_2 || state_RELAY_3 != RELAY_3)
{
flag_timer_begin_5s = 0;
Aliyun_Send_Data();
fire_old = flag_fire;
gas_old = gas_value;
gas_max_old = gas_max;
smog_old = smog_value;
smog_max_old = smog_max;
temp_old = temp_value;
temp_max_old = temp_max;
humi_old = humi_value;
humi_max_old = humi_max;
animal_old = flag_animal;
state_RELAY_1 = RELAY_1;
state_RELAY_2 = RELAY_2;
state_RELAY_3 = RELAY_3;
}
else //没有数据改变,每5s发送一次数据,防止设备掉线
{
flag_timer_begin_5s = 1;
if(flag_5s == 1)
{
flag_timer_begin_5s = 0;
Aliyun_Send_Data();
fire_old = flag_fire;
gas_old = gas_value;
gas_max_old = gas_max;
smog_old = smog_value;
smog_max_old = smog_max;
temp_old = temp_value;
temp_max_old = temp_max;
humi_old = humi_value;
humi_max_old = humi_max;
animal_old = flag_animal;
state_RELAY_1 = RELAY_1;
state_RELAY_2 = RELAY_2;
state_RELAY_3 = RELAY_3;
flag_timer_begin_5s = 1;
}
}
}