1. 系统总体设计
沼气控制系统主要包括气体浓度检测、温湿度检测、数据处理与显示、报警控制、阀门控制等子系统。
1.1 系统功能
- 气体检测: 使用气体传感器检测沼气(主要是甲烷)浓度。
- 环境监测: 使用温湿度传感器检测环境温度和湿度。
- 数据处理: 单片机处理传感器的数据,进行必要的计算和判断。
- 显示与报警: 利用0.96寸OLED显示屏显示实时数据,同时触发报警系统(蜂鸣器/报警灯)在危险情况下。
- 阀门控制: 控制电磁阀,自动打开或关闭沼气释放口,维护系统安全。
2. 硬件设计
2.1 主要硬件组件
- STM32F103 单片机
- MQ-4(或同类)甲烷传感器
- DHT11 温湿度传感器
- I2C OLED 显示屏
- 蜂鸣器
- 电磁阀及其驱动电路
- 电源模块
- 按键和LED指示灯
2.2 硬件接口
- 甲烷传感器(MQ-4): 使用ADC接口采集模拟信号。
- 温湿度传感器(DHT11): 使用GPIO接口进行数字通信。
- LCD 显示屏: 通过I2C接口连接。
- 蜂鸣器和LED: 使用GPIO接口控制。
- 电磁阀: 使用继电器或MOSFET驱动电路,通过GPIO接口控制继电器。
3. 软件设计
3.1 开发环境
- 开发工具: STM32CubeMX 或Keil uVision5
- 固件库: STM32 HAL库 或STM32 F1xx。
3.2 系统流程
- 初始化阶段: 初始化所有外设和中断。
- 传感器读取: 定时读取甲烷传感器和温湿度传感器数据。
- 数据处理: 对采集的数据进行转换和处理。
- 逻辑判断: 根据传感器数据做出逻辑判断:
- 如果甲烷浓度超过设定值,触发报警并关闭电磁阀。
- 如果温度和湿度超标,可以进行相应的处理。
- 数据显示: 在LCD显示屏上实时显示所有传感器数据。
- 报警控制: 控制蜂鸣器发声和LED灯光效果。
- 阀门控制: 根据实际情况打开或关闭电磁阀。
4. 编写与调试
4.1 编写代码
编写各个模块的初始化和控制代码,特别是传感器接口、I2C通信、ADC采集和GPIO控制等。
4.2 调试阶段
- 连接传感器调试: 确保传感器可以正确读取和传输数据。
- 通信协议调试: 确认I2C和ADC等接口正常工作。
- 数据处理和逻辑判断: 确保算法和逻辑判断正确。
- 系统集成调试: 将各个模块集成并进行整体调试。
5.具体代码编写
5.1 用到的模块
5.2 完整的主程序代码及解析
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Wenshi.h"
#include "Key.h"
#include "LED.h"
#include "buzzer.h"
#include "USART.h"
#include "Timer.h"
#include "DS1302.h"
#include "Motor.h"
#include "AD.h"
uint8_t min_of_AV=20;
uint8_t max_of_AV=60;
uint16_t ALM; //实际浓度
uint16_t AV=60; //预警浓度
uint16_t ADValue;
void oled_main()
{
for(int i=1;i<=6;i++)
{
OLED_ShowCC_F16x16(1, 2+2*i-1, 10+i); // 当前沼气浓度
}
OLED_ShowNum(2,7,ALM,3);
OLED_ShowString(2,10,"%");
for(int i=1;i<=6;i++)
{
OLED_ShowCC_F16x16(3, 2+2*i-1, 16+i); // 正常浓度区间
}
OLED_ShowNum(4,5,min_of_AV,2);
OLED_ShowString(4,7,"%--");
OLED_ShowNum(4,10,max_of_AV,2);
OLED_ShowString(4,12,"%");
}
uint8_t KeyNum;
uint8_t seting_mode=0;
void key_main()
{
KeyNum=Key_GetNum();
if (KeyNum==1)
{
if(seting_mode==0)
{
seting_mode=1;
OLED_ShowString(4,1,"set");
}
else
{
seting_mode=0;
OLED_ShowString(4,1," ");
}
}
if (KeyNum==2)
{
if(seting_mode==1)
{
max_of_AV++;
}
}
if (KeyNum==3)
{
if(seting_mode==1)
{
max_of_AV--;
}
}
}
unsigned char humi[] = {0};
unsigned char temp[] = {0}; //定义为全局变量
unsigned char min;
int main()
{
OLED_Init();
Key_Init();
LED_Init();
Buzzer_Init();
Timer3_Init();
Usart1_Init();
Motor_Init();
AD_Init();
DHT11_Init();
ds1302_gpio_init();Delay_ms(5); //初始化ds1302端口
ds1032_init();Delay_ms(5); //ds1302初始化
ds1032_read_realTime(); //读取实时数据
min=TimeData.minute; //记录此时分钟值
while(1)
{
ADValue=AD_GetValue();
ALM = (float)ADValue / 4095 *100; //沼气浓度:0%~100%
DHT11_Read_Data(temp,humi);
if (ALM >max_of_AV) //大于正常区间报警
{
Buzzer_ON();
Motor_ON();
}
else
{
Buzzer_OFF();
Motor_OFF();
}
//指示灯变化
if (ALM >max_of_AV)
{
LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();
}
else if (ALM <min_of_AV)
{
LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();
}
else if (seting_mode==1)
{
LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();
}
else if(ALM>min_of_AV && ALM <max_of_AV)
{
LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();
}
oled_main();
key_main();
ds1032_read_realTime();
}
}
void TIM3_IRQHandler()
{
if (TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
printf("Time:%d-%d-%d-%d-%d-%d\r\n",TimeData.year ,TimeData.month,TimeData.day,TimeData.hour,TimeData.minute,TimeData.second);
printf("Corrent Temp is:%d\r\n",temp[0]);
printf("Corrent Humi is:%d\r\n",humi[0]);
printf("ALM is:%d\r\n",ALM);
printf("\r\n");
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
6. protues仿真图
6.1 完整图片
6.2 模块功能讲解
主控使用STM32F103
OLED模块显示实时得到的模拟沼气浓度和正常工作区间
DTH11测量当前环境的温湿度
通过AD转换模拟当前沼气浓度(0%~100%)
按键模块对报警阈值进行设置
指示灯根据当前工作情况变化
超过设定的沼气浓度阈值,蜂鸣器报警,电磁阀控制电机转动
7.演示视频
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="PbmJKbH1-1723253812881" src="https://player.bilibili.com/player.html?aid=112935124862841"></iframe>基于单片机的沼气控制系统2
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="Ij9ygiru-1723261309633" src="https://live.csdn.net/v/embed/416447"></iframe>基于单片机的沼气控制系统
标签:课程设计,毕设,温湿度,报警,沼气,单片机,传感器,电磁阀,include From: https://blog.csdn.net/fang_xuan_xiang/article/details/141085165