文章目录
一、电阻炉炉温控制系统
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的电阻炉炉温控制系统设计。
感谢你的观看!