基于STM32的水温控制系统设计

devtools/2024/10/24 4:41:13/

引言

水温控制系统在家庭、工业和农业等多个领域具有重要应用,尤其在加热设备、热水器和地暖系统中,通过实时监测和调节水温可以提高能源利用效率,保证使用的舒适性和安全性。本文基于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远程控制、定时功能等,进一步提升系统的智能化和使用便捷性。


http://www.ppmy.cn/devtools/128359.html

相关文章

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…

scrapy案例——豆瓣电影Top250的爬取

项目&#xff1a;豆瓣电影Top250的爬取 案例需求&#xff1a; 1.使用scrapy爬虫技术爬取豆瓣电影Top250的电影数据&#xff08;包括排名、电影名称、导演、演员、url、评分&#xff09; 2.实现分页爬取&#xff0c;共十页 3.将爬取下来的数据保存在数据库中 案例分析&…

初学者怎么入门大语言模型(LLM)?

如果你真心想要入门大型语言模型&#xff08;LLM&#xff09;&#xff0c;只看这一个文章应该是可以入门的。但是修行下去&#xff0c;还是要靠自己的了&#xff01; 如果你把大语言模型/LLM 当成一门技术来看&#xff0c;那就要看一下这门技术需要什么。 基本要求&#xff1…

给哔哩哔哩bilibili电脑版做个手机遥控器

前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而&#xff0c;电脑版的bilibili不能通过手机控制视频翻页和调节音量&#xff0c;这意味着观看视频时需要一直坐在电脑旁边。那么&#xff0c;有没有办法制作一个手机遥控器来控制bilibili电脑版呢&#xff1f; 首先…

pdf文件怎样一张纸打印四页

在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件中的多页内容合并打印到一张纸上的情况&#xff0c;比如将四页内容打印到一张A4纸上&#xff0c;以节省纸张和成本。同时&#xff0c;在打开pdf文件的方式&#xff0c;一般都是通过电脑浏览器打印&#xff0c;因此对…

九、pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…

中小型医院网站:Spring Boot开发策略

2 相关技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;…

Linux_进程终止_进程等待_进程替换

进程终止 不知道大家想过没有&#xff0c;我们写的main()函数的返回值是返回给谁的呢&#xff1f;其实是返回给父进程或者系统的。 int main() {std::cout << "hello" << std::endl;return 10; }运行该代码&#xff0c;输入hello&#xff0c;没问题&am…