引言
水温控制系统在家庭、工业和农业等多个领域具有重要应用,尤其在加热设备、热水器和地暖系统中,通过实时监测和调节水温可以提高能源利用效率,保证使用的舒适性和安全性。本文基于STM32设计了一个智能水温控制系统,集成温度传感器、加热器、冷却设备等组件,能够实时监测水温并根据设定温度自动调节,确保水温保持在用户指定范围内。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- DS18B20 数字温度传感器(用于水温监测)
- 加热器(如电热丝,控制水温升高)
- 冷却器或风扇(用于水温降低)
- 电机驱动模块(如 L298N,用于控制加热器或风扇)
- OLED 显示屏(用于显示当前水温及状态)
- 按键模块(用于设定目标水温)
- 蜂鸣器(用于温度异常报警)
- USB-TTL 串口调试工具
- 电阻、杜邦线、面包板等基础电子元件
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- 温度传感器连接:将 DS18B20 温度传感器的数据引脚连接到 STM32 的 GPIO(如 PA0),用于监测水温。
- 加热器和冷却器连接:将电热丝(加热器)和风扇(冷却器)的控制引脚连接到电机驱动模块,电机驱动模块的控制引脚再连接到 STM32 的 GPIO(如 PA1、PA2)。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示当前水温和目标水温。
- 按键模块连接:将按键的引脚连接到 STM32 的 GPIO(如 PA3、PA4),用于设置和调节目标水温。
- 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA5),用于发出异常报警信号。
- 其他连接:为 STM32、传感器、加热器、风扇、显示屏等设备提供稳定的电源,并确保信号线接线正确。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 用于温度传感器、按键、蜂鸣器等外设。
- 配置 I2C,用于与 OLED 显示屏通信。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写温度监测、设定目标温度、控制加热和冷却设备、报警提示和OLED数据显示的代码。以下是水温控制系统的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ds18b20.h"
#include "motor_control.h"
#include "oled.h"
#include "gpio.h"// 定义目标水温
#define TEMP_MIN_THRESHOLD 15.0 // 最低水温(摄氏度)
#define TEMP_MAX_THRESHOLD 45.0 // 最高水温(摄氏度)
#define TEMP_SETPOINT_DEFAULT 25.0 // 默认目标水温// 函数声明
void System_Init(void);
void Measure_Temperature(void);
void Control_Temperature(void);
void Display_Temperature(void);
void Adjust_Setpoint(void);
void Trigger_Alarm(void);// 全局变量
float current_temperature = 0; // 当前水温
float temp_setpoint = TEMP_SETPOINT_DEFAULT; // 目标水温
uint8_t alarm_flag = 0; // 报警标志void System_Init(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();OLED_Init();DS18B20_Init();Motor_Control_Init();OLED_ShowString(0, 0, "Water Temp Control Ready");
}// 测量水温
void Measure_Temperature(void)
{current_temperature = DS18B20_Read_Temperature(); // 读取当前水温
}// 显示水温和目标水温
void Display_Temperature(void)
{OLED_Clear();OLED_ShowString(0, 0, "Current Temp: ");OLED_ShowFloat(64, 0, current_temperature, 2);OLED_ShowString(0, 1, "Set Temp: ");OLED_ShowFloat(64, 1, temp_setpoint, 2);
}// 温度控制逻辑
void Control_Temperature(void)
{if (current_temperature < temp_setpoint - 0.5) // 若当前温度低于目标温度,开启加热器{Motor_Control_Heater_On();Motor_Control_Cooler_Off();}else if (current_temperature > temp_setpoint + 0.5) // 若当前温度高于目标温度,开启冷却器{Motor_Control_Heater_Off();Motor_Control_Cooler_On();}else // 温度在范围内,关闭加热器和冷却器{Motor_Control_Heater_Off();Motor_Control_Cooler_Off();}if (current_temperature < TEMP_MIN_THRESHOLD || current_temperature > TEMP_MAX_THRESHOLD){alarm_flag = 1;Trigger_Alarm(); // 触发异常报警}else{alarm_flag = 0;}
}// 调节目标温度
void Adjust_Setpoint(void)
{if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET) // 增加目标温度{temp_setpoint += 0.5;HAL_Delay(200); // 防止按键抖动}if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET) // 减少目标温度{if (temp_setpoint > TEMP_MIN_THRESHOLD){temp_setpoint -= 0.5;}HAL_Delay(200); // 防止按键抖动}
}// 异常报警
void Trigger_Alarm(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 启动蜂鸣器HAL_Delay(500);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭蜂鸣器
}int main(void)
{System_Init();while (1){Measure_Temperature(); // 测量水温Display_Temperature(); // 显示当前水温和设定温度Control_Temperature(); // 控制加热器和冷却器Adjust_Setpoint(); // 调整设定温度HAL_Delay(1000); // 每秒更新一次}
}
4. 各模块代码
温度传感器
通过 DS18B20 传感器读取当前水温:
#include "ds18b20.h"// 初始化 DS18B20 温度传感器
void DS18B20_Init(void)
{// 配置 GPIO,用于读取温度数据
}// 读取当前水温
float DS18B20_Read_Temperature(void)
{// 从传感器读取水温并返回return 25.0; // 假设当前水温为 25°C
}
电机控制
通过电机驱动模块控制加热器和冷却器的开关状态:
#include "motor_control.h"// 初始化电机控制模块
void Motor_Control_Init(void)
{// 配置 GPIO,用于控制加热器和冷却器
}// 启动加热器
void Motor_Control_Heater_On(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // 启动加热器
}// 关闭加热器
void Motor_Control_Heater_Off(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 关闭加热器
}// 启动冷却器
void Motor_Control_Cooler_On(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 启动冷却器
}// 关闭冷却器
void Motor_Control_Cooler_Off(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 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 显示内容
}
按键输入
通过按键调节目标水温:
#include "gpio.h"// 初始化按键
void GPIO_Init(void)
{// 配置 GPIO 引脚,用于按键输入
}// 检测按键输入并调整目标温度
void Adjust_Setpoint(void)
{if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET) // 增加目标温度{temp_setpoint += 0.5;HAL_Delay(200); // 防止按键抖动}if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET) // 减少目标温度{if (temp_setpoint > TEMP_MIN_THRESHOLD){temp_setpoint -= 0.5;}HAL_Delay(200); // 防止按键抖动}
}
蜂鸣器报警
当水温超出设定范围时,通过蜂鸣器发出报警:
#include "gpio.h"// 初始化蜂鸣器
void Trigger_Alarm(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 启动蜂鸣器HAL_Delay(500);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭蜂鸣器
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
问题讨论,stm32的资料领取可以私信!
系统工作原理
-
温度检测与控制:系统通过 DS18B20 温度传感器实时检测水温,并根据用户设定的目标温度自动控制加热器和冷却器的开关。若水温低于目标值,系统启动加热器进行加热;若水温超过目标值,系统则启动冷却器进行降温。
-
OLED 显示与按键调节:系统使用 OLED 显示屏显示当前水温和目标水温,用户通过按键调节设定的目标温度,调节过程实时更新并显示在 OLED 屏幕上。
-
报警功能:当水温超出设定的安全范围(例如低于 15°C 或高于 45°C),系统将启动蜂鸣器进行报警,提示用户水温异常,防止设备或人员损伤。
常见问题与解决方法
1. 温度测量不准确
- 问题原因:传感器校准不正确或安装位置不当。
- 解决方法:校准温度传感器,确保传感器安装在水流充足且温度变化及时的地方。
2. 加热或冷却不响应
- 问题原因:电机驱动模块连接不良或加热器/冷却器损坏。
- 解决方法:检查电机驱动模块的连接,并确保加热器和冷却器正常工作。
3. OLED 显示异常
- 问题原因:I2C通信故障或OLED模块损坏。
- 解决方法:检查I2C连接,确保OLED模块初始化正确。
扩展功能
-
Wi-Fi远程控制:集成 Wi-Fi 模块,让用户通过手机 APP 远程控制水温和监控系统状态。
-
定时功能:加入定时功能,让系统可以根据预设时间段自动调整水温,例如早晚不同时间段的不同设定温度。
-
水质监测功能:加入水质传感器,实时监测水质,并在检测到水质异常时进行报警提示。
结论
通过本项目,我们设计了一个基于STM32的水温控制系统,能够实时监测水温并自动调节加热器和冷却器,确保水温保持在用户设定的范围内。系统具备数据实时显示、按键调节、报警功能等,适用于家庭热水器、工业加热设备等多个场景。未来可以通过增加Wi-Fi远程控制、定时功能等,进一步提升系统的智能化和使用便捷性。