STM32档案室环境监测系统(机智云版)

一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1R4uq6QEFa/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的档案室环境监测系统(机智云版)

功能如下:

  1. 温湿度采集:系统通过DHT11模块采集温湿度
  2. 光敏监测:通过光敏传感器检测光照强度
  3. 红外监测:通过红外传感器检测是否有人
  4. 漏水监测:漏水传感器检测是否漏水
  5. 火焰监测:火焰传感器检测是否着火
  6. 蜂鸣器报警:环境异常情况下蜂鸣器报警
  7. OLED显示:显示温湿度、光照强度和烟雾浓度
  8. APP功能:使用机智云APP,通过WIFI模块连接APP来接收环境信息数据与控制指令下发
  9. 可切换模式:实现手动模式和自动模式的切换,手动模式下可控制灯光和风扇、加热片的开关

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 *)&currentDataPoint);
    ScanGizwitsMode();

    while(1)
    {
        while(UART2_FIFO_Get(&uartData))
        {
            gizPutData(&uartData,1);
        }

        if(gizGetTimerCount() - gizTick >= 20)
        {
            gizTick = gizGetTimerCount();
            gizwitsHandle((dataPoint_t *)&currentDataPoint);
        }

        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();
        }
    }
}

六、实验效果

七、包含内容

项目分享

相关推荐
emdoorrugged1 小时前
产线数字化管理三防平板怎么选品牌?不同场景推荐不同厂家
单片机·嵌入式硬件
Hello_Damon_Nikola2 小时前
SS6285L从入门到精通
单片机·嵌入式硬件
雾削木2 小时前
STM32 HAL + FreeRTOS(CMSIS-RTOS V1)完整开发攻略
stm32·单片机·嵌入式硬件
wuyk55511 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
小僧景贤15 小时前
单片机全方位调试实战指南:串口/RTT/逻辑分析仪/示波器/内核排错分层避坑教程
单片机·嵌入式硬件·物联网
2401_8275012819 小时前
【无标题】
arm开发·嵌入式硬件
LeoZY_19 小时前
LinkScope 使用笔记:基于 OpenOCD 的通用硬件芯片调试助手
笔记·单片机·嵌入式硬件·开源软件
星空真迷人21 小时前
嵌入式鸿蒙并非精简版,核心究竟是什么?
stm32·单片机·嵌入式硬件·物联网·华为·harmonyos·iot
iCxhust1 天前
8088单板机VScode集成开发环境使用方法二(汇编版)
汇编·单片机·微机原理·8088单板机