一、项目概述
目标与用途
本项目旨在开发一套基于STM32单片机的智能水龙头控制系统,通过集成红外线人体探测、数字温度传感器、舵机驱动的混合水阀及OLED显示屏,实现对水温的智能控制和水流的自动断水。项目不仅提高了用户体验,还有效节约了水资源,减少不必要的水浪费。
解决的问题与价值
随着环保意识的提升及智能家居的发展,传统的水龙头难以在节水和便捷性上满足用户需求。本项目通过无触碰控制、精准的温度调节及实时显示水温,解决了用户如下问题:
-
便捷性:用户无需手动操作,享受无触碰的水流控制。
-
温控精准:确保水温始终处于用户所需的舒适范围。
-
智能节水:通过红外探测,自动断水,减少浪费。
二、系统架构
设计系统架构
本系统采用STM32F407作为控制核心,具备168MHz的高时钟频率及丰富的外设接口,适合实现复杂的温控算法。系统主要模块包括:
-
STM32F407单片机:主要控制器,执行算法和处理实时数据。
-
DS18B20数字温度传感器:用于实时测量水温。
-
舵机及混合水阀:调节冷热水流量比,控制水温。
-
红外传感器:探测人体,决定水流是否开启。
-
OLED显示屏:实时显示水温以及系统状态。
组件选择
-
单片机:STM32F407(处理能力强大,适合复杂运算)
-
温度传感器:DS18B20(数字输出,精度高)
-
舵机:用于驱动混合水阀
-
红外传感器:HC-SR501(红外探测人体)
-
显示模块:0.96寸OLED显示屏(显示实时水温)
系统架构图
三、环境示例和注意事项
环境示例
-
硬件环境:
-
STM32开发板(如Nucleo或Discovery系列)
-
DS18B20温度传感器及其库
-
舵机及混合水阀
-
HC-SR501红外传感器
-
OLED显示模块
-
软件环境:
-
IDE:Keil MDK或STM32CubeIDE
-
开发语言:C/C++
-
相关库:HAL库、CMSIS库
注意事项
-
传感器放置:确保红外传感器和温度传感器位置合理,避免干扰。
-
电源管理:确保系统有稳定的电源供应,避免因供电不足导致系统不稳定。
-
舵机校准:根据混合水阀调整舵机的角度,以达到最佳温控效果。
四、代码实现
1. 温度传感器模块
温度模块的代码主要负责DS18B20的初始化、数据读取和处理。
#include "ds18b20.h"
// 初始化DS18B20
void DS18B20_Init(void) {
// 配置GPIO,设置为推挽输出
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1; // 假设传感器连接到PA1
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 读取水温
float DS18B20_ReadTemperature(void) {
float temperature;
// 发生温度转换命令
DS18B20_StartConvert();
HAL_Delay(750); // 等待转换完成
temperature = DS18B20_ReadScratchpad(); // 读取数据
return temperature;
}
// DS18B20转换命令
void DS18B20_StartConvert(void) {
// 拉低数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1);
}
// 读取Scratchpad数据
float DS18B20_ReadScratchpad(void) {
// 读取温度数据
return ...; // 数据转换为温度
}
代码说明
-
DS18B20_Init()
函数用于初始化GPIO,确保数据线能正常工作。 -
DS18B20_ReadTemperature()
函数通过发出转换命令、延时后读取传感器数据,返回当前温度。
2. 舵机控制模块
舵机模块负责根据温度调节水流。
**#include "servo.h"
// 舵机引脚
#define SERVO_GPIO_PORT GPIOA
#define SERVO_PIN GPIO_PIN_2
// 舵机初始化
void Servo_Init(void) {
// 配置GPIO为PWM输出
TIM_HandleTypeDef htim;
TIM_OC_InitTypeDef sConfigOC;
__HAL_RCC_TIM2_CLK_ENABLE(); // 假设使用定时器2
htim.Instance = TIM2;
htim.Init.Prescaler = 8399; // 1MHz频率
htim.Init.Period = 20000; // 20ms周期
HAL_TIM_PWM_Init(&htim);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // 初始化为中立位
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); // 启动PWM输出
}
// 控制舵机设置角度
void Servo_SetAngle(int angle) {
// 将角度映射到PWM信号
float pulse = 500 + (angle / 180.0) * 2000; // PWM脉宽范围(500 ~ 2500)
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, pulse); // 设置PWM信号
}
代码说明
-
Servo_Init()
函数配置GPIO和定时器以生成PWM信号用于控制舵机。 -
Servo_SetAngle(int angle)
函数根据输入的角度计算出相应的PWM脉宽,并设置到定时器的比较寄存器中,从而实现舵机的定位。
3. 红外传感器模块
红外传感器模块用于检测是否有人靠近水龙头,从而控制水流的开关。
#include "ir_sensor.h"
// 初始化红外传感器
void IR_Sensor_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE(); // 假设连接到PB0
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置为输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉电阻
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
// 检测是否有人
bool IR_Sensor_Detect(void) {
// 读取红外传感器的输入状态
return HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // 返回人体探测状态
}
代码说明
-
IR_Sensor_Init()
函数初始化GPIO作为输入,连接到红外传感器。 -
IR_Sensor_Detect()
函数返回红外传感器的状态,若检测到人体则返回true
,否则返回false
。
4. OLED显示模块
OLED显示模块用于实时显示水温和系统状态。
#include "oled.h"
// OLED初始化
void OLED_Init(void) {
// 发送命令初始化OLED屏幕
OLED_WriteCommand(0xAE); // 关屏命令
// 其他初始化命令
OLED_WriteCommand(0x20); // 设置地址模式
// 配置列和页地址
OLED_WriteCommand(0xAF); // 开屏命令
}
// 显示当前水温
void OLED_DisplayTemperature(float temperature) {
char buffer[16];
snprintf(buffer, sizeof(buffer), "Temp: %.2f C", temperature);
OLED_WriteString(buffer, 0, 0); // 在第一行显示温度
}
代码说明
-
OLED_Init()
函数负责OLED显示屏的初始化,发送相关命令,开启显示。 -
OLED_DisplayTemperature(float temperature)
函数将水温格式化为字符串并在显示屏上显示。
时序图
下面是系统的时序图,展示了系统各组件的交互流程。
五、项目总结
本项目展示了一套基于STM32单片机的智能水龙头控制系统,成功实现了以下功能:
-
温控精准:通过DS18B20数字温度传感器实时监测水温,并根据温度数据调整水流。
-
智能节水:借助红外传感器检测人体的存在,能自动打开或关闭水流,有效避免水资源的浪费。
-
实时显示和反馈:使用OLED显示模块,实时向用户展示当前水温和系统状态,提升用户体验。
未来的改进
在未来的版本中,可以考虑增加以下功能与改进:
-
水质监测:增加水质传感器,实时监控水质状况。
-
手机控制:引入蓝牙或Wi-Fi模块,实现手机控制和状态监测。
-
数据记录:记录温度和水流使用情况,以便用户查看历史数据并进行分析。
通过以上步骤,我们成功地搭建了一套具备智能功能的水龙头控制系统,既提高了用户的生活品质,也为节水做出了贡献。希望未来能够将其推广应用于更多的智能家居场景中。