【STM32单片机】温度报警控制系统设计

发布时间:2024年01月12日


一、主要功能

本项目使用STM32F103C8T6单片机控制器,使用无源蜂鸣器模块、IIC OLED显示模块、DS18B20温度传感器、独立按键、继电器加热、散热设备等。

主要功能:
系统运行后,OLED显示温度、温度阈值,温度控制状态信息;
可按下K1和K2键调节温度下限值,K3和K4键调节温度上限值;
当温度高于上限,开启降温装置,蜂鸣器报警;
当温度低于下限,开启升温装置,蜂鸣器报警;
当温度正常,关闭升温和降温装置;


二、软件设计

/*
作者:嗨小易(技术QQ群:570487280)
*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[6];
	int temp;
	
	while(1)
	{
		//正温度显示
		if(sys_ctrl.sign==0)
		{
			buf[0]=' ';
			buf[1]=sys_ctrl.temp/100+0x30;
			buf[2]=sys_ctrl.temp%100/10+0x30;
			buf[3]='.';
			buf[4]=sys_ctrl.temp%100%10+0x30;
			buf[5]='\0';
			OLED_ShowString(5*8,0,buf,16);
		}
		//负温度显示
		else
		{
			temp=-sys_ctrl.temp;
			buf[0]='-';
			buf[1]=temp/100+0x30;
			buf[2]=temp%100/10+0x30;
			buf[3]='.';
			buf[4]=temp%100%10+0x30;
			buf[5]='\0';
			OLED_ShowString(5*8,0,buf,16);
		}
		
		//温度阈值下限显示
		if(sys_ctrl.set_temp[0]>=0)
		{
			buf[0]=' ';
			buf[1]=sys_ctrl.set_temp[0]/10+0x30;
			buf[2]=sys_ctrl.set_temp[0]%10+0x30;
			buf[3]='\0';
			OLED_ShowString(6*8,20,buf,16);
		}
		else 
		{
			temp=-sys_ctrl.set_temp[0];
			buf[0]='-';
			buf[1]=temp/10+0x30;
			buf[2]=temp%10+0x30;
			buf[3]='\0';
			OLED_ShowString(6*8,20,buf,16);
		}
		
		//温度阈值上限显示
		if(sys_ctrl.set_temp[1]>=0)
		{
			buf[0]=' ';
			buf[1]=sys_ctrl.set_temp[1]/10+0x30;
			buf[2]=sys_ctrl.set_temp[1]%10+0x30;
			buf[3]='\0';
			OLED_ShowString(6*8,40,buf,16);
		}
		else 
		{
			temp=-sys_ctrl.set_temp[1];
			buf[0]='-';
			buf[1]=temp/10+0x30;
			buf[2]=temp%10+0x30;
			buf[3]='\0';
			OLED_ShowString(6*8,20,buf,16);
		}
		
		//温度状态显示
		if(sys_ctrl.flag==0)
			OLED_ShowString(14*8,40,"  ",16);
		else if(sys_ctrl.flag==1)
			OLED_ShowString(14*8,40,"SW",16);
		else if(sys_ctrl.flag==2)
			OLED_ShowString(14*8,40,"JW",16);
		
		OLED_Refresh_Gram();//刷新显示缓存
		break;
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	
	key=KEY_Scan(0);
	
	//下限+
	if(key==KEY1_PRESS)
	{
		sys_ctrl.set_temp[0]++;
		if(sys_ctrl.set_temp[0]>99)sys_ctrl.set_temp[0]=-20;
	}
	//下限-
	else if(key==KEY2_PRESS)
	{
		sys_ctrl.set_temp[0]--;
		if(sys_ctrl.set_temp[0]<-20)sys_ctrl.set_temp[0]=99;
	}
	//上限+
	else if(key==KEY3_PRESS)
	{
		sys_ctrl.set_temp[1]++;
		if(sys_ctrl.set_temp[1]>99)sys_ctrl.set_temp[1]=-20;
	}
	//上限-
	else if(key==KEY4_PRESS)
	{
		sys_ctrl.set_temp[1]--;
		if(sys_ctrl.set_temp[1]<-20)sys_ctrl.set_temp[1]=99;
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//如果温度高于上限,打开降温,蜂鸣器报警
	if(sys_ctrl.temp>sys_ctrl.set_temp[1]*10)
	{
		RELAY_JW=0;RELAY_SW=1;
		sys_ctrl.flag=2;
		BEEP_Alarm(100,100);
	}
	//如果温度低于下限,打开升温,蜂鸣器报警
	else if(sys_ctrl.temp<sys_ctrl.set_temp[0]*10)
	{
		RELAY_JW=1;RELAY_SW=0;
		sys_ctrl.flag=1;
		BEEP_Alarm(100,100);
	}
	else 
	{
		RELAY_JW=1;RELAY_SW=1;
		sys_ctrl.flag=0;
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

文章来源:https://blog.csdn.net/Hello_Muyi/article/details/135551963
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。