当前位置: 首页 > news >正文

【STM32项目】环境监测设计

✌️✌️大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是基于《基于STM32的环境监测设计》。

目录

1、系统功能

2.1、硬件清单

2.2、功能介绍

2.3、控制模式

2、演示视频和实物

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

7、总结


1、系统功能

2.1、硬件清单

STM32F103C8T6最小核心控制板+ESP8266-01SWiFi模块+DHT11温湿度传感器+0.96寸OLED显示屏+PM2.5传感器+4按键模块+声光报警模块(LED灯+蜂鸣器)+光敏电阻+后备电池+MQ2烟雾传感器+MQ9一氧化碳传感器+MQ135空气质量传感器

2.2、功能介绍

(1)STM32F103C8T6最小核心控制板:作为系统主控单元,负责协调各传感器数据采集、处理及控制外设动作。
(2)ESP8266-01SWiFi模块:连接机智云平台,实现手机APP远程监控与控制,支持数据上传云端及接收远程指令。
(3)DHT11温湿度传感器:实时检测环境温度与湿度,数据同步显示于OLED屏并上传云平台。
(4)0.96寸OLED显示屏:分页面显示传感器参数(PM2.5、光照强度、空气质量、一氧化碳、烟雾、温湿度)及阈值设置界面。
(5)PM2.5传感器:监测空气中PM2.5浓度,当数值超过设定阈值时触发声光报警。
(6)4按键模块:
•    第1个按键:页面切换(传感器数据页/阈值设置页)。
•    后3个按键:阈值设置(切换阈值类型、增加阈值数值),支持本地手动调整各参数报警阈值。
(7)声光报警模块:由LED灯和蜂鸣器组成,当传感器检测值超过阈值时同步发出光闪与声音报警。
(8)光敏电阻:采集环境光照强度,数值用于阈值比较及显示,支持手动调整光照报警阈值。
(9)后备电池:系统断电后为时钟供电,确保实时时间准确性。
(10)MQ2烟雾传感器:检测环境烟雾浓度,超过阈值时触发报警。
(11)MQ9一氧化碳传感器:监测一氧化碳浓度,超标时启动声光报警。
(12)MQ135空气质量传感器:检测空气质量指数,数值异常时触发报警。

2.3、控制模式

(1)远程模式:通过机智云平台连接手机APP,可远程查看PM2.5、温湿度、光照强度、烟雾、一氧化碳、空气质量等实时数据,支持远程设置各参数报警阈值及控制声光报警功能。
(2)本地手动模式:
•    页面切换:通过第1个按键切换传感器数据显示页与阈值设置页。
•    阈值设置:在阈值设置页,通过后3个按键调整各参数阈值(如PM2.5阈值、光照强度阈值、温湿度阈值等),设置时数值实时更新并显示。
(3)自动报警模式:系统实时监测各传感器数据,当检测值超过预设阈值时(如PM2.5>300、光照强度<设定值、一氧化碳浓度超标等),自动触发声光报警模块,LED灯闪烁且蜂鸣器发声,报警状态同步上传至手机APP。


2、演示视频和实物

基于STM32的环境监测设计


3、系统设计框图


4、软件设计流程图


5、原理图


6、主程序

