基于STM32的电阻炉炉温控制系统设计



一、电阻炉炉温控制系统

1.题目要求

部件要求:
主控:STM32F103C8T6
显示:LCD1602
按键:独立按键2
声光报警:蜂鸣器+led小灯
供电:DC002+自锁开关
继电器
2(加热、制冷)
DS18B20温度传感器
蓝牙

主要功能需求:

1.实时检测电阻炉温度

2.温度高于阈值启动制冷,并且进行声光报警

3.温度低于阈值启动制热

4.可以通过蓝牙查看相关数据,并且可以设置阈值

2.思路

主控是STM32F103C8T6,我们的老朋友,我手上基本STM32项目都是选它作为主控

在这里插入图片描述

显示屏这次没有用OLED,而是选择字符型的LCD1602(对它不怎么熟悉的朋友可以去看下这一篇的介绍LCD1602显示

在Proteus仿真中,直接搜Lcd1602是找不到的,要搜LM016L才是。

这里第3脚接的10k的电位器本意是想调节鬼影问题,但是仿真中好像不会有问题,所以也可以直接接地GND。

在这里插入图片描述

两个独立按键是用来设置温度阈值大小的

在这里插入图片描述

声光报警:蜂鸣器+led小灯

在这里插入图片描述

供电:DC002+自锁开关

这里的DC002其实就是实物的DC母座,自锁开关就是第一次按时,开关接通并保持,即自锁,要等第二次按时,开关才会断开

在这里插入图片描述

这里就简单用一个开关代替,假设5V电源进去,经过3.3V的LDO降压输出3.3V。

在这里插入图片描述

当开关断开后进行仿真会报错,用以模拟还未上电的情况。

在这里插入图片描述
继电器*2(加热、制冷)

用NPN三极管来驱动继电器吸合或断开,也可以采用PNP三极管来驱动,电路得稍微改动下,这里就不演示了。

用电机转动来表示风扇进行制冷,用红色的指示灯常亮来表示加热中。

在这里插入图片描述

DS18B20温度传感器

在这里插入图片描述

蓝牙(用虚拟终端和虚拟串口软件,串口调试工具进行模拟)

在这里插入图片描述

3.电路仿真

3.1 未仿真

在这里插入图片描述

3.2 开始仿真,显示屏显示当前温度和阈值,温度低于阈值开始加热

在这里插入图片描述

3.3 温度高于阈值开始制冷

在这里插入图片描述

3.4 通过按键改变温度阈值

在这里插入图片描述

3.5 通过蓝牙查看相关数据,并且可以设置阈值

在这里插入图片描述

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HSI:64MHZ
Systick: 1ms

按键:
KEY1(PA0)
KEY2(PA1)

DS18B20温度传感器:DAT(PA4)

制冷:RELAY1(PA6)
加热:RELAY2(PA7)

模拟蓝牙模块(Uart1):9600(PA9:tx1,PA10:rx1)

声光报警:BUZZER(PA15)

LCD1602显示屏:
D0(PB0)
D1(PB1)
D2(PB2)
D3(PB3)
D4(PB4)
D5(PB5)
D6(PB6)
D7(PB7)

EN(PB10)
RW(PB11)
RS(PB12)

在这里插入图片描述

串口协议
举例如发送*Temp50,即设置温度阈值位50度
*TempXX 设置温度阈值 XX取值为0-99
*Read 读取当前的温度和温度阈值

4.2 主程序

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	UserSystemInit();//用户配置初始化		
	while (1)
	{			
			if(stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms
			{
				stSysTime.flg._10ms = Time_millis();
                Key_Scan();//按键扫描				
			}			
			if(stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
			{
				stSysTime.flg._100ms = Time_millis();					
                DS18B20_Collect_data();//DS18B20采集温湿度数据	
				LCD1602_Handel();//LCD1602显示				
                Forewarning_Handel();//预警函数	
                Receive_data_Handel();//数据接收判断  				
				IWDG_ReloadCounter();//清开门狗 				
			}	
  }
}

4.3 LCD1602显示程序

void LCD1602_ShowSting(uint8_t row, uint8_t col, uint8_t *s, uint8_t count)
{
    uint8_t i;
    row %= 2;
    col %= 40;
    LCD1602_WriteComm(0x80 + row * 0x40 + col);
    for (i = 0; s[i] != '\0' && count > 0 && col < 40; i++, col++, count--)
    {
        LCD1602_WriteData(s[i]);
    }
}

/*******************************************************************************
 * 函数名:LCD1602_Handel
 * 描述  :LCD1602显示
 * 输入  :void
 * 输出  :void
 * 调用  :100ms
 * 备注  :
 *******************************************************************************/
void LCD1602_Handel(void)
{
    LCD1602_ShowSting (0, 0, "TEMP:" , 5);	
	LCD1602_ShowSting(0, 6, (uint8_t *)str_buf1,2);
    LCD1602_ShowSting (0, 8, "." , 1);		
	LCD1602_ShowSting(0, 9, (uint8_t *)str_buf2,1);		

    LCD1602_ShowSting (1, 0, "Threshold:" , 10);	
	LCD1602_ShowSting(1, 11, (uint8_t *)str_buf3,2);			
}

4.4 串口接收指令程序

/*******************************************************************************
 * 函数名:Send_Cmd1
 * 描述  :设置温度阈值
 * 输入  :void
 * 输出  :void
 * 调用  :需要时调用
 * 备注  :举例如发送*Temp50,即设置温度阈值位50度
 *******************************************************************************/
void Send_Cmd1(void)
{
	uint8_t i = 0; 
	variable1 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));
	if((variable1 > 0) && (variable1 < 100))
	{
		Temp_Threshold = variable1;
		printf("手机设置的温度阈值 = %d\r\n",Temp_Threshold);	
	}
	else
	{
		printf("手机设置的温度阈值超出设置范围 \r\n");			
	}
}


/*******************************************************************************
 * 函数名:Send_Cmd2
 * 描述  :读取当前温度和阈值
 * 输入  :void
 * 输出  :void
 * 调用  :需要时调用
 * 备注  :
 *******************************************************************************/
void Send_Cmd2(void)
{
  printf("温度=%d.%d°C 阈值=%d°C\r\n",Temp_High,Temp_Low,Temp_Threshold);
}

/*******************************************************************************
 * Function    : Receive_data_Handel
 * Description : 数据接收判断
 * Input       : 无
 * Return      : 无
 * Call        : 100ms
 * Others      :
 *******************************************************************************/
void Receive_data_Handel(void)
{
	uint8_t i = 0;
	if(uart1_rx_finsh)
	{	  
			for(i = 0;i< 20; i++)
			{
					if(uart1_rx_buf[i] == '*')	
					{
							switch(uart1_rx_buf[i+1])
							{
								case  'T':Send_Cmd1();break;//*TempXX		
								case  'R':Send_Cmd2();break;//*Read								
								default:break;							
							}							
					}
			}
			uart1_rx_finsh = 0;	
			uart1_rx_count = 0;
			memset(uart1_rx_buf,0,RX_MAX_NUM);				
	}	
}

二、总结

今天主要讲了基于STM32的电阻炉炉温控制系统设计。

感谢你的观看!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值