23浏览
查看: 23|回复: 0

[项目] Esp32 s3 AI 做的智能垃圾分类系统

[复制链接]
本帖最后由 创客编程张 于 2025-5-4 19:35 编辑
在城市化进程加速的今天,全球每年产生超过20亿吨生活垃圾,而错误分类导致的资源浪费和环境污染正成为严峻挑战。如何让垃圾桶"学会思考",让科技为环保赋能?这就是我们探索的答案。
Esp32 s3 AI 做的智能垃圾分类系统图1

接下来,就让我们一起完成这个独一无二的项目吧!


一、准备
1.下载Arduino IED,按照教程下载最新版软件
  下载链接:Arduino IED 官网
2.初始准备软件,教程请看此帖子的详细教程Esp32 S3 AI智能摄像头做的简易安保系统 DF创客社区

二、编写程序
1.初始硬件配置
  1. // RGB LED引脚配置
  2. typedef enum {
  3.     LED_R = 12,
  4.     LED_G = 13,
  5.     LED_B = 14
  6. } led_pins_t;
  7. // PWM配置
  8. #define LEDC_CHANNEL_R   LEDC_CHANNEL_0
  9. #define LEDC_CHANNEL_G   LEDC_CHANNEL_1
  10. #define LEDC_CHANNEL_B   LEDC_CHANNEL_2
  11. #define LEDC_RESOLUTION  LEDC_TIMER_8_BIT</font>
复制代码
   定义RGB LED的GPIO引脚(12/13/14)
   配置PWM通道参数(8位分辨率)

2.PWM初始化
  1. void ledc_init() {
  2.     ledc_timer_config_t timer_conf = {
  3.         .speed_mode = LEDC_LOW_SPEED_MODE,
  4.         .duty_resolution = LEDC_RESOLUTION,
  5.         .timer_num = LEDC_TIMER_0,
  6.         .freq_hz = 5000,
  7.         .clk_cfg = LEDC_AUTO_CLK
  8.     };
  9.     ledc_timer_config(&timer_conf);
  10.     ledc_channel_config_t channel_conf = {
  11.         .gpio_num = LED_R,
  12.         .speed_mode = LEDC_LOW_SPEED_MODE,
  13.         .channel = LEDC_CHANNEL_R,
  14.         .timer_sel = LEDC_TIMER_0,
  15.         .duty = 0,
  16.         .hpoint = 0
  17.     };
  18.     ledc_channel_config(&channel_conf);
  19.    
  20.     // 类似配置G/B通道...
  21. }</font>
复制代码
   初始化PWM定时器
   配置各颜色通道参数
作用:1.5kHz频率可避免LED闪烁
2. 需要为每个颜色通道重复配置(示例中只展示了红色通道)

3.灯光反馈系统
  1. void set_led_feedback(garbage_type_t type) {
  2.     switch(type) {
  3.         case RECYCLABLE:  // 蓝灯
  4.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_B, 255);
  5.             break;
  6.         case HAZARDOUS:   // 红灯
  7.             ledc_set_duty(...);
  8.             break;
  9.         // 其他case...
  10.     }
  11.     ledc_update_duty(...);
  12. }</font>
复制代码
根据垃圾类型显示不同颜色
使用PWM混合颜色

4.图像处理
  1. static void preprocess_image(camera_fb_t *fb) {
  2.     // 实现步骤:
  3.     // 1. YUV422转RGB(摄像头原始格式转换)
  4.     // 2. 缩放到模型输入尺寸
  5. // 3. 归一化到[-1,1]或[0,1]范围
  6. }</font>
复制代码

5.AI推理(这里需要自己添加训练好的模型,由于我不会训练AI所以我花钱找人训练了一个,这里就不分享了哈,还请见谅)
  1. static classification_result_t tflite_inference(const uint8_t *processed_img) {
  2.     // 伪代码流程:
  3.     // 1. 从文件系统加载model.tflite
  4.     // 2. 创建解释器:tflite::MicroInterpreter
  5.     // 3. 分配输入/输出张量
  6.     // 4. 执行推理
  7.     // 5. 解析概率分布
  8.     return classification_result_t{...};
  9. }
  10. </font>
复制代码
要求:1.模型需量化为INT8格式(减小尺寸)
2.输入数据对齐模型要求(尺寸/格式)
3.使用TFLite Micro库进行部署

6.主任务逻辑程序
  1. void classification_task(void *arg) {
  2.     while(1) {
  3.         // 获取摄像头帧
  4.         camera_fb_t *fb = esp_camera_fb_get();
  5.         
  6.         // 预处理→推理→反馈
  7.         preprocess_image(fb);
  8.         classification_result_t result = tflite_inference(fb->buf);
  9.         set_led_feedback(result.type);
  10.         
  11.         // 释放资源
  12.         esp_camera_fb_return(fb);
  13.         vTaskDelay(500);
  14.     }
  15. }</font>
