1. 项目概述
这个基于STM32的智能公厕系统是我去年指导的一个本科毕业设计项目,经过三个月的开发和调试,最终实现了一套完整的自动化公厕管理方案。作为一名从事嵌入式开发多年的工程师,我认为这个项目很好地结合了传感器技术、自动控制和环保理念,特别适合作为电子类专业学生的综合实践课题。
系统核心功能包括:使用状态检测(通过称重传感器)、自动通风控制、智能冲水触发以及水位报警。整个系统硬件成本控制在200元以内,但实现了传统公厕难以达到的智能化管理水平。下面我将从设计思路、硬件选型、软件实现到调试经验,全面剖析这个项目的技术细节。
2. 系统设计与硬件选型
2.1 整体架构设计
系统采用典型的嵌入式系统分层架构:
- 感知层:HX711称重模块、水位传感器
- 控制层:STM32F103C8T6最小系统板
- 执行层:继电器控制的风扇/水泵、LED指示灯、蜂鸣器
这种架构的优势在于:
- 模块化设计便于调试和维护
- 传感器与执行器隔离,提高系统可靠性
- 核心控制器资源充足,留有扩展空间
2.2 核心器件选型
2.2.1 主控制器:STM32F103C8T6
选择这款"蓝色药丸"开发板主要基于以下考虑:
- 72MHz主频足够处理传感器数据
- 64KB Flash/20KB RAM满足程序存储需求
- 丰富的GPIO和定时器资源
- 成本仅15-20元,性价比极高
实际开发中发现:虽然STM32CubeMX可以快速生成初始化代码,但对于初学者建议先手动配置GPIO,更有利于理解底层原理。
2.2.2 称重模块:HX711
选用HX711而非普通压力传感器的原因:
- 内置24位ADC,分辨率达0.01g
- 差分输入有效抑制共模干扰
- 自带128倍增益放大器
- 简单2线串行接口
参数设置经验:
- 称重平台建议使用5mm厚亚克力板
- 量程选择10kg(满足成人站立需求)
- 采样频率设为10Hz(兼顾响应速度与稳定性)
2.2.3 水位检测方案
对比三种方案后选择电容式传感器:
- 浮球式:机械结构易卡死(淘汰)
- 光电式:易受污物影响(淘汰)
- 电容式:非接触检测,可靠性高
具体使用TDS水质检测模块改装的技巧:
- 去除原电极,改用铜箔包裹PVC管
- 校准空/满状态时的电容值
- 设置10%余量作为报警阈值
3. 硬件电路设计详解
3.1 电源电路设计
系统采用12V/2A适配器供电,通过两级转换:
- LM2596降压至5V(风扇/水泵)
- AMS1117-3.3V(MCU及传感器)
关键设计要点:
- 每个电机单独添加1000μF电容滤波
- 数字/模拟地单点连接
- 所有IO口串联100Ω电阻保护
3.2 传感器接口电路
HX711连接方式:
code复制STM32 PA0 ---> HX711 DT
STM32 PA1 ---> HX711 SCK
HX711 VCC ---> 3.3V
HX711 GND ---> GND
布线注意:称重传感器信号线需使用双绞线,长度不超过50cm
水位传感器电路:
code复制 3.3V
│
└───┬─── 10kΩ
│
├─── STM32 PC0 (ADC)
│
电容传感器
│
GND
3.3 执行机构驱动
采用SGL8022W双路触摸芯片改造为电机控制器:
- 输入接STM32 PWM输出
- 输出驱动MOS管(IRF540N)
- 添加1N4007续流二极管
实测驱动能力:
- 风扇(12V/0.3A):PWM占空比30%
- 水泵(12V/1.2A):脉冲模式(开2s/关5s)
4. 软件系统实现
4.1 主程序流程图
c复制void main() {
hardware_init();
calibrate_sensors();
while(1) {
check_weight();
check_water_level();
control_actuators();
delay_ms(100);
}
}
4.2 关键算法实现
4.2.1 人员检测算法
c复制#define WEIGHT_THRESHOLD 30.0 // kg
void check_weight() {
static float prev_weight = 0;
float current = get_weight();
if(fabs(current - prev_weight) > WEIGHT_THRESHOLD) {
if(current > prev_weight) person_enter();
else person_leave();
}
prev_weight = current;
}
4.2.2 防抖动处理
c复制#define DEBOUNCE_TIME 3000 // ms
void person_enter() {
static uint32_t last_time = 0;
if(HAL_GetTick() - last_time > DEBOUNCE_TIME) {
set_led(GREEN);
start_fan();
last_time = HAL_GetTick();
}
}
4.3 状态机设计
使用枚举定义系统状态:
c复制typedef enum {
IDLE,
OCCUPIED,
FLUSHING,
ALERT
} ToiletState;
状态转换条件:
- IDLE → OCCUPIED:检测到重量增加
- OCCUPIED → FLUSHING:检测到重量减少
- FLUSHING → IDLE:冲水完成
- 任何状态 → ALERT:水位过低
5. 系统调试与优化
5.1 称重传感器校准
标准流程:
- 空载时调用hx711_tare()
- 放置500g标准砝码
- 读取原始值计算比例系数:
c复制float scale = 500.0 / (raw_value - tare_value);
常见问题处理:
- 数值漂移:预热30分钟后再校准
- 数据跳动:检查电源稳定性
- 线性度差:重新安装传感器支架
5.2 水位检测调试技巧
- 空水箱时记录ADC值(如2500)
- 满水箱时记录ADC值(如1200)
- 设置报警阈值:
c复制#define LOW_LEVEL (1200 + (2500-1200)*0.1)
实测发现:水质变化会影响读数,建议每周自动校准一次
5.3 功耗优化措施
- 风扇采用间歇运行模式(开5分钟/关2分钟)
- STM32进入Stop模式,通过EXTI唤醒
- 关闭未用外设时钟:
c复制
__HAL_RCC_ADC1_CLK_DISABLE();
优化后效果:
- 待机电流:15mA → 3.8mA
- 运行电流:220mA → 180mA
6. 项目扩展建议
6.1 功能扩展方向
- 添加氨气传感器监测空气质量
- 集成RFID实现扫码取纸
- 增加4G模块上传使用数据
6.2 生产优化建议
- PCB设计整合所有模块
- 改用工业级STM32F103RCT6
- 外壳采用IP65防水设计
6.3 成本控制方案
- HX711模块可替换为FSR402压力传感器
- STM32改用GD32同型号芯片
- 水位检测改用光电开关(需定期清洁)
经过实际部署测试,这套系统在校园公厕连续运行6个月,故障率低于2%。最关键的经验是:传感器安装位置必须避开直接水淋,所有接线端要做防水处理。对于想复现这个项目的同学,建议先用洞洞板搭建原型,确认功能后再设计定制PCB。