智能感应垃圾桶
# 智能垃圾桶项目说明文档(两套版本:VL6180X / VL53L0X + 单路光耦限位)
## 一、项目逻辑
1. **测距传感器(主触发)**:检测到人手靠近,触发开盖动作
2. **光耦 A(限位保护)**:桶盖打开到位后遮挡光耦,限制舵机,防止舵机持续转动堵转烧坏
3. 到达设定保持时间后,舵机自动关闭桶盖
>
> 无垃圾满检测光耦 B,只保留一路光耦用于开盖限位
## 二、硬件引脚定义(ESP32-S3)
表格
| 器件 | 引脚 |
| --- | --- |
| 舵机信号线 | GPIO4 |
| 光耦 A(限位)OUT | GPIO7 |
| I2C SDA | GPIO8 |
| I2C SCL | GPIO9 |
| 测距传感器 VCC | 3.3V(禁止接 5V) |
| 测距传感器 GND | GND |
| 舵机供电 | 5V(建议外接独立电源,务必共地) |
| 光耦供电 | 3.3V |
>
> 默认:光耦被遮挡时输出 LOW;如果你的光耦逻辑相反,代码里 LOW / HIGH 互换
## 三、需要安装的库
通用库:`ESP32Servo`
- VL6180X 版本:`SparkFun_VL6180X`(作者 SparkFun)
- VL53L0X 版本:`VL53L0X`(作者 Pololu)
Wire 库:ESP32 底层自带,不用额外安装
底层开发板包:`arduino-esp32 2.0.14`
开发板选择:`ESP32S3 Dev Module`
## 四、可用烧录工具(三选一)
1. Arduino IDE:直接粘贴代码、管理库、一键上传,新手推荐
2. VSCode + PlatformIO:适合长期 DIY,调试日志丰富
3. esptool:单独烧录固件 bin 文件,用于固件批量烧录
## 五、可调参数说明
- `angleOpen`:开盖目标角度(根据你的机械结构修改)
- `angleClose`:关盖目标角度
- `holdTime`:开盖后保持时长(单位 ms)
- `triggerDistance`:触发距离(mm)
- VL6180X 推荐:80mm
- VL53L0X 推荐:150mm
## 六、版本 1:VL6180X + 光耦 A 限位 完整代码(可复制)
#include <ESP32Servo.h>
#include <Wire.h>
#include <SparkFun_VL6180X.h>
Servo binServo;
VL6180X distanceSensor;
const int servoPin = 4;
const int optoA = 7; // 光耦A:开盖限位
const int angleOpen = 90;
const int angleClose = 0;
const unsigned long holdTime = 1800;
const int triggerDistance = 80;
bool lidOpen = false;
unsigned long lidOpenTime = 0;
void setup() {
Serial.begin(115200);
pinMode(optoA, INPUT);
binServo.attach(servoPin);
binServo.write(angleClose);
Wire.begin(8,9);
if (!distanceSensor.begin()) {
Serial.println("VL6180X 未找到!请检查接线");
} else {
Serial.println("VL6180X 就绪");
}
}
void loop() {
int dist = distanceSensor.readRange();
int valA = digitalRead(optoA);
// 测距检测到手,开盖
if (distanceSensor.isRangeValid() && dist < triggerDistance && !lidOpen) {
binServo.write(angleOpen);
lidOpen = true;
lidOpenTime = millis();
Serial.print("检测到手,距离:");
Serial.print(dist);
Serial.println(" mm,开盖");
}
// 光耦限位提示(开盖到位)
if(valA == LOW && lidOpen){
Serial.println("桶盖到达限位位置");
}
// 计时到,自动关盖
if (lidOpen && (millis() - lidOpenTime > holdTime)) {
binServo.write(angleClose);
lidOpen = false;
Serial.println("时间到,关盖");
}
delay(50);
}
## 七、版本 2:VL53L0X + 光耦 A 限位 完整代码
#include <ESP32Servo.h>
#include <Wire.h>
#include <VL53L0X.h>
Servo binServo;
VL53L0X distanceSensor;
const int servoPin = 4;
const int optoA = 7; // 光耦A:开盖限位
const int angleOpen = 90;
const int angleClose = 0;
const unsigned long holdTime = 1800;
const int triggerDistance = 150;
bool lidOpen = false;
unsigned long lidOpenTime = 0;
void setup() {
Serial.begin(115200);
pinMode(optoA, INPUT);
binServo.attach(servoPin);
binServo.write(angleClose);
Wire.begin(8,9);
if (!distanceSensor.init()) {
Serial.println("VL53L0X 未找到!请检查接线");
} else {
distanceSensor.setTimeout(500);
Serial.println("VL53L0X 就绪");
}
}
void loop() {
int dist = distanceSensor.readRangeSingleMillimeters();
int valA = digitalRead(optoA);
// 测距检测到手,开盖
if (!distanceSensor.timeoutOccurred() && dist < triggerDistance && !lidOpen) {
binServo.write(angleOpen);
lidOpen = true;
lidOpenTime = millis();
Serial.print("检测到手,距离:");
Serial.print(dist);
Serial.println(" mm,开盖");
}
// 光耦限位提示(开盖到位)
if(valA == LOW && lidOpen){
Serial.println("桶盖到达限位位置");
}
// 计时到,自动关盖
if (lidOpen && (millis() - lidOpenTime > holdTime)) {
binServo.write(angleClose);
lidOpen = false;
Serial.println("时间到,关盖");
}
delay(50);
}
## 八、注意事项
1. 舵机电流大,ESP32 开发板 5V 引脚供电容易抖动、带不动,优先外接 5V 电源并且共地
2. 测距传感器严禁接 5V,会直接烧毁
3. 先单独测试舵机、光耦、测距传感器,全部正常之后再组装机械结构
4. 机械安装时,调整光耦位置:桶盖完全打开时刚好遮挡光耦
九、效果







硬件清单
- VL6180X1
- ESP32-S3-DevKitC-1N16R81
- 造物小生 大容量厨房专用垃圾桶隔味方形带盖垃圾桶翻盖式免弯腰餐饮厨余桶1
- ATK-VL53L0X VL53L0X 激光测距模块 ToF测距(光学盖片)/VL53L0X V2激光测距传感器模块 测量距离2米1
- 杜邦线(杜邦线 40CM 公对公 2.54mm 1排40P)3
- 杜邦线(杜邦线 40CM 公对母 2.54mm 1排40P)3
- 剥线钳1
- 铁丝/钢丝1
- 304不锈钢外六角螺丝螺母(M3*8)10
- 电池充电防反接板 理想二极管 电池充电防止极性接反 4A 共地模块3
- MG996舵机1
- MG996舵机支架1
- dc直流电源5V3A(墙插款)|5.5×2.5mm接口|1.5米线1
- 304不锈钢钢丝线(0.8m)【软丝-可塑性】0.5毫米粗1
- 高透明塑料pc耐力板加工防火阻燃亚克力(150x150x3)1
- 工具手工钳子(尖头)1
- 尼龙扎带(自锁式)100
- 25T标准一字摇臂MG996R金属摇臂1
- 1路5v继电器模块带光耦隔离支持高低电平触发开发板(高低电平触发)(想要实现可以断电路就买、不用实现可以不买)1
- 400孔面包板8.5x5.5cm可组合拼接1
- DC-099 DC电源插座 5.5*2.5MM1





这个是制作方案!!!