本项目使用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设计,视频分享,技术交流。