STM32项目开源:图书馆环境监测系统(代码+原理图+仿真)
·
一、前言
实物项目成品:

仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):
https://www.bilibili.com/video/BV1ETYs6nE2v/?vd_source=10da4d04d580bd6b34f7298120737c50
(资料分享见文末)
二、项目功能简介
【开源】STM32单片机图书馆环境监测系统(代码+原理图+仿真)-编号:CY26016
功能介绍:
(1)采用 STM32F103C8T6 最小系统板作为核心控制器。
(2)环境检测功能:实时采集图书馆内环境的温湿度、空气质量浓度、光照强度等环境参数。
(3)显示功能:OLED 显示屏实时展示各类传感器采集数据、系统工作模式、窗帘状态等信息。
(4)手动模式:通过实体按键实现手动控制图书馆设备,可手动操控台灯、风扇、窗帘(步进电机)的开启与关闭。
(5)自动模式:系统根据环境参数自动调控设备;当温湿度超标时,自动开启风扇进行环境调节;当空气质量浓度超标时,自动打开窗帘,并触发蜂鸣器声光报警提醒;当环境光照低于预设阈值,自动开启补光灯。
(6)语音控制功能:支持语音指令,可实现模式切换,以及台灯、风扇、窗帘的开关控制。
(7)断电记忆功能:系统保存各项环境阈值参数,设备断电重启后阈值设置不会丢失。
(8)机智云 APP 远程功能:手机 APP 可以远程查看图书馆环境传感器实时数据,同时远程下发指令控制台灯、风扇、窗帘的开关。
三、PCB设计

四、原理图设计

