一.系统概述
基于STM32单片机的粮仓环境监测与安防系统功能的详细描述:
1. 多传感器环境监测:使用温度传感器和湿度传感器,在每个小粮仓内部署,以实时监测和记录仓内的温度和湿度变化。部署烟雾传感器和火焰传感器,用于及时发现火灾风险并触发报警。利用二氧化碳传感器监测粮仓内的二氧化碳浓度,以确保储存环境的适宜性。
2. 传感器网络部署:由于小粮仓面积为49平方米,且传感器采集范围为5米,因此在每个小粮仓内部署4组传感器,确保全面覆盖和准确监测。
3. Zigbee组网通信:利用Zigbee技术构建无线通信网络,实现各个小粮仓内的传感器数据汇总与传输。通过Zigbee网络,将各个小粮仓的环境信息汇总后,通过无线通信方式上传到中央监控端。
4. 安全防护措施:设计红外识别RFID射频刷卡功能,用于粮仓的出入管理。合法刷卡后方可正常进入粮仓。若未刷卡而有人尝试进入粮仓,检测到异常并触发报警,同时发送报警信息至监控端。
5. 视频监控功能:在粮仓内安装视频监控系统,帮助管理人员实时监测粮仓内部情况。通过视频监控,管理人员可以及时发现并处理粮仓内的有害物种,如老鼠等。
二.电路设计
电路图采用Altium Designer进行设计:
1. 通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心;
2. 通过DHT11进行温湿度检测,并通过one-wire总线与单片机的GPIO脚进行连接;
3. 使用红外火焰传感器进行明火检测,该模块输出数字信号与单片机的GPIO口进行连接;
4. 通过光电开关进行人体检测,模块的数据输出脚与单片机的GPIO口直接连接;
5. 使用MQ-2进行烟雾浓度检测并将模块的模拟输出脚与单片机的模拟输入脚相接;
6. 使用RC522刷卡模块进行商品的刷卡检测,该模块采用SPI总线与单片机进行通信;
7. 通过0.96寸的OLED12864进行数据显示,采用IIC总线的形式与单片机进行通信;
8. 使用Zigbee模块搭建组网,Zigbee模块通过UART串口与单片机进行通信;
9. 通过ESP8266-01S将检测到数据上传到上位机,通过UART串口与单片机进行通信。
三.程序设计
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "LED.h"
#include "AD.h"
#include "FS.h"
#include "dht11.h"
#include "Key.h"
#include "Relay.h"
#include "ULN2003.h"
#include "usart.h"
#include "usart3.h"
#include "timer2.h"
#include "adc2.h"
#include "Timer.h"
#include "adc.h"
#include "HX711.h"
#include "zigbee.h"
#include "rc522.h"
u32 jr6001_bound=9600;
uint16_t AD0, AD1,AD4;
u8 AD2, AD3;
u8 KeyNum; //按键值
u8 KeyFlag = 0,WSDFlag = 0; //标志位
u8 BuluFlag = 0,BuluFlagJJ = 0; //标志位
u8 Page = 0; //页面
u16 DJSpeed = 5,DJS,mileage; //电机速度
u32 bound = 9600;
u8 Time_SEC,Time_MIN;
u8 SpeedYZ = 0;
u8 circulation = 0;
int main(void)
{
/*参数初始化*/
char a[10];
_Bool RC5222_Incre_Flag=0;
u8 Temp[1]; //定义温湿度值
u8 Humi[1]; //定义温湿度值
int ADC_3,ADC_4,ADC_5;
DJSpeed = 0;
/*模块初始化*/
OLED_Init(); //OLED初始化
OLED_CLS();
Adc_Init();
Adc2_Init();
Adc2_Init1();
DHT11_Init();
Usart1_Init(9600);
Zigbee_Uart3_Init();
RC522_GPIO_Init_STM32_IN_Spi();
while (1)
{
RC522_Care_Incre_Handle(&RC5222_Incre_Flag);
sprintf((char*)a,"%d%d%d%d",Card_ID[0],Card_ID[1],Card_ID[2],Card_ID[3]);
UART1Write(a);
if(RC5222_Incre_Flag == 1)
{
Zigbee_Uart3_Host_Send_Message("$5");
Zigbee_Uart3_Host_Send_Message("\n");
}
else
{
Zigbee_Uart3_Host_Send_Message("$6");
Zigbee_Uart3_Host_Send_Message("\n");
}
sprintf((char*)a,"%d%d%d%d",ADC_3/1000,ADC_3%1000/100,ADC_3%100/10,ADC_3%10);
Zigbee_Uart3_Host_Send_Message("$1");
Zigbee_Uart3_Host_Send_Message(a);
Zigbee_Uart3_Host_Send_Message("\n");
sprintf((char*)a,"%d%d",Temp[0]/10,Temp[0]%10);
Zigbee_Uart3_Host_Send_Message("$2");
Zigbee_Uart3_Host_Send_Message(a);
Zigbee_Uart3_Host_Send_Message("\n");
sprintf((char*)a,"%d%d",Humi[0]/10,Humi[0]%10);
Zigbee_Uart3_Host_Send_Message("$3");
Zigbee_Uart3_Host_Send_Message(a);
Zigbee_Uart3_Host_Send_Message("\n");
sprintf((char*)a,"%d%d%d%d",ADC_4/1000,ADC_4%1000/100,ADC_4%100/10,ADC_4%10);
Zigbee_Uart3_Host_Send_Message("$4");
Zigbee_Uart3_Host_Send_Message(a);
Zigbee_Uart3_Host_Send_Message("\n");
sprintf((char*)a,"%d%d%d%d",ADC_5/1000,ADC_5%1000/100,ADC_5%100/10,ADC_5%10);
Zigbee_Uart3_Host_Send_Message("$7");
Zigbee_Uart3_Host_Send_Message(a);
Zigbee_Uart3_Host_Send_Message("\n");
ADC_3 = Get_Adc2_Average(ADC_Channel_8,10);
OLED_ShowCN(1,0,60);
OLED_ShowCN(17,0,61);
OLED_ShowCN(33,0,39);
OLED_ShowCN(49,0,40);
OLED_ShowStr(65,0,":",2);
OLED_ShowNum1(73,0,ADC_3/1000,1,1);
OLED_ShowNum1(81,0,ADC_3%1000/100,1,1);
OLED_ShowNum1(89,0,ADC_3%100/10,1,1);
OLED_ShowNum1(97,0,ADC_3%10,1,1);
DHT11_Read_Data(Temp,Humi);
OLED_ShowCN(1,2,45);
OLED_ShowCN(17,2,47);
OLED_ShowStr(33,2,":",2);
OLED_ShowNum1(41,2,Temp[0]/10,1,1);
OLED_ShowNum1(49,2,Temp[0]%10,1,1);
OLED_ShowCN(57,2,46);
OLED_ShowCN(73,2,47);
OLED_ShowStr(89,2,":",2);
OLED_ShowNum1(97,2,Humi[0]/10,1,1);
OLED_ShowNum1(104,2,Humi[0]%10,1,1);
ADC_4 = Get_Adc_Average(ADC_Channel_9,10);
OLED_ShowCN(1,4,62);
OLED_ShowCN(17,4,63);
OLED_ShowCN(33,4,39);
OLED_ShowCN(49,4,40);
OLED_ShowStr(65,4,":",2);
OLED_ShowNum1(73,4,ADC_4/1000,1,1);
OLED_ShowNum1(81,4,ADC_4%1000/100,1,1);
OLED_ShowNum1(89,4,ADC_4%100/10,1,1);
OLED_ShowNum1(97,4,ADC_4%10,1,1);
ADC_5 = Get_Adc_Average(ADC_Channel_4,10);
OLED_ShowStr(1,6,"CO2",2);
OLED_ShowStr(25,6,":",2);
OLED_ShowNum1(33,6,ADC_5/1000,1,1);
OLED_ShowNum1(41,6,ADC_5%1000/100,1,1);
OLED_ShowNum1(49,6,ADC_5%100/10,1,1);
OLED_ShowNum1(57,6,ADC_5%10,1,1);
}
}