🧺 AI-Powered Laundry

智能洗衣顾问

拍照分析衣物面料与污渍,自动规划清水预洗 + 洗衣粉主洗两段式洗涤,让每件衣物都被温柔以待。

📷

拍一张衣物的照片

AI 会自动识别面料材质、污渍类型、色深,并制定专业的清洗方案

🧵 面料分析 🔍 污渍识别 ⏱ 智能定时
🔬

AI 分析结果

🧵
面料材质
-
🎨
颜色深度
-
💧
污渍类型
-
污渍严重度0
⚠️ 需要预处理
上传照片后,AI 自动分析面料、污渍与色深
生成包含预处理步骤的专业清洗方案
清水预洗 → 自动投放洗衣粉 → 主洗,全程自动

洗涤控制

未连接
00:00
准备就绪
💧 清水预洗 🧴 投放洗衣粉 🫧 主洗
待机中 · 继电器: 关 · 0 / 0 秒
📖

洗衣百科

🧵 面料护理指南

不同面料的洗涤方式大有讲究

  • 棉质:温水+标准洗涤,可机洗
  • 丝绸:冷水+轻柔模式,手洗为佳
  • 羊毛:冷水+专用洗涤剂,勿拧绞
  • 化纤:常温+标准模式,易干
  • 牛仔:翻面冷水洗,防褪色

💧 常见污渍处理

不同污渍需要对症下药

  • 油渍:洗洁精预处理 + 热水洗
  • 果汁:立即冷水冲洗 + 含酶洗衣粉
  • 血渍:冷水浸泡 + 双氧水预处理
  • 汗渍:小苏打糊状涂抹 + 温水洗
  • 咖啡渍:冷水+甘油预处理再洗

✨ 护衣小技巧

让衣物持久如新的秘诀

  • 深浅色衣物分开洗涤
  • 洗衣袋保护精细面料
  • 不要过量使用洗衣粉
  • 阳光直晒会褪色,阴干更护衣
  • 洗完及时取出,防褶皱
🔧

硬件系统架构

📷 浏览器拍照
AI 千问分析
🌐 Flask 后端
串口协议转发
│ Web Serial API / CH340 / 115200bps
STM32F103C8T6 主控
← 输入
串口命令
WASH / SERVO
→ 输出
继电器
洗衣机电源
舵机 PWM
洗衣粉投放
OLED
状态显示
│ JSON 状态反馈 (1Hz)
CH340 USB-TTL → 电脑 → 浏览器 Web Serial API

📸 硬件实物照片

📋 硬件模块详解

1. STM32F103C8T6 主控板

🧠 控制核心

ARM Cortex-M3 内核,72MHz 主频,64KB Flash / 20KB SRAM。负责接收串口命令、控制继电器通断、输出舵机 PWM 信号、驱动 OLED 显示状态。使用 Keil MDK 开发,ST-Link SWD 烧录。系统以 1Hz 频率通过串口上报 JSON 状态包。

2. CH340 USB 转串口模块

🔌 通信层

USB 转 TTL 串口芯片,连接 STM32 的 PA9(TX)/PA10(RX),115200 bps 速率。配合浏览器 Web Serial API,无需安装驱动即可在 Chrome 中直接读写串口数据。同时提供 5V 电源给继电器和舵机供电。

3. ST-LINK/V2 下载调试器

💻 编程工具

SWD 接口(SWCLK/SWDIO/GND/3.3V)连接 STM32,Keil MDK 一键编译+下载。支持断点调试、变量查看。4 根杜邦线即可完成烧录。固件源码位于 E:\keli5\for-laundry\3-1stm\user\main.c

4. 0.96寸 OLED 显示屏

📺 本地显示

SSD1306 驱动,128×64 分辨率,软件 I2C 接口(SCL/PB6,SDA/PB7)。实时显示洗涤阶段:清水预洗(Pre-Wash)投放洗衣粉(Adding Detergent)主洗(Main Wash)完成(Wash Done!),倒计时精确到秒。

5. 继电器模块 (1路 5V 高电平触发)

⚡ 电源控制

STM32 PA8 输出高电平 → 光耦隔离 → 继电器吸合 → 洗衣机电源导通。跳线帽设为 HIGH(高电平触发),DC+ 由 CH340 5V 供电(不可用 3.3V,否则光耦关不断)。继电器 COM/NO 端串联在 USB 电源通路中,控制洗衣机整机通断。

6. USB 电源通路 (公头 + 母座)

🔋 供电链路

充电头 → USB 公头(VBUS 红线/GND 黑线) → 继电器 COM→NO → USB 母座 → 洗衣机。USB 公头的 D+ 和 D- 必须短接,否则充电头不会输出大电流。GND 黑线直通,不经过继电器。

7. SG90 舵机 (洗衣粉盒)

🧴 洗衣粉投放

舵机安装在洗衣粉盒下方,STM32 PA0 输出 50Hz PWM 信号(TIM2_CH1)。0° 位置关闭,90° 位置旋转倒粉,800ms 后自动复位到 0°。洗涤流程中在清水预洗结束后自动触发投放。

8. 面包板 & 连接线

🔧 结构件

MB-102 面包板 + 跳线 + 杜邦线 + 飞线,用于搭建 STM32 与各模块的电路连接原型。热熔胶固定关键节点(USB 母座、继电器端子),防止振动松脱。无需焊接,方便迭代调试。

🔌 引脚接线表

