一.系统概述
煤矿监控系统实现了对煤矿环境的实时监测、报警处理、远程管理和数据分析,提升了煤矿安全性和生产效率,系统包括以下主要功能:
1. 数据采集:
- 使用STM32单片机作为核心控制器,实现对煤矿内温度、湿度、瓦斯浓度和光照强度的实时采集。
2. 数据显示和传输:
- 设计显示屏模块,将采集到的各项数据实时显示。
3. 无线通信上传和远程监控:
- 集成无线通信模块,通过特定协议将采集到的数据上传至监控端。
- 监控端可以实时查看和分析煤矿环境数据,支持远程管理和监控。
4. 参数阈值设定和控制:
- 在监控端可以设定温湿度、光照强度和瓦斯浓度的阈值。
- 当监测到温湿度超过设定阈值时,控制温湿度调节装置启动。
- 当监测到光照强度低于设定阈值时,控制灯光打开以维持照明。
- 当监测到瓦斯浓度超过设定阈值时,触发蜂鸣器报警并上传数据至监控端。
5. 数据分析和展示:
- 在上位机端可以显示瓦斯浓度在一段时间的变化曲线图,方便用户进行数据分析和监测趋势。
二.电路设计
电路图采用Altium Designer进行设计:
1. 煤矿瓦斯预警系统内通过STM32F103单片机进行系统主控;
2. 在电路中实现控制的是单片机最小系统电路;
3. 使用单总线通信的DHT11进行温湿度检测;
4. 瓦斯检测则通过MQ-4将瓦斯浓度的模拟量接入到单片机的ADC输入脚;
5. 光强检测使用光敏电阻模块进行光强检测并通过模拟输出脚与单片机的ADC脚进行连接;
6. 使用ESP8266进行无线通信时通过UART串口与单片机进行通信;
7. OLED显示屏实现数据显示的过程中需要借助IIC总线完成通信。
三.程序设计
#include "stm32f10x.h" //包含需要的头文件
#include "timer2.h"
/************************************************
版权:小常硬件
公众号:微信搜索“小常硬件“在公众号免费下载相关资料
************************************************/
unsigned char Ms_HcSR_Count=0;
/*-------------------------------------------------*/
/*函数名:定时器2初始化 */
/*参 数:arr:自动重装值 0~65535 */
/*参 数:psc:时钟预分频数 0~65535 */
/*返回值:无 */
/*说 明:定时时间:arr*psc*1000/72000000 单位ms */
/*-------------------------------------------------*/
void TIM2_init(unsigned short int arr, unsigned short int psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义一个设置定时器的变量
NVIC_InitTypeDef NVIC_InitStructure; //定义一个设置中断的变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断向量分组:第2组 抢先优先级:0 1 2 3 子优先级:0 1 2 3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_Timer_TIM2, ENABLE); //使能TIM2时钟
TIM_DeInit(Timer_Tim2); //定时器2寄存器恢复默认值
TIM_TimeBaseInitStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //设置定时器预分频数
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //1分频
TIM_TimeBaseInit(Timer_Tim2, &TIM_TimeBaseInitStructure); //设置TIM2
TIM_ClearITPendingBit(Timer_Tim2, TIM_IT_Update); //清除溢出中断标志位
TIM_ITConfig(Timer_Tim2, TIM_IT_Update, ENABLE); //使能TIM2溢出中断
TIM_Cmd(Timer_Tim2, ENABLE); //开TIM2
NVIC_InitStructure.NVIC_IRQChannel = Timer_Tim2_IRQn; //设置TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能
NVIC_Init(&NVIC_InitStructure); //设置中断
}
/*-------------------------------------------------*/
/*函数名:定时器2中断服务函数。 */
/*参 数:无 */
/*返回值:无
此中断函数是通用的中断函数,如果要用定时器2的
中断处理函数,则在以下函数进行修改
-------------------------------------------------*/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(Timer_Tim2, TIM_IT_Update) != RESET)//如果TIM_IT_Update置位,表示TIM2溢出中断,进入if
{
// TIM_Cmd(Timer_Tim2, DISABLE); //关闭TIM2定时器
// TIM_SetCounter(Timer_Tim2, 0); //清零定时器2计数器
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
Servo1();
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ClearITPendingBit(Timer_Tim2, TIM_IT_Update); //清除TIM2溢出中断标志
}
}