五、程序设计
代码如下():
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "led.h"
#include "OLED.h"
#include "beep.h"
#include "dht11.h"
#include "oleddispaly.h"
#include "key.h"
#include "ADc.h"
#include "flash.h"
#include "usart.h"
#include "motor_bujin.h"
#include <stdlib.h>
#include "stdio.h"
#include "string.h"
#include "stdbool.h"
#define FLASH_SAVE_ADDR ((u32)0x0800F000) //设置FLASH 保存地址(必须为偶数)
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
Delay_Init();
OLED_Init(); //OLED初始化
OLED_Clear(); //清屏
OLED_ShowCHineseString(byte(4), line3, jiudian1, 4);
Step_Motor_Init(); //步进电机初始化
DHT11_Init(); //温湿度传感器
MQ2_Init(); //烟雾传感器
uart1_Init(9600); //串口初始化
Key_Init(); //按键初始化
BEEP_Init(); //蜂鸣器初始化
uart2_Init(9600);
CheckNewMcu();// 检查是否是新的单片机,是的话清空存储区,否则保留
Delay_ms(1000);
OLED_Clear(); //清屏
while (1)
{
key_deal(); //按键处理函数
if (mode==0)
{
if (Mod1_Flag==1) //阈值设置界面
{
BEEP = BEEP_OFF;
OLED_ShowCHineseString(byte(2), line1, State_value, 6); //显示中文:参数阈值设置
OLED_ShowCHineseString(byte(0), line3, wendu, 2);
OLED_ShowCHineseString(byte(4), line3, yuzhi, 3);
OLED_ShowNum(80, 2, temperature_value, 2, 8); //显示温度阈值
}
else if (Mod1_Flag==2) //湿度阈值设置界面
{
OLED_ShowCHineseString(byte(2), line1, State_value, 6); //显示中文:参数阈值设置
OLED_ShowCHineseString(byte(0), line3, shidu, 2);
OLED_ShowCHineseString(byte(4), line3, yuzhi, 3);
OLED_ShowNum(80, 2, humidity_value, 2, 8); //显示湿度阈值
}
else if (Mod1_Flag==3) //烟雾阈值设置界面
{
OLED_ShowCHineseString(byte(2), line1, State_value, 6); //显示中文:参数阈值设置
OLED_ShowCHineseString(byte(0), line3, GZ_dis, 2); //显示中文:光照
OLED_ShowCHineseString(byte(4), line3, yuzhi, 3);
OLED_ShowNum(80, 2, light_min, 4, 8); //显示烟雾阈值
}
else if (Mod1_Flag==4) //烟雾阈值设置界面
{
OLED_ShowCHineseString(byte(1), line1, State_value, 6); //显示中文:参数阈值设置
OLED_ShowCHineseString(byte(0), line3, yanwu, 2);
OLED_ShowCHineseString(byte(4), line3, yuzhi, 3);
OLED_ShowNum(80, 2, MQ2_value, 2, 8); //显示烟雾阈值
}
else //主界面
{
crl_flag=1;
if(crl_flag1==1)
{
crl_flag1=0;
OLED_Clear(); //清屏
}
DHT11_Read_Data(&temperature, &tempd, &humidity, &humi); //获取温湿度
Adc_value = (float)Get_Adc_Average(ADC_Channel_1, 2)/41.36; //采集烟雾
light_value = (float)Get_Adc_Average(ADC_Channel_4, 2)/1.023; //采集烟雾
OLED_ShowCHineseString(byte(0), line1, wendu, 2); //显示中文:温度
OLED_ShowCHineseString(byte(9)-8, line1, shidu, 2); //显示中文:湿度
OLED_ShowCHineseString(byte(0), line3, GZ_dis, 2); //显示中文:光照
OLED_ShowCHineseString(byte(0), line5, yanwu, 2); //显示中文:烟雾
OLED_ShowChar(32, 0, ':', 8);
OLED_ShowChar(96, 0, ':', 8);
OLED_ShowChar(32, 2, ':', 8);
OLED_ShowChar(32, 4, ':', 8);
OLED_ShowChar(56, 0, 'C', 8);
OLED_ShowChar(120, 0, '%', 8);
OLED_ShowNum(40, 0, temperature, 2, 8); //显示温度整数
OLED_ShowNum(104, 0, humidity, 2, 8); //显示湿度整数
OLED_ShowNum(40, 2, light_value, 4, 8); //显示光照
OLED_ShowString(80, 2,"Lux", 8);
OLED_ShowNum(40, 4, Adc_value, 2, 8);
OLED_ShowString(64, 4, "ppm", 8);
if (chuangflag==1)
OLED_ShowCHineseString(byte(10), line7, dakai, 2); //打开
else
OLED_ShowCHineseString(byte(10), line7, guanbi, 2); //关闭
OLED_ShowCHineseString(byte(0), line7, mode_value1,4); //自动
if (mode== 0)
{
if (temperature > temperature_value || humidity > humidity_value) //温湿度和烟雾大于阈值
{
FengS=1; //风扇开
}
else
{
FengS=0; //风扇关
}
if (Adc_value > MQ2_value)
{
if(flag_bujin_state == 0)
{
flag_bujin_foreward = 1;
flag_bujin_reversal = 0;
}
chuangflag=1;
BEEP = BEEP_ON;
}
else
{
if(flag_bujin_state == 1)
{
flag_bujin_foreward = 0;
flag_bujin_reversal = 1;
}
chuangflag=0;
BEEP = BEEP_OFF;
}
if(light_value>light_min)
light_led=0; //关照明
else
light_led=1; //开照明
}
Delay_ms(100);
}
}
else //手动界面
{
crl_flag1=1;
if(crl_flag==1)
{
crl_flag=0;
OLED_Clear(); //清屏
}
select(Num);
OLED_ShowCHineseString(byte(0), line1, chuangliang, 3); //显示中文:窗帘
OLED_ShowCHineseString(byte(0), line3, FenfS, 3); //显示中文:风扇
OLED_ShowCHineseString(byte(0), line5, zhaom, 3); //显示中文:照明
OLED_ShowCHineseString(byte(3), line7, mode_value2, 4); //手动模式
if(fen_flag)
{
FengS=1; //风扇开
OLED_ShowCHineseString(byte(7), line3, kai, 1);
}
else
{
FengS=0; //风扇关
OLED_ShowCHineseString(byte(7), line3, guan, 1);
}
if(zaom_flag)
{
light_led=1; //开照明
OLED_ShowCHineseString(byte(7), line5, kai, 1);
}
else
{
light_led=0; //关照明
OLED_ShowCHineseString(byte(7), line5, guan, 1);
}
if(CL_flag)
{
if(flag_bujin_state == 0)
{
flag_bujin_foreward = 1;
flag_bujin_reversal = 0;
}
OLED_ShowCHineseString(byte(7), line1, kai, 1);
}
else
{
if(flag_bujin_state == 1)
{
flag_bujin_foreward = 0;
flag_bujin_reversal = 1;
}
OLED_ShowCHineseString(byte(7), line1, guan, 1);
}
}
}
}
六、包含内容

七、资料分享
资料获取:请查看主页介绍搜索或观看开源视频获取
更多推荐


所有评论(0)