STM32项目分享:基于单片机的空气质量检测系统设计
“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
二、项目简介
三、原理图设计
四、PCB硬件设计
五、程序设计
六、资料分享
一、视频展示
基于单片机的空气质量检测系统设计-视频分享
二、项目简介
该设计由STM32F103C8T6作为主控芯片,供电系统,0.96的OLED显示屏,
烟雾传感器和PM2.5传感器,一个继电器,以及三个独立按键和蜂鸣器组成。
本设计的功能:
1、 上电屏幕打开默认进入数据主页。
该页面会显示当前测得数据包括PM2.5数值和烟雾浓度数值,其中PM2.5显示是每立方米含颗粒物数值。
2、此时摁下按设置键时会进入阈值设置界面。
共有两个阈值设置,都是通过摁下设置键并按顺序显示,方便调节阈值,其中分别为烟雾浓度阈值设置
(设置其上限,测得烟雾浓度超过阈值数值,蜂鸣器就会报警,并且触发继电器,模拟风扇通风),
PM2.5阈值设置(设置上限,和烟雾浓度阈值报警逻辑一致,也会触发继电器),其中最大值为0.66。
细节描述:当测得烟雾浓度数据跟阈值判断有冲突时会触发报警系统,并且打开继电器模拟通风,
当数值恢复正常,继电器会关闭蜂鸣器也会关闭。
三、原理图设计

四、PCB硬件设计


五、程序设计
#include "stm32f10x.h" // 设备头文件
#include "delay.h" // 延迟函数库
#include "lcd.h" // LCD显示库
#include "IOput.h" // 输入输出控制库
#include "usart.h" // 串口通信库
#include "adc.h" // ADC转换库
#include "pwm.h" // PWM控制库
#include "timer.h" // 定时器库float pm; // PM2.5浓度
float AD_PM; // AD转换得到的PM2.5浓度float PM2, max_PM = 60; // PM2.5相关变量
u8 show_flag, show1_flag, MQ2, max_YW = 60; // 显示标志和烟雾浓度相关变量void GetGP2Y(void) // 获取PM2.5浓度函数
{LED = 1; // LED关闭delay_us(280); // 延时280微秒AD_PM = Get_Adc_Average(6, 10) * 3.3 * 2/ 4095; // 获取并计算AD转换值delay_us(40); // 延时40微秒LED = 0; // LED打开delay_us(9680); // 延时9680微秒pm = AD_PM*100/0.37; // 电压转换为PM2.5浓度值
}int main (void)
{delay_init(); // 初始化延时函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级组Adc_Init(); // 初始化ADCOLED_Init(); // 初始化OLED显示屏delay_ms(1); // 延时1毫秒OLED_Clear(); // 清屏output_init(); // 初始化输出input_init(); // 初始化输入while(1){GetGP2Y(); // 获取PM2.5浓度MQ2 = Get_Adc_Average(1, 10) * 100 / 4096; // 获取并计算烟雾浓度key_scan(1, 0, 0); // 扫描按键if(set_flag == 1 && show_flag != 1){show1_flag = 0;set_flag = 0;show_flag++;if(show_flag >= 2){show_flag = 0;}}if(show_flag == 0){OLED_ShowCH(0, 0, " 空气质量检测"); // 显示标题OLED_ShowCH(0, 4, "PM2.5:"); // 显示PM2.5OLED_ShowNum(48, 4, pm, 4, 16);OLED_ShowCH(88, 4, "ug/m3"); // 显示单位OLED_ShowCH(0, 2, "烟雾浓度:"); // 显示烟雾浓度OLED_ShowNum(72, 2, MQ2, 3, 16); // 显示烟雾浓度数值if(MQ2 >= max_YW || pm >= max_PM) // 如果烟雾或PM2.5超过阈值{OLED_ShowCH(0, 6, " 已开启通风"); // 显示开启通风}else{OLED_ShowCH(0, 6, " 已关闭通风"); // 显示关闭通风}}if(show_flag == 1){OLED_ShowCH(0, 0, "最大烟雾:"); // 显示最大烟雾阈值OLED_ShowCH(0, 2, "最大PM2.5:"); // 显示最大PM2.5阈值OLED_ShowNum(90, 0, max_YW, 2, 16); // 显示最大烟雾阈值数值OLED_ShowNum(80, 2, max_PM, 4, 16); // 显示最大PM2.5阈值数值if(set_flag == 1){set_flag = 0;show1_flag++;if(show1_flag >= 2){show_flag = 0; OLED_Clear();}}if(show1_flag == 0){OLED_ShowCH(112, 0, "←"); // 显示箭头指示if(add_flag == 1){add_flag = 0;max_YW++;}if(dec_flag == 1){dec_flag = 0;max_YW--;}if(max_YW >= 100 || max_YW <= 0){max_YW = 0;}}if(show1_flag == 1){OLED_ShowCH(112, 2, "←"); // 显示箭头指示if(add_flag == 1){add_flag = 0;max_PM = max_PM + 1;}if(dec_flag == 1){dec_flag = 0;max_PM = max_PM -1;}if(max_PM >= 400 || max_PM <= 0){max_PM = 0;}}}if(MQ2 >= max_YW || pm >= max_PM) // 如果烟雾或PM2.5超过阈值{jdq = 0; // 开启继电器BEEP = 0; // 蜂鸣器报警}else{jdq = 1; // 关闭继电器BEEP = 1; // 关闭蜂鸣器}}
}
六、资料分享
点击即可查看当前资料分享。