STM32引脚连接外设类型说明
PA0舵机 Signal (橙线)TIM2_CH1 (PWM)50Hz PWM, 0.5-2.5ms 脉宽, 控制 0°-180°
PA8继电器 INGPIO (推挽输出)高电平触发, HIGH=吸合 ON, LOW=断开 OFF
PA9CH340 RXUSART1_TX串口发送 JSON 状态数据 (115200bps)
PA10CH340 TXUSART1_RX串口接收命令: WASH / SERVO / ON / OFF
PB6OLED SCLGPIO (软 I2C)软件模拟 I2C 时钟线
PB7OLED SDAGPIO (软 I2C)软件模拟 I2C 数据线
PA13ST-LINK SWDIOSWD程序下载/调试数据线
PA14ST-LINK SWCLKSWD程序下载/调试时钟线

⚙ 系统工作流程

📷 浏览器拍照 → AI 千问分析
AI 返回: 面料 · 污渍 · 色深 · 清水时间 · 主洗时间
用户点击 "开始洗涤"
浏览器通过 Web Serial 发送 WASH:300,900
💧 清水预洗
继电器 ON
倒计时 300s
🧴 投放洗衣粉
舵机 90°→0°
800ms 自动复位
🫧 洗衣粉主洗
继电器继续 ON
倒计时 900s
✅ 洗涤完成 · 继电器 OFF · JSON 通知浏览器
每 1 秒 STM32 发送 JSON 状态包 → 浏览器实时更新进度

🧠 软件系统设计

状态机设计

⏸ 待机 (PHASE_IDLE = 0)

  • 继电器 OFF, 舵机 0°
  • OLED 显示 "Wash Ready"
  • 等待串口命令
  • 每 1 秒发送状态 JSON

💧 清水预洗 (PHASE_WATER = 1)

  • 继电器 ON, 舵机 0°
  • OLED 显示 Pre-Wash + 倒计时
  • 到达 water_seconds 后自动切换
  • 串口实时上报 elapsed/total

🧴 投放洗衣粉 (PHASE_DISPENSE = 2)

  • 继电器保持 ON
  • 舵机 90° → 800ms → 0°
  • OLED 显示 "Adding Detergent"
  • 完成后自动进入主洗阶段

🫧 洗衣粉主洗 (PHASE_SOAP = 3)

  • 继电器保持 ON
  • OLED 显示 Main Wash + 倒计时
  • 到达 soap_seconds 后自动关机
  • JSON 状态含当前阶段编号

通信协议

📡 命令格式 (浏览器 → STM32)

WASH:300,900 — 两段式洗涤
ON:600 — 单段式(兼容旧版)
SERVO:90 — 舵机旋转
OFF — 紧急停止
所有命令以 \r\n 结尾

📊 状态格式 (STM32 → 浏览器)

{"relay":1,"elapsed":42,"total":300,"phase":1,"water":300,"soap":900,"servo":0}
1Hz 周期发送,浏览器解析后更新进度条

⏰ 时序控制 (DWT 毫秒定时器)

使用 ARM DWT Cycle Counter 提供毫秒级时间戳。主循环 20ms 间隔,串口输出和 OLED 刷新独立计时。洗涤倒计时精度 ±1 秒。

🔄 中断接收 (USART1 RXNE)

串口接收使用中断模式,不丢数据。收到 \r\n 换行符后置位 rx_done 标志,主循环轮询处理命令,响应延迟 <50ms。

💻 核心代码模块

舵机 PWM 初始化 (TIM2_CH1, PA0)

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();
}

Flask AI 分析代理

@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)})

🛡 数据质量保障

🖼 AI 图像分析验证

  • 照片 base64 编码完整性检查
  • 千问 API 返回 JSON 格式校验
  • markdown 代码块自动剥离 (```json)
  • JSON 解析失败 → 兜底默认值 (清水300s, 主洗600s)
  • API Key 缺失 → 前端友好提示

🔌 串口通信可靠性

  • Web Serial API 自动检测端口断开
  • 中断接收 + 环形缓冲区, 不丢帧
  • 命令定界符 \\r\\n 保证完整性
  • 每 1 秒心跳 JSON 包, 超时检测
  • 非法命令静默忽略, 不崩溃

⚡ 继电器安全保护

  • 光耦隔离: STM32 侧与 220V 侧物理隔离
  • 紧急停止: OFF 命令立即断开继电器
  • 自动关闭: 倒计时归零自动 OFF
  • 看门狗: STM32 硬件看门狗防死机

🧴 舵机投放可靠性

  • 投粉角度固定 90°, 避免过量
  • 800ms 延时确保物理转动到位
  • 自动复位 0°, 防止粉末持续泄漏
  • PWM 输出前校验角度范围 (0-180)

⚡ 技术亮点

🤖 AI 视觉分析

千问 VL-Plus 多模态大模型分析衣物照片,输出面料、污渍、色深等结构化 JSON,自动规划最优洗涤方案。

🔄 两段式智能洗涤

清水预洗除浮尘 + 舵机自动投粉 + 主洗去污,模拟人手洗衣流程。浏览器可断开,STM32 独立完成全部流程。

🌐 零安装 Web 控制

基于 Web Serial API,Chrome/Edge 打开网页即可连接 STM32,无需安装任何驱动或软件。

🧴 自动投放系统

SG90 舵机驱动洗衣粉盒,PWM 精确控制角度。洗涤流程中自动触发,无需人工干预。

🛡 API Key 后端代理

千问 API Key 仅存储在服务器端,浏览器通过 Flask 代理调用,密钥不泄露到前端。

📺 OLED 离线显示

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/