Esp32 s3 AI 做的智能垃圾分类系统
本帖最后由 创客编程张 于 2025-5-4 19:35 编辑在城市化进程加速的今天,全球每年产生超过20亿吨生活垃圾,而错误分类导致的资源浪费和环境污染正成为严峻挑战。如何让垃圾桶"学会思考",让科技为环保赋能?这就是我们探索的答案。
接下来,就让我们一起完成这个独一无二的项目吧!
一、准备1.下载Arduino IED,按照教程下载最新版软件下载链接:Arduino IED 官网2.初始准备软件,教程请看此帖子的详细教程Esp32 S3 AI智能摄像头做的简易安保系统 DF创客社区
二、编写程序1.初始硬件配置// RGB LED引脚配置
typedef enum {
LED_R = 12,
LED_G = 13,
LED_B = 14
} led_pins_t;
// PWM配置
#define LEDC_CHANNEL_R LEDC_CHANNEL_0
#define LEDC_CHANNEL_G LEDC_CHANNEL_1
#define LEDC_CHANNEL_B LEDC_CHANNEL_2
#define LEDC_RESOLUTIONLEDC_TIMER_8_BIT</font> 定义RGB LED的GPIO引脚(12/13/14)
配置PWM通道参数(8位分辨率)
2.PWM初始化void ledc_init() {
ledc_timer_config_t timer_conf = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_RESOLUTION,
.timer_num = LEDC_TIMER_0,
.freq_hz = 5000,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&timer_conf);
ledc_channel_config_t channel_conf = {
.gpio_num = LED_R,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_R,
.timer_sel = LEDC_TIMER_0,
.duty = 0,
.hpoint = 0
};
ledc_channel_config(&channel_conf);
// 类似配置G/B通道...
}</font> 初始化PWM定时器
配置各颜色通道参数作用:1.5kHz频率可避免LED闪烁2. 需要为每个颜色通道重复配置(示例中只展示了红色通道)
3.灯光反馈系统void set_led_feedback(garbage_type_t type) {
switch(type) {
case RECYCLABLE:// 蓝灯
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_B, 255);
break;
case HAZARDOUS: // 红灯
ledc_set_duty(...);
break;
// 其他case...
}
ledc_update_duty(...);
}</font>根据垃圾类型显示不同颜色
使用PWM混合颜色
4.图像处理static void preprocess_image(camera_fb_t *fb) {
// 实现步骤:
// 1. YUV422转RGB(摄像头原始格式转换)
// 2. 缩放到模型输入尺寸
// 3. 归一化到[-1,1]或范围
}</font>
5.AI推理(这里需要自己添加训练好的模型,由于我不会训练AI所以我花钱找人训练了一个,这里就不分享了哈,还请见谅)static classification_result_t tflite_inference(const uint8_t *processed_img) {
// 伪代码流程:
// 1. 从文件系统加载model.tflite
// 2. 创建解释器:tflite::MicroInterpreter
// 3. 分配输入/输出张量
// 4. 执行推理
// 5. 解析概率分布
return classification_result_t{...};
}
</font>要求:1.模型需量化为INT8格式(减小尺寸)
2.输入数据对齐模型要求(尺寸/格式)
3.使用TFLite Micro库进行部署
6.主任务逻辑程序void classification_task(void *arg) {
while(1) {
// 获取摄像头帧
camera_fb_t *fb = esp_camera_fb_get();
// 预处理→推理→反馈
preprocess_image(fb);
classification_result_t result = tflite_inference(fb->buf);
set_led_feedback(result.type);
// 释放资源
esp_camera_fb_return(fb);
vTaskDelay(500);
}
}</font>
7.完整代码#include "esp_camera.h"
#include "esp_timer.h"
#include "driver/ledc.h"
#define TAG "SMART_BIN"
// RGB LED引脚配置
typedef enum {
LED_R = 12,
LED_G = 13,
LED_B = 14
} led_pins_t;
// PWM配置
#define LEDC_CHANNEL_R LEDC_CHANNEL_0
#define LEDC_CHANNEL_G LEDC_CHANNEL_1
#define LEDC_CHANNEL_B LEDC_CHANNEL_2
#define LEDC_RESOLUTIONLEDC_TIMER_8_BIT
// 初始化PWM
void ledc_init() {
ledc_timer_config_t timer_conf = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_RESOLUTION,
.timer_num = LEDC_TIMER_0,
.freq_hz = 5000,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&timer_conf);
ledc_channel_config_t channel_conf = {
.gpio_num = LED_R,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_R,
.timer_sel = LEDC_TIMER_0,
.duty = 0,
.hpoint = 0
};
ledc_channel_config(&channel_conf);
// 类似配置G/B通道...
}
// 智能灯光反馈
void set_led_feedback(garbage_type_t type) {
switch(type) {
case RECYCLABLE:
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_B, 255);
break;
case HAZARDOUS:
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R, 255);
break;
case KITCHEN:
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_G, 255);
break;
case OTHER:
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R, 150);
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_G, 255);
break;
}
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_R);
// 更新其他通道...
}
// 图像预处理
static void preprocess_image(camera_fb_t *fb) {
// 添加实际预处理逻辑:
// 1. 色彩空间转换 (YUV422->RGB)
// 2. 图像缩放 (根据模型输入尺寸)
// 3. 直方图均衡化
// 4. 归一化处理
}
// 基于TensorFlow Lite的推理函数
static classification_result_t tflite_inference(const uint8_t *processed_img) {
// 伪代码示例:
// 1. 加载TFLite模型
// 2. 分配张量
// 3. 执行推理
// 4. 解析输出
return (classification_result_t){
.type = RECYCLABLE,
.confidence = 0.92f
};
}
void classification_task(void *arg) {
while(1) {
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
ESP_LOGW(TAG, "Frame buffer acquisition failed");
continue;
}
// 图像预处理流水线
preprocess_image(fb);
// 执行模型推理
classification_result_t result = tflite_inference(fb->buf);
// 显示结果
ESP_LOGI(TAG, "Detected: %s (Confidence: %.2f%%)",
garbage_type_to_str(result.type),
result.confidence*100);
// 灯光反馈
set_led_feedback(result.type);
// 释放资源
esp_camera_fb_return(fb);
// 非阻塞延迟
vTaskDelay(pdMS_TO_TICKS(500));
}
}</font>
三、最后我们可以在程序中加入自己训练的智能体(我不会训练AI所以我花钱找人训练了一个,这里就不分享了哈,还请见谅)。由于我也是初学者,程序中可能会有少许问题,大家可以检查修改。
最后连接esp32 s3 ai模块,上传程序。
四、附件激光切割可以根据此作品底部的模板,稍加修改尺寸模型(比如可以增加卡扣等用于卡在垃圾桶上)Esp32 S3 AI智能摄像头做的简易安保系统 DF创客社区
就此,完!欢迎交流学习。
页:
[1]