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

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#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;
	}
}

七、单片机实物资料

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

相关推荐
lingzhilab1 天前
零知派——STM32驱动摇杆+PCA9685实现4路360°舵机线性速度控制与自动演示
stm32·单片机·嵌入式硬件
不脱发的程序猿1 天前
嵌入式软件工程师,怎么把 AI 工具用顺手?
人工智能·单片机·嵌入式硬件·嵌入式
平凡灵感码头1 天前
芯片合封是个嘛?
单片机·嵌入式硬件
珠海西格电力1 天前
零碳园区的碳排放指标计算的实操步骤
大数据·运维·人工智能·物联网·能源
gscsded1 天前
C2000 GPIO 配置笔记
单片机
Sakuyu434681 天前
STM32基础
stm32·单片机·嵌入式硬件
gscsded1 天前
C2000 CPU Timer 学习笔记
单片机
iCxhust1 天前
AD0808调试笔记
笔记·单片机·嵌入式硬件·操作系统·微机原理·8088单板机
木子单片机1 天前
基于51单片机的步进电机调速系统设计
单片机·嵌入式硬件·51单片机·keil
三易串口屏1 天前
实验10 物理按键实验
单片机·51单片机·串口屏·串口协议·uart 通信·嵌入式 ui