1. 项目概述
这个基于STM32的智能洗衣机控制系统是我去年完成的一个嵌入式开发项目,初衷是想用单片机技术模拟真实洗衣机的完整工作流程。项目从硬件选型到程序设计全部自主完成,实现了包括自动洗衣、手动控制、远程监控等核心功能。相比市面上常见的教学演示项目,这个系统更贴近实际家电产品的功能设计,适合有一定STM32基础的开发者进阶学习。
系统采用模块化设计思路,硬件上使用STM32F103C8T6作为主控,搭配水位传感器、直流电机、水泵等执行机构,软件层面实现了状态机控制逻辑。特别值得一提的是,通过机智云平台接入了物联网功能,可以用手机APP远程查看洗衣机状态和控制洗衣流程。整个开发过程中,我在电机驱动、水位检测、多任务调度等方面积累了不少实战经验,后续会详细分享这些关键技术的实现细节。
2. 硬件设计与核心器件选型
2.1 主控芯片选择
选用STM32F103C8T6作为主控主要基于三点考虑:
- 性价比:这款Cortex-M3内核的芯片价格约10元,却有72MHz主频和丰富的外设资源
- 开发便利:有完善的HAL库和标准外设库支持,调试工具链成熟
- 扩展性:具备USART、I2C、SPI、ADC等常用接口,方便连接各类传感器
实际使用中发现其64KB Flash和20KB RAM资源对这个项目绰绰有余。建议购买正版ST-Link调试器,盗版工具经常会出现连接不稳定的问题。
2.2 关键传感器与执行机构
水位检测模块:
- 选用FS-IR02光电式水位传感器(约15元)
- 工作原理:利用红外光在不同水位下的反射强度差异
- 安装要点:必须垂直固定在洗衣机内桶侧壁,距底部2-3cm处
- 调试技巧:通过实验测得水位阈值(我的设置:高水位=3.0V,低水位=1.2V)
电机驱动方案:
- TB6612FNG双路直流电机驱动模块(比L298N效率更高)
- 驱动12V/5W直流减速电机(减速比1:48)
- PWM频率设置为10kHz(实测这个频率电机运行最平稳)
- 重要参数:正转占空比60%,反转55%,脱水时提高到80%
水泵控制:
- 采用5V微型隔膜水泵(流量1L/min)
- 通过继电器控制(注意要加续流二极管保护)
- 实测进满一桶水(约10L)需要8-10分钟
2.3 人机交互设计
OLED显示:
- 0.96寸I2C接口OLED(SSD1306驱动)
- 显示内容分层设计:
- 第一屏:时间+当前模式
- 第二屏:水位+洗衣进度
- 第三屏:WIFI连接状态
- 刷新策略:关键数据每秒更新,避免频繁刷新导致闪烁
按键布局:
- 3个轻触按键实现所有功能:
- KEY1:模式切换/确认
- KEY2:启动/暂停
- KEY3:选项切换
- 采用状态机处理按键动作,支持短按和长按不同功能
3. 电路设计与PCB制作
3.1 电源方案设计
系统需要多种电压:
- 12V:电机、水泵
- 5V:STM32、传感器
- 3.3V:OLED、WIFI模块
采用分级降压方案:
- 12V输入(适配器或电池)
- LM2596降压到5V(最大电流3A)
- AMS1117-3.3稳压芯片
重要提示:电机和大功率器件必须与MCU分开供电,否则电机启动时电压跌落会导致单片机复位。我在初期调试时就遇到过这个问题,后来改用独立电源后解决。
3.2 PCB布局要点
使用立创EDA设计双层PCB,关键经验:
- 电机驱动部分远离模拟信号走线
- 水泵继电器附近放置100uF电解电容储能
- 所有数字地最终单点连接到电源地
- 晶振走线尽量短,周围铺地保护
打样建议:
- 板厚1.6mm
- 铜厚1oz
- 绿色阻焊(最便宜)
- 做板时记得添加定位孔
4. 软件架构与核心逻辑实现
4.1 主程序流程图
c复制初始化硬件 → 读取存储参数 → 进入主循环
↓
[传感器数据采集] → [状态机处理] → [执行机构控制]
↓
[按键扫描] → [显示更新] → [网络通信]
4.2 洗衣流程状态机
定义枚举类型表示洗衣阶段:
c复制typedef enum {
STEP_IDLE, // 待机
STEP_WATER_IN, // 进水
STEP_WASH, // 洗涤
STEP_RINSE, // 漂洗
STEP_DRAIN, // 排水
STEP_SPIN, // 脱水
STEP_DRY // 烘干
} WashStep;
状态转移逻辑:
- 进水:开启进水泵,检测水位达到设定值
- 洗涤:电机正反转交替,计时器控制次数
- 漂洗:排水→进水→搅拌循环
- 排水:开启排水泵,检测低水位
- 脱水:电机高速单向旋转
- 烘干:开启加热片和风扇
4.3 多任务调度方案
由于没有使用RTOS,采用时间片轮询方式:
c复制void TIM2_IRQHandler() { // 1ms定时中断
static uint16_t cnt_10ms = 0, cnt_100ms = 0;
if(++cnt_10ms >= 10) {
cnt_10ms = 0;
Key_Scan(); // 10ms扫描一次按键
}
if(++cnt_100ms >= 100) {
cnt_100ms = 0;
Sensor_Update(); // 100ms更新传感器
}
}
5. 物联网功能实现
5.1 机智云接入流程
-
在机智云平台创建产品,定义数据点:
- 只读数据:水位、当前状态
- 可写数据:启动/暂停、模式选择
-
生成MCU代码框架,移植到工程中
-
ESP8266-01S配置:
- 固件版本:安信可AT固件V1.6
- 连接模式:STA+SoftAP
- 关键AT指令:
bash复制AT+CWMODE=3 AT+CWJAP="SSID","password" AT+CIOBAUD=9600
5.2 数据通信协议
定义上下行数据结构:
c复制#pragma pack(1)
typedef struct {
uint8_t start_flag; // 0xFF
uint8_t cmd; // 0x01控制 0x02状态
uint8_t mode; // 自动/手动
uint8_t run_state; // 运行状态
uint16_t water_level;// 水位ADC值
uint8_t checksum; // 校验和
} WIFI_DataFrame;
#pragma pack()
实际测试发现,在电机运行时WIFI容易断连,解决方法是在ESP8266电源处增加1000uF电容,并将发送间隔调整为2秒一次。
6. 调试经验与问题解决
6.1 常见故障排查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机不转 | TB6612使能信号未拉高 | 检查STBY引脚电平 |
| 水位检测不准 | 传感器安装倾斜 | 重新垂直固定 |
| OLED花屏 | I2C上拉电阻缺失 | 添加4.7K上拉 |
| WIFI频繁掉线 | 电源干扰 | 增加稳压电容 |
| 程序跑飞 | 堆栈溢出 | 修改启动文件Stack_Size |
6.2 关键参数调试心得
电机控制:
- 启动时需要软启动:前100ms逐步提高PWM占空比
- 正反转切换加入50ms死区时间
- 脱水阶段转速要缓慢提升,避免负载突变
水位检测:
- 采用滑动平均滤波(窗口大小=10)
- 动态校准机制:每次洗衣前读取空桶ADC值作为基准
- 设置滞回区间防止临界抖动(高水位±5%)
功耗优化:
- 空闲时关闭不必要的外设时钟
- 显示背光30秒无操作自动调暗
- 网络通信采用间歇唤醒模式
7. 项目扩展建议
-
增加安全保护:
- 门开关检测
- 电机过流保护
- 漏水检测传感器
-
节能优化:
- 根据衣物重量自动调节水量
- 利用电机发电为电池充电
- 太阳能供电方案
-
智能功能:
- 语音控制接入
- 洗衣液自动投放
- 故障自诊断系统
这个项目最让我有成就感的是完整实现了从硬件到软件的全流程开发,特别是状态机设计那部分,花了整整两周时间调试各种边界条件。建议有兴趣的开发者可以先从简化版做起,比如先实现基本的手动控制,再逐步添加自动模式和物联网功能。所有工程文件都已开源,获取方式见项目仓库。