#include "sys.h"                //头文件
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
淘宝:5132单片机设计
哔哩哔哩:5132单片机设计
CSDN:    5132单片机设计
公众号:  5132单片机设计
抖音  :  5132单片机设计
小红书:  5132单片机设计
咸鱼:    5132单片机设计
************************************************************************************************/
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "usart3.h"
#include "gizwits_product.h"
#include "Key.h"
#include "Buzzer.h"
#include "OLED.h"
#include "AD.h"
#include "MyRTC.h"
#include "Serial2.h"
#include "dht11.h"
#include "PM25.h"extern uint32_t bufe[10];                     //存储传感器采集的数据
uint16_t AD0, AD1,AD2, AD4, AD5, AD6;             //存储5路ADC值
uint32_t GuangYu = 70;                  //光照强度阈值上限
uint32_t TempYu = 35;
uint32_t HumiYu = 70;
uint32_t YanYu = 80;
uint32_t COYu = 80;
uint32_t PM25Yu = 300;
uint32_t KONGYu = 80;u8 temp, humi;                                //存放温湿度
u8 state, state2 = 2, state2_1, state3;       //按键状态标志
u8 t = 0;                                     //传感器读取时间间隔
uint8_t KeyNum;                               //存储按键值
u8 Flag_dakai = 0;                            //窗户状态标志
u16 ii = 0;                                   //步进电机循环
extern u8 flag;                               //远程控制标志
u8 flag2 = 0, flag1, flag3;uint16_t RTC_Time[] = {0, 0, 0};
uint16_t RTC_Time1[] = {7, 0, 0};    //定时时间---开
uint16_t RTC_Time2[] = {19, 0, 0};   //定时时间---关u8 T_state, T_state1, qingping = 1, state_dingshi_yu_guan, state_dingshi_yu_kai, state_dingshi_yu_switch, state3_1;void TimeSet(void);
void TimeRead(void);
void ChuangGanXinXi(void);
void Yu_Set(void);
void KongZhi(void);
void YuZhiSet(void);void MY_Gizwits_Init(void)              //机智云初始化函数
{TIM3_Int_Init(9, 7199); //1MS系统定时usart3_init(9600);//WIFI初始化memset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t)); //设备状态结构体初始化gizwitsInit();//环形缓冲区初始化gizwitsSetMode(2);   //设置模式userInit();
}//void shoudong()
//{
//    TimeRead();
//    if (KeyNum == 2)        //按键PB0控制窗户开关
//    {
//        delay_ms(20);
//        if (KeyNum == 2)
//        {
//            state2++;
//            if (state2 > 1)
//            {
//                state2 = 0;
//            }
//        }
//    }
//    if (state2 == 0)
//    {
//        if (Flag_dakai == 0)
//        {//        }//    }
//    if (state2 == 1)
//    {
//        if (Flag_dakai == 1)
//        {//        }
//    }
//}
//void zhidong()
//{
//    TimeRead();
//    if (KeyNum == 5)                          //自动模式下PB0按键控制阈值切换
//    {
//        flag1 = 0;
//        flag3 = 0;
//        delay_ms(20);
//        if (KeyNum == 5)
//        {
//            state2_1++;
//            if (state2_1 > 1)
//            {
//                state2_1 = 0;
//            }
//        }
//    }
//    if (state2_1 == 1)
//    {
//        flag2 = 1; //传感器阈值
//        if (KeyNum == 2)                          //自动模式下PB0按键控制阈值切换
//        {
//            delay_ms(20);
//            if (KeyNum == 2)
//            {
//                state3++;
//                if (state3 > 8)
//                {
//                    state3 = 0;
//                }
//            }
//        }
//        if (state3 == 1)
//        {
//            if (KeyNum == 3)GuangYu_Shang++;
//            if (KeyNum == 4)GuangYu_Shang--;
//        }
//        if (state3 == 0)
//        {
//            if (KeyNum == 3)GuangYu_Xia++;
//            if (KeyNum == 4)GuangYu_Xia--;
//        }
//        if (state3 == 6)
//        {
//            if (KeyNum == 3)YanYu++;
//            if (KeyNum == 4)YanYu--;
//        }
//        if (state3 == 7)
//        {
//            if (KeyNum == 3)COYu++;
//            if (KeyNum == 4)COYu--;
//        }
//        if (state3 == 3)
//        {
//            if (KeyNum == 3)TempYu_Shang++;
//            if (KeyNum == 4)TempYu_Shang--;
//        }
//        if (state3 == 2)
//        {
//            if (KeyNum == 3)TempYu_Xia++;
//            if (KeyNum == 4)TempYu_Xia--;
//        }
//        if (state3 == 5)
//        {
//            if (KeyNum == 3)HumiYu_Shang++;
//            if (KeyNum == 4)HumiYu_Shang--;
//        }
//        if (state3 == 4)
//        {
//            if (KeyNum == 3)HumiYu_Xia++;
//            if (KeyNum == 4)HumiYu_Xia--;
//        }
//    }
//    if (state2_1 == 0)
//    {
//        flag2 = 0;  //传感器信息
//        /*********室内烟雾和CO量超过各自阈值,蜂鸣器报警***********/
//        if ((bufe[1] > YanYu) || (bufe[2] > COYu))
//        {
//            Buzzer_ON();
//        }
//        else
//        {
//            Buzzer_OFF();
//        }
//    }
//}int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);       //串口初始化为9600delay_init();      //延时函数初始化LED_Init();            //初始化与LED连接的硬件接口DHT11_Init();Buzzer_Init();             //下面为外设初始化OLED_Init();Key_Init();PM25_Init();       //里面包含了AD_Init();MyRTC_Init();MY_Gizwits_Init();   //机智云初始化while (1){userHandle();    //数据上传gizwitsHandle((dataPoint_t *)&currentDataPoint);   //后台处理,必须放在while里DHT11_Read_Data(&temp, &humi);  //读取温湿度并显示在OLED上bufe[0] = temp;bufe[1] = humi;if (t % 10 == 0){AD0 = AD_GetValue(ADC_Channel_0);    //光照传感器 if (AD0 > 4000)AD0 = 4000;bufe[2] = (u8)(100 - (AD0 / 40));AD1 = AD_GetValue(ADC_Channel_1);    //烟雾传感器if (AD1 > 4000)AD1 = 4000;bufe[3] = (u8)(80 - (AD1 / 40));AD2 = AD_GetValue(ADC_Channel_2);    //CO传感器if (AD2 > 4000)AD2 = 4000;bufe[4] = (u8)(80 - (AD2 / 40));AD4 = AD_GetValue(ADC_Channel_4);    //空气质量传感器if (AD4 > 4000)AD4 = 4000;bufe[5] = (u8)(80 - (AD4 / 40));bufe[6] = Get_PM25_Average_Data();}t++;KongZhi();KeyNum = Key_GetNum();if (KeyNum == 1){qingping = 0;state2 = 2,delay_ms(20);if (KeyNum == 1){state++;if (state > 2){state = 0;}}}if (state == 1)   {if (qingping == 0){OLED_Clear();qingping = 1;}							ChuangGanXinXi();}if (state == 2)    {if (qingping == 0){OLED_Clear();qingping = 1;}	Yu_Set();}if (state == 0)    {if (qingping == 0){OLED_Clear();qingping = 1;}	TimeRead();OLED_ShowChinese(2, 3, 49);OLED_ShowChinese(2, 4, 50);OLED_ShowChinese(2, 5, 72);OLED_ShowChinese(2, 6, 73);OLED_ShowChinese(3, 2, 74);OLED_ShowChinese(3, 3, 75);OLED_ShowChinese(3, 4, 76);OLED_ShowChinese(3, 5, 77);						OLED_ShowChinese(3, 6, 78);OLED_ShowChinese(3, 7, 79);										if (flag == 0) {Buzzer_OFF();LED_OFF();}if (flag == 1) {Buzzer_Turn();LED_Turn();}}}
}void TimeSet()           //设置时间
{if (KeyNum == 2)    //PB10{delay_ms(20);if (KeyNum == 2){T_state++;if (T_state > 2){T_state = 0;}}}if (T_state == 0)    //时间显示模式{MyRTC_ReadTime();OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时OLED_ShowString(1, 7, ":");OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分OLED_ShowString(1, 10, ":");OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒RTC_Time[0] = MyRTC_Time[3];RTC_Time[1] = MyRTC_Time[4];RTC_Time[2] = MyRTC_Time[5];}if (T_state == 1)    //修改时间{if (KeyNum == 5){delay_ms(20);if (KeyNum == 5){T_state1++;if (T_state1 > 2){T_state1 = 0;}}}if (T_state1 == 0)  //修改时{if (KeyNum == 4)RTC_Time[0]++;if (KeyNum == 3)RTC_Time[0]--;if (RTC_Time[0] > 23 & RTC_Time[0] < 100)RTC_Time[0] = 0;if (RTC_Time[0] > 100)RTC_Time[0] = 23;OLED_ShowNum(1, 5, RTC_Time[0], 2);  //时}if (T_state1 == 1)  //修改分{if (KeyNum == 4)RTC_Time[1]++;if (KeyNum == 3)RTC_Time[1]--;if (RTC_Time[1] > 59 & RTC_Time[1] < 100)RTC_Time[1] = 0;if (RTC_Time[1] > 100)RTC_Time[1] = 59;OLED_ShowNum(1, 8, RTC_Time[1], 2);  //时}if (T_state1 == 2)  //修改秒{if (KeyNum == 4)RTC_Time[2]++;if (KeyNum == 3)RTC_Time[2]--;if (RTC_Time[2] > 59)RTC_Time[2] = 0;if (RTC_Time[2] > 59 & RTC_Time[2] < 100)RTC_Time[2] = 0;if (RTC_Time[2] > 100)RTC_Time[2] = 59;OLED_ShowNum(1, 11, RTC_Time[2], 2);  //时}}if (T_state == 2){MyRTC_Time[3] = RTC_Time[0];MyRTC_Time[4] = RTC_Time[1];MyRTC_Time[5] = RTC_Time[2];MyRTC_SetTime();T_state = 0;}
}void TimeRead()
{MyRTC_ReadTime();OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时OLED_ShowString(1, 7, ":");OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分OLED_ShowString(1, 10, ":");OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒
}void ChuangGanXinXi(void)
{OLED_ShowString(1, 1, "PM2.5:");	OLED_ShowNum(1, 7, bufe[6], 4);	OLED_ShowChinese(2, 1, 53);    //光强OLED_ShowChinese(2, 2, 54);OLED_ShowString(2, 5, ":");OLED_ShowNum(2, 6, bufe[2], 2);OLED_ShowString(2, 11, "KQ:");   OLED_ShowNum(2, 14, bufe[5], 2);OLED_ShowChinese(3, 1, 60);     //烟雾OLED_ShowChinese(3, 2, 61);OLED_ShowString(3, 5, ":");OLED_ShowNum(3, 6, bufe[3], 2);OLED_ShowString(3, 11, "CO:");   OLED_ShowNum(3, 14, bufe[4], 2);OLED_ShowChinese(4, 1, 26);    //温湿度OLED_ShowChinese(4, 2, 28);OLED_ShowString(4, 5, ":");OLED_ShowChinese(4, 5, 27);OLED_ShowChinese(4, 6, 28);OLED_ShowString(4, 13, ":");OLED_ShowNum(4, 6, bufe[0], 2);OLED_ShowNum(4, 14, bufe[1], 2);
}void Yu_Set(void)
{OLED_ShowChinese(1, 3, 80);OLED_ShowChinese(1, 4, 81);						OLED_ShowChinese(1, 5, 82);OLED_ShowChinese(1, 6, 83);			OLED_ShowString(2, 1, "G:");OLED_ShowNum(2, 3, GuangYu, 2);OLED_ShowString(2, 7, "K :");OLED_ShowNum(2, 10, KONGYu, 2);OLED_ShowString(2, 13, "W:");OLED_ShowNum(2, 15, TempYu, 2);OLED_ShowString(3, 1, "Y:");OLED_ShowNum(3, 3, YanYu, 2);OLED_ShowString(3, 7, "CO:");OLED_ShowNum(3, 10, COYu, 2);OLED_ShowString(3, 13, "S:");OLED_ShowNum(3, 15, HumiYu, 2);OLED_ShowString(4, 1, "PM2.5:");OLED_ShowNum(4, 7, PM25Yu, 4);
}void KongZhi(void)
{if((bufe[0]>TempYu)||(bufe[1]>HumiYu)||(bufe[2]>GuangYu)||(bufe[3]>YanYu)||(bufe[4]>COYu)||(bufe[5]>KONGYu)||(bufe[6]>PM25Yu)){LED_Turn();Buzzer_Turn();}else{LED_OFF();Buzzer_OFF();}	YuZhiSet();			
}void YuZhiSet()
{if (KeyNum == 2)                          //自动模式下PB0按键控制阈值切换{delay_ms(20);if (KeyNum == 2){state3++;if (state3 > 6){state3 = 0;}}}if (state3 == 0){if (KeyNum == 3)GuangYu++;if (KeyNum == 4)GuangYu--;}if (state3 == 1){if (KeyNum == 3)KONGYu++;if (KeyNum == 4)KONGYu--;}if (state3 == 2){if (KeyNum == 3)TempYu++;if (KeyNum == 4)TempYu--;}if (state3 == 3){if (KeyNum == 3)YanYu++;if (KeyNum == 4)YanYu--;}if (state3 == 4){if (KeyNum == 3)COYu++;if (KeyNum == 4)COYu--;}if (state3 == 5){if (KeyNum == 3)HumiYu++;if (KeyNum == 4)HumiYu--;}if (state3 == 6){if (KeyNum == 3)PM25Yu+=10;if (KeyNum == 4)PM25Yu-=10;}}

7、总结

本文介绍了一个基于STM32F103C8T6的环境监测系统设计。系统通过多种传感器(温湿度、PM2.5、烟雾、一氧化碳等)实时采集环境数据,并通过OLED显示屏本地显示或通过ESP8266 WiFi模块上传至机智云平台实现远程监控。系统支持手动和自动两种控制模式,当检测值超过预设阈值时会触发声光报警。硬件包括STM32主控、传感器模块、显示模块和通信模块等,软件采用模块化设计,包含数据采集、处理、显示和通信等功能。该系统实现了环境参数的全面监测和智能报警,具有实用性和可扩展性。

http://www.lryc.cn/news/589234.html

相关文章:

  • QML视图与代理控件
  • Spring Boot全局异常处理:打造坚如磐石的应用防线
  • 【Java代码审计(2)】MyBatis XML 注入审计
  • Datawhale AI夏令营 机器学习2.1
  • AWS中国区资源成本优化全面指南:从理论到实践
  • 从零开始的python学习(八)P115+P116+P117+P118+P119+P120+P121+P122
  • 第十三讲 | map和set的使用
  • Windows内核对象
  • 【AutoCAD保姆级安装教程】AutoCAD 2025 版详细图文下载安装教程
  • wkhtmltopdf导出pdf调试参数
  • 【08】MFC入门到精通——MFC模态对话框 和 非模态对话框 解析 及 实例演示
  • 农村养老模式:乡土智慧与时代创新的共生之路
  • Gitlab跑CICD的时候,maven镜像和pom.xml使用的maven版本冲突导致没办法build成功的解决方法
  • 【C#地图显示教程:实现鼠标绘制图形操作】
  • jmeter之随机读取csv文件
  • jmeter提取接口返回值,对比去重
  • 说下对mysql MVCC的理解
  • LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记
  • 记录一条面试sql题目
  • 《每日AI-人工智能-编程日报》--2025年7月15日
  • vue实现el-table-column中自定义label
  • 对象数组列表转成树形结构--树形结构转成列表(处理菜单)
  • 牛客:HJ21 简单密码[华为机考][哈希]
  • T8332AD这是一款多拓扑芯片质量很硬朗?
  • 【jvm|基本原理】第四天
  • 力扣 hot100 Day45
  • LeetCode Hot100 【1.两数之和、2.两数相加、3.无重复字符的最长子串】
  • 拼多多笔试题目一
  • 人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?
  • 力扣——1071. 字符串的最大公因子