复制代码

7.完整代码
  1. #include "esp_camera.h"
  2. #include "esp_timer.h"
  3. #include "driver/ledc.h"
  4. #define TAG "SMART_BIN"
  5. // RGB LED引脚配置
  6. typedef enum {
  7.     LED_R = 12,
  8.     LED_G = 13,
  9.     LED_B = 14
  10. } led_pins_t;
  11. // PWM配置
  12. #define LEDC_CHANNEL_R   LEDC_CHANNEL_0
  13. #define LEDC_CHANNEL_G   LEDC_CHANNEL_1
  14. #define LEDC_CHANNEL_B   LEDC_CHANNEL_2
  15. #define LEDC_RESOLUTION  LEDC_TIMER_8_BIT
  16. // 初始化PWM
  17. void ledc_init() {
  18.     ledc_timer_config_t timer_conf = {
  19.         .speed_mode = LEDC_LOW_SPEED_MODE,
  20.         .duty_resolution = LEDC_RESOLUTION,
  21.         .timer_num = LEDC_TIMER_0,
  22.         .freq_hz = 5000,
  23.         .clk_cfg = LEDC_AUTO_CLK
  24.     };
  25.     ledc_timer_config(&timer_conf);
  26.     ledc_channel_config_t channel_conf = {
  27.         .gpio_num = LED_R,
  28.         .speed_mode = LEDC_LOW_SPEED_MODE,
  29.         .channel = LEDC_CHANNEL_R,
  30.         .timer_sel = LEDC_TIMER_0,
  31.         .duty = 0,
  32.         .hpoint = 0
  33.     };
  34.     ledc_channel_config(&channel_conf);
  35.    
  36.     // 类似配置G/B通道...
  37. }
  38. // 智能灯光反馈
  39. void set_led_feedback(garbage_type_t type) {
  40.     switch(type) {
  41.         case RECYCLABLE:
  42.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_B, 255);
  43.             break;
  44.         case HAZARDOUS:
  45.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R, 255);
  46.             break;
  47.         case KITCHEN:
  48.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_G, 255);
  49.             break;
  50.         case OTHER:
  51.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R, 150);
  52.             ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_G, 255);
  53.             break;
  54.     }
  55.     ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R);
  56.     // 更新其他通道...
  57. }
  58. // 图像预处理
  59. static void preprocess_image(camera_fb_t *fb) {
  60.     // 添加实际预处理逻辑:
  61.     // 1. 色彩空间转换 (YUV422->RGB)
  62.     // 2. 图像缩放 (根据模型输入尺寸)
  63.     // 3. 直方图均衡化
  64.     // 4. 归一化处理
  65. }
  66. // 基于TensorFlow Lite的推理函数
  67. static classification_result_t tflite_inference(const uint8_t *processed_img) {
  68.     // 伪代码示例:
  69.     // 1. 加载TFLite模型
  70.     // 2. 分配张量
  71.     // 3. 执行推理
  72.     // 4. 解析输出
  73.     return (classification_result_t){
  74.         .type = RECYCLABLE,
  75.         .confidence = 0.92f
  76.     };
  77. }
  78. void classification_task(void *arg) {
  79.     while(1) {
  80.         camera_fb_t *fb = esp_camera_fb_get();
  81.         if (!fb) {
  82.             ESP_LOGW(TAG, "Frame buffer acquisition failed");
  83.             continue;
  84.         }
  85.         // 图像预处理流水线
  86.         preprocess_image(fb);
  87.         
  88.         // 执行模型推理
  89.         classification_result_t result = tflite_inference(fb->buf);
  90.         
  91.         // 显示结果
  92.         ESP_LOGI(TAG, "Detected: %s (Confidence: %.2f%%)",
  93.             garbage_type_to_str(result.type),
  94.             result.confidence*100);
  95.         // 灯光反馈
  96.         set_led_feedback(result.type);
  97.         
  98.         // 释放资源
  99.         esp_camera_fb_return(fb);
  100.         
  101.         // 非阻塞延迟
  102.         vTaskDelay(pdMS_TO_TICKS(500));
  103.     }
  104. }</font>
复制代码

三、最后我们可以在程序中加入自己训练的智能体(我不会训练AI所以我花钱找人训练了一个,这里就不分享了哈,还请见谅)。由于我也是初学者,程序中可能会有少许问题,大家可以检查修改。
Esp32 s3 AI 做的智能垃圾分类系统图2

最后连接esp32 s3 ai模块,上传程序。

四、附件
激光切割可以根据此作品底部的模板,稍加修改尺寸模型(比如可以增加卡扣等用于卡在垃圾桶上)Esp32 S3 AI智能摄像头做的简易安保系统 DF创客社区

就此,完!欢迎交流学习。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail