拍照分析衣物面料与污渍,自动规划清水预洗 + 洗衣粉主洗两段式洗涤,让每件衣物都被温柔以待。
AI 会自动识别面料材质、污渍类型、色深,并制定专业的清洗方案
不同面料的洗涤方式大有讲究
不同污渍需要对症下药
让衣物持久如新的秘诀










ARM Cortex-M3 内核,72MHz 主频,64KB Flash / 20KB SRAM。负责接收串口命令、控制继电器通断、输出舵机 PWM 信号、驱动 OLED 显示状态。使用 Keil MDK 开发,ST-Link SWD 烧录。系统以 1Hz 频率通过串口上报 JSON 状态包。
USB 转 TTL 串口芯片,连接 STM32 的 PA9(TX)/PA10(RX),115200 bps 速率。配合浏览器 Web Serial API,无需安装驱动即可在 Chrome 中直接读写串口数据。同时提供 5V 电源给继电器和舵机供电。
SWD 接口(SWCLK/SWDIO/GND/3.3V)连接 STM32,Keil MDK 一键编译+下载。支持断点调试、变量查看。4 根杜邦线即可完成烧录。固件源码位于 E:\keli5\for-laundry\3-1stm\user\main.c。
SSD1306 驱动,128×64 分辨率,软件 I2C 接口(SCL/PB6,SDA/PB7)。实时显示洗涤阶段:清水预洗(Pre-Wash) → 投放洗衣粉(Adding Detergent) → 主洗(Main Wash) → 完成(Wash Done!),倒计时精确到秒。
STM32 PA8 输出高电平 → 光耦隔离 → 继电器吸合 → 洗衣机电源导通。跳线帽设为 HIGH(高电平触发),DC+ 由 CH340 5V 供电(不可用 3.3V,否则光耦关不断)。继电器 COM/NO 端串联在 USB 电源通路中,控制洗衣机整机通断。
充电头 → USB 公头(VBUS 红线/GND 黑线) → 继电器 COM→NO → USB 母座 → 洗衣机。USB 公头的 D+ 和 D- 必须短接,否则充电头不会输出大电流。GND 黑线直通,不经过继电器。
舵机安装在洗衣粉盒下方,STM32 PA0 输出 50Hz PWM 信号(TIM2_CH1)。0° 位置关闭,90° 位置旋转倒粉,800ms 后自动复位到 0°。洗涤流程中在清水预洗结束后自动触发投放。
MB-102 面包板 + 跳线 + 杜邦线 + 飞线,用于搭建 STM32 与各模块的电路连接原型。热熔胶固定关键节点(USB 母座、继电器端子),防止振动松脱。无需焊接,方便迭代调试。
| STM32引脚 | 连接外设 | 类型 | 说明 |
|---|---|---|---|
| PA0 | 舵机 Signal (橙线) | TIM2_CH1 (PWM) | 50Hz PWM, 0.5-2.5ms 脉宽, 控制 0°-180° |
| PA8 | 继电器 IN | GPIO (推挽输出) | 高电平触发, HIGH=吸合 ON, LOW=断开 OFF |
| PA9 | CH340 RX | USART1_TX | 串口发送 JSON 状态数据 (115200bps) |
| PA10 | CH340 TX | USART1_RX | 串口接收命令: WASH / SERVO / ON / OFF |
| PB6 | OLED SCL | GPIO (软 I2C) | 软件模拟 I2C 时钟线 |
| PB7 | OLED SDA | GPIO (软 I2C) | 软件模拟 I2C 数据线 |
| PA13 | ST-LINK SWDIO | SWD | 程序下载/调试数据线 |
| PA14 | ST-LINK SWCLK | SWD | 程序下载/调试时钟线 |
WASH:300,900WASH:300,900 — 两段式洗涤
ON:600 — 单段式(兼容旧版)
SERVO:90 — 舵机旋转
OFF — 紧急停止
所有命令以 \r\n 结尾
{"relay":1,"elapsed":42,"total":300,"phase":1,"water":300,"soap":900,"servo":0}
1Hz 周期发送,浏览器解析后更新进度条
使用 ARM DWT Cycle Counter 提供毫秒级时间戳。主循环 20ms 间隔,串口输出和 OLED 刷新独立计时。洗涤倒计时精度 ±1 秒。
串口接收使用中断模式,不丢数据。收到 \r\n 换行符后置位 rx_done 标志,主循环轮询处理命令,响应延迟 <50ms。
static void Servo_Init(void) {
// TIM2: 72MHz / 144 = 500kHz, ARR=9999 → 50Hz
TIM_TimeBaseInitTypeDef t;
t.TIM_Prescaler = 143; // 500kHz
t.TIM_Period = 9999; // 50Hz (20ms period)
// PA0 = TIM2_CH1, AF_PP
GPIO_InitTypeDef g;
g.GPIO_Pin = GPIO_Pin_0;
g.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &g);
// PWM1 mode: 0°=CCR250, 90°=CCR750, 180°=CCR1250
TIM_OCInitTypeDef oc;
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_Pulse = 0; // 初始无脉冲
TIM_OC1Init(TIM2, &oc);
TIM_Cmd(TIM2, ENABLE);
}
if (strncmp(rx_buf, "WASH:", 5) == 0) {
// 解析: "WASH:300,900" → water_sec=300, soap_sec=900
RELAY_ON();
g_phase = PHASE_WATER;
g_total = g_water_sec; // 先倒计时清水段
g_start = millis();
}
// 每秒检查: 清水结束 → 舵机投粉 → 主洗
if (g_phase == PHASE_WATER && g_elapsed >= g_water_sec) {
g_phase = PHASE_DISPENSE;
Servo_SetAngle(90); // 旋转倒粉
delay_ms(800);
Servo_SetAngle(0); // 复位
g_phase = PHASE_SOAP; // 进入主洗
g_total = g_soap_sec;
g_start = millis();
}
@app.route('/api/analyze', methods=['POST'])
def analyze():
photo_b64 = request.get_json().get('photo', '')
resp = requests.post(QWEN_API_URL, json={
"model": "qwen-vl-plus",
"messages": [{"role": "user", "content": [
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{photo_b64}"}},
{"type": "text", "text": PROMPT} // 面料+污渍+清水+主洗
]}]
}, headers={"Authorization": f"Bearer {QWEN_API_KEY}"})
return jsonify({"ok": True, "result": json.loads(content)})
千问 VL-Plus 多模态大模型分析衣物照片,输出面料、污渍、色深等结构化 JSON,自动规划最优洗涤方案。
清水预洗除浮尘 + 舵机自动投粉 + 主洗去污,模拟人手洗衣流程。浏览器可断开,STM32 独立完成全部流程。
基于 Web Serial API,Chrome/Edge 打开网页即可连接 STM32,无需安装任何驱动或软件。
SG90 舵机驱动洗衣粉盒,PWM 精确控制角度。洗涤流程中自动触发,无需人工干预。
千问 API Key 仅存储在服务器端,浏览器通过 Flask 代理调用,密钥不泄露到前端。
STM32 本地 OLED 实时显示洗涤阶段和倒计时,不连电脑也能查看进度。
| 🖥 服务器 | Ubuntu 22.04 · 124.221.224.40 |
| 🌐 访问地址 | https://cdqtech.online/laundry/ |
| 🐍 Python 环境 | Python 3.10 · Flask · requests · paramiko |
| 🔌 串口通信 | Web Serial API (Chrome/Edge) · CH340 · 115200bps 8N1 |
| 🤖 AI 模型 | Qwen-VL-Plus (DashScope API) · 图片+文本多模态 |
| 📡 部署方式 | nohup python3 server.py (端口 5008) · nginx 反向代理 · certbot HTTPS |
| 🔧 固件开发 | Keil MDK 5 · STM32 Standard Peripheral Library · ST-Link SWD |
| 📂 固件源码 | E:\keli5\for-laundry\3-1stm\user\main.c |
| 📂 后端源码 | /home/ubuntu/laundry/server.py |
| 📂 前端源码 | /home/ubuntu/laundry/templates/index.html |
| 📦 硬件图片 | /home/ubuntu/laundry/static/hardware/ |