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

【STM32项目开源】STM32单片机智能恒温箱控制系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

2.1 硬件清单:

2.2 功能介绍:

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计


一、设计背景和意义

1.1设计背景:

在物联网与智慧存储快速发展的当下,传统恒温箱温控系统存在诸多局限。多数温控设备仍依赖手动调节,缺乏环境适应性与智能化控制能力,既无法根据存储物品特性和环境变化自动调节,也难以满足精细化存储需求。随着人们对存储质量、能耗控制要求提升,单一控制模式已不适用。

现有智能恒温方案常存在功能割裂问题,远程调控、传感器联动、存储模型适配等功能未能有效整合,且成本较高难以普及。基于此,本设计以 STM32F103C8T6 为核心,融合多传感器与多控制方式,构建低成本、高集成度的智能恒温箱控制系统,以解决传统恒温箱温控的智能化不足问题。

1.2设计意义:

本设计通过整合多种监测与调控技术,具有多重实用价值。从存储管理看,提供远程、按键、APP、自动感应等多元控制方式,满足不同物品存储周期的调控需求,尤其存储模型适配与自动调节功能提升了管理便捷性。

从节能角度,借助环境监测与物品存储需求实现按需控温,避免无效能耗,符合绿色存储理念。从技术层面,探索了 STM32 微控制器与多模块协同工作的实现方式,为低成本智能恒温系统开发提供了可参考的集成方案,推动智能恒温箱技术的普及应用,具有较好的实践与推广价值。

二、实物展示

下方为实物演示视频

【开源】基于STM32单片机智能恒温箱控制系统

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6最小系统
  • OLED显示
  • 继电器控制电路(雾化器、加热片、风扇)
  • 温湿度传感器
  • 声光报警电路
  • JDY-31-SPP蓝牙模块

2.2 功能介绍:

(1)通过DHT11获取温湿度,当超过设置的温湿度,进行加热制冷加湿除湿,并声光报警
(2)通过按键设置温湿度上下限值
(3)通过OLED显示数据
(4)通过蓝牙将数据远程发送到手机APP上,手机APP可以远程控制加热制冷加湿除湿

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示


