一、前言
项目成品图片:

哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的档案室环境监测系统(机智云版)
功能如下:
- 温湿度采集:系统通过DHT11模块采集温湿度
- 光敏监测:通过光敏传感器检测光照强度
- 红外监测:通过红外传感器检测是否有人
- 漏水监测:漏水传感器检测是否漏水
- 火焰监测:火焰传感器检测是否着火
- 蜂鸣器报警:环境异常情况下蜂鸣器报警
- OLED显示:显示温湿度、光照强度和烟雾浓度
- APP功能:使用机智云APP,通过WIFI模块连接APP来接收环境信息数据与控制指令下发
- 可切换模式:实现手动模式和自动模式的切换,手动模式下可控制灯光和风扇、加热片的开关
2.主要器件
- STM32F103C8T6最小系统板
- DHT11温湿度传感器
- OLED显示屏(4针IIC协议)
- WiFi模块(ESP8266-01s)
- MQ-2烟雾传感器
- 光敏传感器
- 光电红外传感器
- 火焰传感器
- 漏水传感器
- JR6001语音模块
- 风扇
- 蜂鸣器
- 加热片
- LED灯
三、原理图设计

四、PCB硬件设计
PCB图


五、程序设计
cpp
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "delay.h"
#include "dht11.h"
#include "oled.h"
#include "key.h"
#include "Modules.h"
#include "TIM2.h"
#include "adcx.h"
#include "LDR.h"
#include "mq2.h"
#include "water485.h"
#include "fan.h"
#include "jsq.h"
#include "usart2.h"
#include "usart3.h"
#include "TIM3.h"
#include "flash.h"
#include "bios.h"
#include "usart_fifo.h"
#include "gizwits_product.h"
#include "gizwits_protocol.h"
/****************异方辰电子工作室******************
* 项目 : STM32智能档案室环境监测系统
* 版本 : V1.0
* 日期 : 2026.7.25
* MCU : STM32F103C8T6
* 接口 : 见代码
* 作者 : 辰哥
* 工作室 : 异方辰电子工作室
**********************BEGIN***********************/
#define FLASH_START_ADDR 0x0800FC00
#define FLASH_FALG 0x55
#define KEY_Long1 11
#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
#define AUTO_MODE 1
#define MANUAL_MODE 2
#define SETTINGS_MODE 3
#define BIOS_MODE 4
extern SensorModules sensorData;
extern SensorThresholdValue Sensorthreshold;
extern DriveModules driveData;
uint8_t mode = AUTO_MODE;
static uint8_t count_a = 1;
uint8_t count_m = 1;
uint8_t count_s = 1;
uint8_t uartData;
uint8_t wifiConfigMode = 0;
uint32_t configStartTick = 0;
uint8_t flashSaveFlag = 0;
uint32_t flashSaveTick = 0;
static uint32_t gizTick = 0;
static uint32_t uploadTick = 0;
uint8_t bios_running = 0;
uint16_t oldtempmaxValue;
uint16_t oldtempminValue;
uint16_t oldhumiValue;
uint16_t oldluxvalue;
uint16_t oldmqvalue;
uint16_t oldwater;
uint16_t oldIR;
uint16_t oldsmoke;
/*
* 火灾语音一次播报标志
*
* 1:本次报警还没有播报
* 0:本次报警已经播报
*/
uint8_t FireVoiceOnce = 1;
/*
* 漏水语音一次播报标志
*
* 1:本次报警还没有播报
* 0:本次报警已经播报
*/
uint8_t WaterVoiceOnce = 1;
uint8_t smoke = 1;
int main(void)
{
SystemInit();
delay_init(72);
ADCx_Init();
LED_Init();
LED_Off();
LED1_Init();
LED1_Off();
Key_Init();
OLED_Init();
OLED_Clear();
DHT11_Init();
USART3_Init(9600);
BEEP_Init();
LDR_Init();
MQ2_Init();
IR_Init();
HW_Init();
Water485_Init();
FAN_Init();
JSQ_Init();
flash_read();
USART2_Config();
TIM2_Init(72 - 1,1000 - 1);
USART1_Config();
OLED_Clear();
TIM4_Int_Init(1000 - 1,72 - 1);
A7_SendCommand("AF:30");
delay_ms(1000);
A7_Play(1);
delay_ms(1000);
userInit();
gizwitsInit();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
ScanGizwitsMode();
while(1)
{
while(UART2_FIFO_Get(&uartData))
{
gizPutData(&uartData,1);
}
if(gizGetTimerCount() - gizTick >= 20)
{
gizTick = gizGetTimerCount();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
}
if((flashSaveFlag == 1) &&
(gizGetTimerCount() - flashSaveTick > 5000))
{
flashSaveFlag = 0;
FLASH_W(
FLASH_START_ADDR,
Sensorthreshold.tempmaxValue,
Sensorthreshold.tempminValue,
Sensorthreshold.humiValue,
Sensorthreshold.MQ2Value,
Sensorthreshold.luxValue,
Sensorthreshold.water,
Sensorthreshold.IRValue,
Sensorthreshold.smoke,
FLASH_FALG
);
}
SensorScan();
switch(mode)
{
case AUTO_MODE:
if(SetAuto() == 1)
{
OLED_autoPage1();
SensorDataDisplay1();
}
else
{
OLED_autoPage2();
SensorDataDisplay2();
}
AutoControl();
Control_Manager();
if(KeyNum == KEY_1)
{
KeyNum = 0;
mode = MANUAL_MODE;
count_m = 1;
OLED_Clear();
BEEP_Off();
}
if(KeyNum == KEY_Long1)
{
KeyNum = 0;
count_s = 1;
mode = SETTINGS_MODE;
BEEP_Off();
oldtempmaxValue = Sensorthreshold.tempmaxValue;
oldtempminValue = Sensorthreshold.tempminValue;
oldhumiValue = Sensorthreshold.humiValue;
oldluxvalue = Sensorthreshold.luxValue;
oldmqvalue = Sensorthreshold.MQ2Value;
oldwater = Sensorthreshold.water;
oldIR = Sensorthreshold.IRValue;
oldsmoke = Sensorthreshold.smoke;
OLED_Clear();
}
break;
case MANUAL_MODE:
OLED_manualOption(SetManual());
ManualControl(SetManual());
OLED_manualPage1();
ManualSettingsDisplay1();
if(KeyNum == KEY_1)
{
KeyNum = 0;
count_a = 1;
mode = AUTO_MODE;
OLED_Clear();
}
Control_Manager();
break;
case SETTINGS_MODE:
OLED_settingsOption(SetSelection());
ThresholdSettings(SetSelection());
if(SetSelection() <= 4)
{
OLED_settingsPage1();
SettingsThresholdDisplay1();
}
else
{
OLED_settingsPage2();
SettingsThresholdDisplay2();
}
if(KeyNum == KEY_1)
{
KeyNum = 0;
count_a = 1;
mode = AUTO_MODE;
OLED_Clear();
if( oldtempmaxValue != Sensorthreshold.tempmaxValue||
oldtempminValue != Sensorthreshold.tempminValue||
oldhumiValue != Sensorthreshold.humiValue ||
oldluxvalue != Sensorthreshold.luxValue ||
oldmqvalue != Sensorthreshold.MQ2Value ||
oldwater != Sensorthreshold.water ||
oldIR != Sensorthreshold.IRValue ||
oldsmoke != Sensorthreshold.smoke)
{
flashSaveFlag = 1;
flashSaveTick = gizGetTimerCount();
}
}
break;
case BIOS_MODE:
BIOS_MODE_1();
break;
default:
mode = AUTO_MODE;
break;
}
if(gizGetTimerCount() - uploadTick > 500)
{
uploadTick = gizGetTimerCount();
userHandle();
}
}
}
六、实验效果

七、包含内容
