基于STM32的水温控制系统设计
引言
本项目设计了一个基于STM32的水温控制系统,能够实时监测水温并自动调节加热器的功率,使水温维持在设定的目标温度范围内。系统适用于水浴锅、热水器等设备的温度控制,具备自动调节和过温报警功能。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- 温度传感器(如 DS18B20,用于测量水温)
- 加热器(如电阻丝加热器,或其他水加热装置)
- 固态继电器(SSR,用于控制加热器的通断)
- PWM 调节器(用于控制加热器的功率,选用)
- 蜂鸣器(用于过温报警)
- OLED 显示屏(用于显示水温状态)
- 按键(用于设置目标温度)
- USB-TTL 串口调试工具
- 电阻、杜邦线、面包板等基础电子元件
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- 温度传感器连接:将 DS18B20 的数据引脚连接到 STM32 的 GPIO(如 PA0),并使用 4.7kΩ 上拉电阻用于稳定数据通信。
- 加热器连接:通过固态继电器(SSR)控制加热器的通断,将SSR的控制引脚连接到 STM32 的 GPIO(如 PA1)。
- 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA2),用于超温报警。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示水温和系统状态。
- 按键连接:将按键的一个引脚连接到 STM32 的 GPIO(如 PA3),用于调整目标温度。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于传感器、加热器、蜂鸣器和按键控制。
- 配置 I2C 用于与 OLED 显示屏通信。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写温度测量、加热控制、温度设定、报警提示和状态显示的代码。以下是水温控制系统的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ds18b20.h"
#include "oled.h"
#include "gpio.h"// 定义温度控制参数
#define TEMP_THRESHOLD_HIGH 80.0 // 最高安全温度阈值,超过触发报警
#define TEMP_CONTROL_RANGE 2.0 // 温度调节的范围
#define HEATER_PIN GPIO_PIN_1 // 加热器控制引脚
#define BUZZER_PIN GPIO_PIN_2 // 蜂鸣器引脚// 函数声明
void System_Init(void);
void Measure_Temperature(void);
void Control_Heater(void);
void Handle_Alarm(void);
void Adjust_Target_Temperature(void);
void Display_Status(void);// 全局变量
float current_temperature = 0;
float target_temperature = 60.0; // 目标温度
uint8_t alarm_triggered = 0; // 报警标志void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();OLED_Init();DS18B20_Init();OLED_ShowString(0, 0, "Water Temp Control");
}// 读取当前水温
void Measure_Temperature(void)
{current_temperature = DS18B20_ReadTemperature(); // 读取温度
}// 控制加热器的开关
void Control_Heater(void)
{if (current_temperature < target_temperature - TEMP_CONTROL_RANGE){HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_SET); // 打开加热器}else if (current_temperature > target_temperature + TEMP_CONTROL_RANGE){HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_RESET); // 关闭加热器}
}// 处理超温报警
void Handle_Alarm(void)
{if (current_temperature > TEMP_THRESHOLD_HIGH){alarm_triggered = 1;HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_SET); // 打开蜂鸣器}else{alarm_triggered = 0;HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_RESET); // 关闭蜂鸣器}
}// 调整目标温度
void Adjust_Target_Temperature(void)
{if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET){target_temperature += 1.0; // 按下按钮,增加目标温度if (target_temperature > 90.0){target_temperature = 30.0; // 超过90度时循环回30度}HAL_Delay(200); // 防止按钮抖动}
}// 显示系统状态
void Display_Status(void)
{OLED_Clear();OLED_ShowString(0, 0, "Temp: ");OLED_ShowFloat(48, 0, current_temperature, 2);OLED_ShowString(0, 1, "Target: ");OLED_ShowFloat(48, 1, target_temperature, 2);if (alarm_triggered){OLED_ShowString(0, 2, "ALARM! Over Temp");}
}int main(void)
{System_Init();while (1){Measure_Temperature(); // 测量当前水温Control_Heater(); // 控制加热器Handle_Alarm(); // 检查是否超温报警Adjust_Target_Temperature(); // 调整目标温度Display_Status(); // 显示状态信息HAL_Delay(1000); // 每秒更新一次}
}
4. 各模块代码
温度传感器(DS18B20)读取
通过 DS18B20 温度传感器获取当前水温:
#include "ds18b20.h"// 初始化 DS18B20
void DS18B20_Init(void)
{// 配置 DS18B20 的数据引脚
}// 读取温度数据
float DS18B20_ReadTemperature(void)
{// 从 DS18B20 读取温度值return 25.5; // 假设读取到的温度为 25.5°C
}
加热器控制
通过固态继电器控制加热器的通断:
#include "gpio.h"// 控制加热器
void Control_Heater(void)
{if (current_temperature < target_temperature - TEMP_CONTROL_RANGE){HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_SET); // 打开加热器}else if (current_temperature > target_temperature + TEMP_CONTROL_RANGE){HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_RESET); // 关闭加热器}
}
蜂鸣器报警
通过蜂鸣器发出超温报警声:
#include "gpio.h"// 处理报警
void Handle_Alarm(void)
{if (current_temperature > TEMP_THRESHOLD_HIGH){HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_SET); // 打开蜂鸣器}else{HAL_GPIO_WritePin(GPIOA, BUZZER_PIN, GPIO_PIN_RESET); // 关闭蜂鸣器}
}
OLED 显示
OLED 显示屏用于显示水温和系统状态:
#include "oled.h"// 初始化 OLED 显示屏
void OLED_Init(void)
{// OLED 初始化代码
}// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
{// 在 OLED 显示屏上显示字符串
}// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{// 显示带小数的数值
}// 清屏
void OLED_Clear(void)
{// 清除 OLED 显示内容
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
问题讨论,stm32的资料领取可以私信!
系统工作原理
-
温度测量与显示:系统通过温度传感器实时测量水温,并将温度值显示在OLED屏上。用户可以通过按键设置目标温度。
-
加热控制:当实际温度低于设定温度时,系统打开加热器;当实际温度高于设定温度时,系统关闭加热器,确保水温始终接近目标温度。
-
过温报警:当温度超过最高安全阈值时,系统会自动触发报警,通过蜂鸣器发出声音警告。
常见问题与解决方法
1. 温度控制不稳定
- 问题原因:温度控制范围过小或温度传感器的响应速度慢。
- 解决方法:适当增加控制范围,提高温度传感器的采样频率。
2. 加热器无法正常关闭
- 问题原因:固态继电器控制信号不稳定或继电器损坏。
- 解决方法:检查控制信号的接线和继电器的工作状态,确保其正常工作。
3. OLED 显示不正常
- 问题原因:I2C 通信故障或 OLED 初始化失败。
- 解决方法:检查 I2C 连接是否稳定,并确保 OLED 初始化配置正确。
扩展功能
-
远程监控与控制:可以添加 Wi-Fi 模块,实现远程监控水温和调整目标温度。
-
PID 控制算法:引入 PID 控制算法,可以实现更精准的温度控制,减少温度波动。
-
多点温度监控:增加多个温度传感器,实现多点温度监控,并根据各点温度平均值进行加热控制。
结论
通过本项目,我们设计了一个基于STM32的水温控制系统,能够实时监测水温并自动调节加热器的工作状态。系统集成了温度测量、加热控制和报警功能,适用于各种需要温度控制的应用场景,如水浴锅、热水器等设备。未来可以通过引入远程控制、PID算法和多点监控等功能,进一步提升系统的智能化和精度。