一、前言

实物项目成品:
在这里插入图片描述

仿真项目成品:
在这里插入图片描述

哔哩哔哩开源视频链接(复制浏览器打开):
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);
			}
		}
	}
}

六、包含内容

在这里插入图片描述

七、资料分享

资料获取:请查看主页介绍搜索或观看开源视频获取

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