首页 > 其他分享 >单片机课程设计/毕设 (基于单片机的沼气控制系统)

单片机课程设计/毕设 (基于单片机的沼气控制系统)

时间:2024-08-10 21:52:53浏览次数:12  
标签:课程设计 毕设 温湿度 报警 沼气 单片机 传感器 电磁阀 include

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 系统流程

  1. 初始化阶段: 初始化所有外设和中断。
  2. 传感器读取: 定时读取甲烷传感器和温湿度传感器数据。
  3. 数据处理: 对采集的数据进行转换和处理。
  4. 逻辑判断: 根据传感器数据做出逻辑判断:
    • 如果甲烷浓度超过设定值,触发报警并关闭电磁阀。
    • 如果温度和湿度超标,可以进行相应的处理。
  5. 数据显示: 在LCD显示屏上实时显示所有传感器数据。
  6. 报警控制: 控制蜂鸣器发声和LED灯光效果。
  7. 阀门控制: 根据实际情况打开或关闭电磁阀。

4. 编写与调试

4.1 编写代码

编写各个模块的初始化和控制代码,特别是传感器接口、I2C通信、ADC采集和GPIO控制等。

4.2 调试阶段

  • 连接传感器调试: 确保传感器可以正确读取和传输数据。
  • 通信协议调试: 确认I2C和ADC等接口正常工作。
  • 数据处理和逻辑判断: 确保算法和逻辑判断正确。
  • 系统集成调试: 将各个模块集成并进行整体调试。

5.具体代码编写

5.1 用到的模块

ed9621592a174a5eb2b2b5b2ac9f5185.pngfea6f922bc764b02b79a8ee116c5f5e5.png

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 完整图片

9efbdb37abed40ccb4896781e2b31803.png

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

相关文章