若该文为原创文章,转载请注明原文出处。
一、项目概述
1.1 项目背景
随着国家对生活垃圾强制分类政策的推进,传统的人工分拣方式效率低、成本高,已难以满足需求。与此同时,物联网与边缘AI技术的成熟为垃圾分类的智能化提供了技术基础。
1.2 项目简介
本系统以 STM32F103C8T6 为主控核心,K210 负责基于YOLOv2的垃圾图像识别与分类,通过 ESP-01S (ESP8266) 模块经MQTT协议将数据上报至 中国移动OneNet云平台。系统实现了从"图像识别 → 本地自动分类 → 云端数据监管"的完整闭环。
1.3 核心功能
| 功能模块 | 具体描述 |
|---|---|
| 视觉识别 | K210运行YOLOv2模型,识别厨余、可回收、其他、有害四类垃圾 |
| 自动分类 | STM32根据识别结果,控制舵机打开对应垃圾桶盖 |
| 本地交互 | OLED显示识别结果、语音播报分类提示、按键手动控制 |
| 数据上云 | 通过ESP-01S将分类结果、时间等数据上报至OneNet |
| 远程监控 | OneNet平台实时展示分类统计,手机APP/网页可查询历史记录 |
| 远程控制 | 云端可下发指令(如复位、手动开盖等) |
1.4 性能指标
-
识别准确率:≥92%(四分类)
-
识别速度:≤200ms(K210端)
-
通信协议:MQTT v3.1.1
-
数据上报频率:事件触发(分类时)+ 定时心跳(每30秒)
二、系统总体设计
2.1 系统架构
text
+------------------+ UART +------------------+ GPIO/PWM/I2C +---------------------------+
| K210视觉模块 | -----------> | STM32主控 | -------------------> | 本地执行与交互 |
| (垃圾分类YOLO) | 识别结果 | (逻辑决策中心) | | - 舵机 (PWM) |
| 模型:四分类 | 4类编码 | | | - OLED (I2C) |
+------------------+ +------------------+ | - 语音播报 (UART/GPIO) |
| | | - 按键 (GPIO) |
| | UART | - 蜂鸣器/LED (GPIO) |
| v +---------------------------+
| +------------------+
| | ESP-01S |
| | (WiFi模块) |
| +------------------+
| |
| MQTT/JSON
v v
+----------------------+
| OneNet云平台 |
| - 数据存储与展示 |
| - 历史记录查询 |
| - 远程指令下发 |
+----------------------+
|
v
+----------------------+
| 手机APP / 网页 |
| (实时监控/历史查询) |
+----------------------+
2.2 数据流说明
-
识别流:K210摄像头采集图像 → YOLOv2推理 → 识别结果(类别ID+置信度)通过UART发送给STM32
-
控制流:STM32解析识别结果 → 驱动对应舵机打开桶盖 → OLED显示 + 语音播报
-
上报流:STM32通过UART向ESP-01S发送AT指令 → ESP-01S连接WiFi → MQTT上报至OneNet
-
下行流:OneNet下发指令 → ESP-01S接收 → STM32解析执行
三、硬件设计
3.1 硬件清单
| 模块 | 型号 | 数量 | 接口 | 作用 |
|---|---|---|---|---|
| 主控MCU | STM32F103C8T6 | 1 | - | 系统逻辑核心 |
| AI视觉 | 正点原子K210 + OV2640 | 1 | UART | 垃圾分类识别 |
| WiFi模块 | ESP-01S (ESP8266) | 1 | UART | 连接OneNet |
| 舵机 | SG90 / MG995 | 4 | PWM | 控制4个垃圾桶盖 |
| OLED显示屏 | 0.96寸 SSD1306 | 1 | I2C | 显示识别结果、系统状态 |
| 语音播报 | JQ8900 MP3模块 | 1 | UART/GPIO | 播放分类提示语音 |
| 按键 | 轻触开关 | 2 | GPIO | 手动控制、系统复位 |
| 蜂鸣器 | 5V有源 | 1 | GPIO | 操作提示音 |
| LED指示灯 | 红/绿/蓝 | 3 | GPIO | 状态指示 |
| 电源 | 5V/2A适配器 | 1 | DC口 | 系统供电 |
说明 :STM32与ESP-01S的UART通信波特率固定为 115200 ,数据位8位,停止位1位,无校验。ESP-01S的VCC必须稳定供给 3.3V±5%,建议使用独立LDO供电。
3.2 引脚连接表(STM32端)
| STM32引脚 | 外设 | 说明 |
|---|---|---|
| PA9 (USART1_TX) | K210 (RX) | 发送查询指令 |
| PA10 (USART1_RX) | K210 (TX) | 接收识别结果 |
| PA2 (USART2_TX) | ESP-01S (RX) | 发送AT指令/MQTT数据 |
| PA3 (USART2_RX) | ESP-01S (TX) | 接收WiFi/MQTT数据 |
| PA0 | JQ8900 (RX) | 语音播报控制(或使用IO触发) |
| PB0 | 蜂鸣器 | 高电平驱动 |
| PB1-PB3 | LED(红/绿/蓝) | 状态指示灯 |
| PB4-PB7 | 舵机信号线 | PWM控制4个舵机 |
| PB8 | OLED SCL | I2C时钟 |
| PB9 | OLED SDA | I2C数据 |
| PB10 | KEY1(手动开盖) | 输入,下拉 |
| PB11 | KEY2(系统复位) | 输入,下拉 |
四、软件设计
4.1 K210端程序(垃圾分类识别)
基于你已有程序,核心修改为通过UART发送结构化识别结果:
python
# K210端 - 垃圾分类识别与串口发送
import sensor, image, time
from maix import KPU
from machine import UART
labels = ['chuyu', 'recycal', 'other', 'humful'] # 四分类
# ... 模型加载与YOLO初始化代码(参考你已有程序)...
# 类别编码映射(供STM32解析)
CLASS_CODE = {'chuyu': 0, 'recycal': 1, 'other': 2, 'humful': 3}
uart = UART(UART.UART1, 115200, 8, 0, 0, timeout=1000)
while True:
img = sensor.snapshot()
objects = kpu.run_yolo2(task, img)
if objects:
for obj in objects:
idx = obj.classid()
label = labels[idx]
conf = obj.value()
# 发送格式: CLASS:类别编码:置信度:类别名称
# 示例: CLASS:1:0.92:recycal
msg = "CLASS:{}:{:.2f}:{}\n".format(CLASS_CODE[label], conf, label)
uart.write(msg.encode())
# 同时LCD显示...
4.2 STM32端程序(主控逻辑)
主程序流程图:
text
系统初始化(时钟、GPIO、UART、PWM、I2C)
OLED显示“系统启动”
舵机初始化(全部关闭)
ESP-01S初始化(AT测试 → 连接WiFi → 连接OneNet MQTT)
进入主循环:
1. 检测UART1是否有K210数据
- 有 → 解析识别结果(CLASS:编码:置信度:名称)
- 更新当前分类结果
2. 如果识别到垃圾且置信度 > 阈值:
- OLED显示识别结果
- 语音播报对应分类提示
- 控制对应舵机打开桶盖(持续3秒后自动关闭)
- 蜂鸣器短鸣提示
- 通过ESP-01S上报分类事件到OneNet
3. 检测按键:
- KEY1短按 → 手动触发对应桶盖打开(测试用)
- KEY2短按 → 系统复位
4. 定时任务(每30秒):
- 上报心跳数据(系统状态、累计分类统计)
5. 处理ESP-01S串口接收的云端指令
6. 刷新OLED显示
7. 延时50ms,循环
串口通信协议:
| 方向 | 格式 | 示例 | 说明 |
|---|---|---|---|
| K210 → STM32 | CLASS:编码:置信度:名称\n |
CLASS:1:0.92:recycal\n |
识别结果 |
| STM32 → ESP-01S | AT指令集 | AT+CWJAP="SSID","PWD"\r\n |
WiFi连接 |
| STM32 → OneNet | JSON (MQTT) | {"class_id":1,"class_name":"recycal","confidence":0.92} |
数据上报 |
| OneNet → STM32 | JSON (MQTT) | {"cmd":"reset"} |
远程指令 |
4.3 ESP-01S AT指令流程
ESP-01S需烧录支持MQTT的AT固件,STM32通过UART2发送以下指令序列:
c
// 1. 复位模块
AT+RST\r\n
// 2. 设置STA模式
AT+CWMODE=1\r\n
// 3. 连接WiFi
AT+CWJAP="SSID","PASSWORD"\r\n
// 4. 配置MQTT用户(产品ID、设备ID、APIKey/Token)[reference:27][reference:28]
AT+MQTTUSERCFG=0,1,"设备名称","产品ID","鉴权信息",0,0,""\r\n
// 5. 连接OneNet MQTT服务器[reference:29]
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1\r\n
// 6. 订阅下行指令Topic
AT+MQTTSUB=0,"$sys/产品ID/设备ID/thing/service/property/set",1\r\n
// 7. 发布数据(上报分类结果)[reference:30]
AT+MQTTPUB=0,"$sys/产品ID/设备ID/thing/event/property/post","{\"class_id\":1}",1,0\r\n
4.4 OneNet数据格式
上报数据采用 OneJSON格式:
json
{
"id": "123",
"version": "1.0",
"params": {
"class_id": {
"value": 1
},
"class_name": {
"value": "recycal"
},
"confidence": {
"value": 0.92
},
"timestamp": {
"value": 1691234567
}
}
}
五、OneNet平台配置
5.1 平台侧配置步骤
-
注册登录 :访问OneNet官网(https://open.iot.10086.cn)注册账号
-
创建产品:选择"MQTT"协议,数据格式选"OneJSON"
-
添加设备 :在产品下注册设备,获取 产品ID、设备ID、鉴权信息
-
定义数据流 :创建
class_id、class_name、confidence等数据流 -
配置触发器:设置告警规则(如识别到"有害垃圾"时推送通知)
5.2 历史记录查询
OneNet平台自动保存设备上报的历史数据。用户可通过以下方式查询:
-
OneNet控制台:在"设备管理 → 数据流"中按时间范围查询历史数据
-
手机APP:使用OneNet官方APP绑定设备,查看历史记录
-
API查询:调用OneNet RESTful API获取历史数据
六、功能演示与效果
6.1 本地端效果
| 场景 | 系统响应 |
|---|---|
| 用户投放垃圾 | K210识别→STM32解析→对应桶盖自动打开 |
| 识别成功 | OLED显示"可回收物 92%",语音播报"请投放至可回收桶" |
| 识别失败 | OLED显示"无法识别,请重新投放" |
| 桶满检测 | LED闪烁报警(需扩展超声波模块) |
6.2 云端端效果
| 功能 | 实现方式 |
|---|---|
| 实时数据 | OneNet控制台展示最新分类结果 |
| 历史曲线 | 各类垃圾分类数量随时间变化图表 |
| 统计报表 | 日/周/月分类统计(通过API二次开发) |
| 远程控制 | 云端下发指令远程开盖/复位 |
七、创新点与技术特色
-
边缘AI + 物联网融合:K210在本地完成推理,仅上传结构化数据,降低带宽和云端算力需求
-
四分类全覆盖:支持厨余、可回收、其他、有害四类生活垃圾
-
本地-云端双轨记录:本地OLED即时反馈 + 云端持久化存储与追溯
-
低成本、易部署:所有模块均为市面常见型号,总成本可控在500元以内
-
双向通信:不仅上报数据,还支持云端远程控制
八、项目实施计划
| 阶段 | 任务 | 时间 |
|---|---|---|
| 硬件搭建 | 连接各模块,检查供电 | 1天 |
| K210模型部署 | 烧录垃圾分类模型,调试串口输出 | 1天 |
| STM32外设驱动 | OLED、舵机、语音、按键调试 | 2天 |
| ESP-01S通信 | AT指令调试,WiFi连接测试 | 1天 |
| OneNet接入 | 平台配置,MQTT数据上报测试 | 1天 |
| 系统联调 | 全流程联合调试 | 2天 |
| 优化与文档 | 阈值调整,代码整理,文档撰写 | 1天 |
总开发周期约9天
九、常见问题与解决方案
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| K210不发送数据 | 波特率不匹配或接线错误 | 检查波特率(115200)和TX/RX交叉连接 |
| ESP-01S连接WiFi失败 | SSID/密码错误或信号弱 | 检查AT指令,靠近路由器测试 |
| OneNet连接超时 | MQTT参数错误 | 确认产品ID、设备ID、鉴权信息正确 |
| 舵机不动作 | PWM信号或供电不足 | 检查舵机供电(需5V/2A以上) |
| ESP-01S供电不稳 | 电流尖峰导致复位 | 使用独立3.3V LDO供电 |
十、总结与展望
本项目成功实现了基于 K210 + STM32 + ESP-01S + OneNet 的智能垃圾分类与物联网监管系统,具备以下核心价值:
-
环保价值:提高垃圾分类准确率,促进资源回收利用
-
管理价值:云端数据可视化,为城市垃圾分类管理提供数据支撑
-
技术价值:验证了边缘AI与物联网融合的可行性与实用性
未来扩展方向:
-
增加 超声波传感器 实现桶满检测与预警
-
增加 人脸识别 实现投放人身份绑定与积分奖励
-
接入 4G模块 作为WiFi断线时的备用通信通道
-
开发 微信小程序 提供更便捷的移动端访问
十一、参考资料
-
OneNet开发者中心:OneNET - 中国移动物联网开放平台
-
STM32F103C8T6参考手册
-
K210 MaixPy文档
-
ESP8266 AT指令集
-
《基于K210和YOLOv2的智能垃圾分类平台》
如有侵权,或需要完整代码,请及时联系博主。