#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "oled.h"
#include "usart.h"
#include "dht11.h"/**********************************
变量定义
**********************************/
uint8_t key_num = 0;									//按键扫描标志位	
uint8_t flag_display = 0;							//显示界面标志位
uint32_t time_num = 0;								//10ms计时_Bool flag_mode = 0;									//当前模式标志位
int jr_flag = 0;
int zl_flag = 0;
int js_flag = 0;
int cs_flag = 0;u16 temp_value = 0;                 	//温度值
u16 temp_max = 30;                    //温度最大值
u16 temp_min = 20;										//温度最小值
_Bool alarm_temp = 0;									//温度异常标志位u16 humi_value = 0;                 	//湿度值
u16 humi_max = 60;                    //湿度最大值
u16 humi_min = 30;										//湿度最小值
_Bool alarm_humi = 0;									//湿度异常标志位char display_buf[32];									//显示数组extern uint8_t usart1_buf[256];				//串口1接收缓存区
unsigned char SendString[9];		//向蓝牙发送的显示信息
/**********************************
函数声明
**********************************/
void Key_function(void);							//按键函数
void Monitor_function(void);					//监测函数
void Display_function(void);					//显示函数
void Manage_function(void);						//处理函数/****
*******	主函数 
*****/
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断优先分组
Delay_Init();	    	 								//延时初始化	  
Gpio_Init();		  									//IO初始化
Key_Init();		  										//按键初始化
Oled_Init();		  									//OLED初始化
Oled_Clear_All();										//清屏
Usart1_Init(9600);  								//串口1初始化,由于蓝牙通信Oled_ShowString(1,5,"DHT11");				//DHT11温湿度传感器初始化
Oled_ShowCHinese(2,2,"初始化中");while(DHT11_Init());
//清屏
Delay_ms(1000);
Delay_ms(1000);
Oled_Clear_All();	while(1){
Key_function();										//按键函数
Monitor_function();								//监测函数
Display_function();								//显示函数
Manage_function();								//处理函数time_num++;												//计时变量+1
Delay_ms(10);
if(time_num %10 == 0)LED_SYS = ~LED_SYS;
if(time_num >= 5000){time_num = 0;}}
}/****
*******按键函数
*****/
void Key_function(void)
{key_num = Chiclet_Keyboard_Scan(0);					//按键扫描
if(key_num != 0)														//有按键按下{
switch(key_num){
case 1:																	//按键1:切换界面flag_display++;
if(flag_display >= 5)flag_display = 0;Oled_Clear_All();
break;case 2:																	//按键2:加键
switch(flag_display){
case 0:															//界面0:切换手动模式
//flag_mode = 1;
break;case 1:															//界面1:温度最大值+1
if(temp_max < 99)temp_max++;
break;case 2:															//界面2:温度最小值+1
if(temp_min < temp_max-1)temp_min++;
break;case 3:															//界面3:湿度最大值+1
if(humi_max < 99)humi_max++;
break;case 4:															//界面4:湿度最小值+1
if(humi_min < humi_max-1)humi_min++;
break;default:
break;}
break;case 3:																	//按键3:减键
switch(flag_display){
case 0:															//界面0:切换自动模式flag_mode = 0;
break;case 1:															//界面1:温度最大值-1
if(temp_max > temp_min+1)temp_max--;
break;case 2:															//界面2:温度最小值-1
if(temp_min > 0)temp_min--;
break;case 3:															//界面3:湿度最大值-1
if(humi_max > humi_min+1)humi_max--;
break;case 4:															//界面4:湿度最小值-1
if(humi_min > 0)humi_min--;
break;default:
break;}
break;default:
break;}}
}/****
*******监测函数
*****/
void Monitor_function(void)
{
if(flag_display == 0)																			//测量界面{
if(time_num % 10 == 0)																	//约2s检测一次、获取温湿度{Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);}}
}/****
*******显示函数
*****/
void Display_function(void)
{
switch(flag_display)																		//根据不同的显示模式标志位,显示不同的界面{
case 0:																								//界面0:测量界面,显示温湿度值,模式
Oled_ShowCHinese(1, 0, "温度:");
sprintf(display_buf,"%d.%dC  ",temp_value/10,temp_value%10);
Oled_ShowString(1, 6, display_buf);Oled_ShowCHinese(2, 0, "湿度:");
sprintf(display_buf,"%d.%d%%  ",humi_value/10,humi_value%10);
Oled_ShowString(2, 6, display_buf);if(flag_mode == 0)
Oled_ShowCHinese(3,0,"当前自动模式");
else
Oled_ShowCHinese(3,0,"当前手动模式");
break;case 1:																								//界面1:显示设置温度最大值
Oled_ShowCHinese(1,0,"设置温度最大值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",temp_max);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}
break;case 2:																								//界面2:显示设置温度最小值
Oled_ShowCHinese(1,0,"设置温度最小值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",temp_min);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}
break;case 3:																								//界面3:显示设置湿度最大值
Oled_ShowCHinese(1,0,"设置湿度最大值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",humi_max);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}
break;case 4:																								//界面4:显示设置湿度最小值
Oled_ShowCHinese(1,0,"设置湿度最小值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",humi_min);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}
break;default:
break;}
}/****
*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0)																			//测量界面{
if(flag_mode == 0)											//如果处于自动模式{
if(temp_value > temp_max*10)          //温度超过最大值,开启制冷{RELAY_ZL = 1;RELAY_JR = 0;alarm_temp = 1;}
else if(temp_value < temp_min*10)			//如果温度小于最小值,开启加热{RELAY_ZL = 0;RELAY_JR = 1;alarm_temp = 1;}
else//如果在设置的上下限之间,关闭加热制冷{RELAY_ZL = 0;RELAY_JR = 0;alarm_temp = 0;}if(humi_value > humi_max*10)					//如果湿度超过最大值,开启除湿{RELAY_CS = 1;RELAY_JS = 0;alarm_humi = 1;}
else if(humi_value < humi_min*10)			//如果湿度小于最小值,开启加湿{RELAY_CS = 0;RELAY_JS = 1;alarm_humi = 1;}
else//如果在设置的上下限之间,关闭加湿除湿{RELAY_CS = 0;RELAY_JS = 0;alarm_humi = 0;}if(alarm_temp == 1 || alarm_humi == 1)	//如果有异常、那么声光报警{
if(time_num % 5 == 0){LED = ~LED;BEEP = ~BEEP;}}
else{LED = 0;BEEP = 0;}}
else//手动模式,关闭声光报警{alarm_humi = 0;alarm_temp = 0;LED = 0;BEEP = 0;}}
else//设置界面,关闭所有继电器、声光报警{RELAY_JR = 0;RELAY_ZL = 0;RELAY_CS = 0;RELAY_JS = 0;LED = 0;BEEP = 0;}
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计


文章转载自:

http://IDd0ySBs.nmngq.cn
http://fD9E7UvF.nmngq.cn
http://a2RnfgPo.nmngq.cn
http://LXaZQDcy.nmngq.cn
http://PN1jmkA9.nmngq.cn
http://rnllG8hW.nmngq.cn
http://RYOklZlk.nmngq.cn
http://GsbxnGBR.nmngq.cn
http://HwpYCruR.nmngq.cn
http://cVAupZ3L.nmngq.cn
http://54x80n7Z.nmngq.cn
http://2Pr42vBr.nmngq.cn
http://qvtcxnDy.nmngq.cn
http://DxOAvZlK.nmngq.cn
http://HL5GnbSO.nmngq.cn
http://KBBAYByQ.nmngq.cn
http://9cYcVMWm.nmngq.cn
http://CeLk0l5G.nmngq.cn
http://pARfGkQ7.nmngq.cn
http://XMoCgmpX.nmngq.cn
http://TVN2DqRb.nmngq.cn
http://SHqo6o6D.nmngq.cn
http://nkF0sevr.nmngq.cn
http://XpXHlG8o.nmngq.cn
http://fjygbDsx.nmngq.cn
http://m9bzMkug.nmngq.cn
http://PKyGZuiU.nmngq.cn
http://wahq9Ha4.nmngq.cn
http://8QeoyRr2.nmngq.cn
http://lqwhDTdH.nmngq.cn
http://www.dtcms.com/a/375573.html

相关文章:

  • 苹果ios的系统app应用WebClip免签应用开源及方式原理
  • Java数据库连接JDBC完全解析
  • Node-RED 究竟是否适合工业场景?
  • zephyr开发环境搭建
  • OpenCV 实战:基于模板匹配的身份证号自动识别系统
  • java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
  • CMake工程指南
  • 单北斗GNSS该如何在变形监测中发挥最大效能?
  • 大数据毕业设计-基于大数据的高考志愿填报推荐系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 分布式锁redis
  • Java学习之——“IO流“的进阶流之转换流的学习
  • git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
  • 每日一算:分发糖果
  • 神经算子学习
  • AI大模型入门1.1-python基础字符串代码
  • Tlias管理系统(多表查询-内连接外连接)
  • win11家庭版配置远程桌面
  • 8. LangChain4j + 提示词工程详细说明
  • ChatGPT大模型训练指南:如何借助动态代理IP提高训练效率
  • 利用git进行版本控制
  • 深入理解synchronized:从使用到原理的进阶指南
  • 第八章 矩阵按键实验
  • 【CSS 3D 实战】从零实现旋转立方体:理解 3D 空间的核心原理
  • C++互斥锁使用详解与案例分析
  • Python+DRVT 从外部调用 Revit:批量创建柱
  • Matlab机器人工具箱6.2 导入stl模型——用urdf文件描述
  • 网页设计模板 HTML源码网站模板下载
  • 南京大学计算机学院 智能软件工程导论 + Luciano Baresi 教授讲座
  • Rust/C/C++ 混合构建 - Buck2构建工具一探究竟
  • Drawnix:开源一体化白板工具,让你的创意无限流动!