💡 阅读提示:本文记录我用ESP8266+超声波+舵机把一个普通垃圾桶改造成“智能感应垃圾桶”的全过程。自动开盖、满溢提醒、远程查看状态——成本不到50块,再也不用弯腰掀盖子了。
🚨 开篇:那个让我忍了三年的“脏手”问题
你有没有过这样的经历?
厨房里切完生肉,满手油污,想去扔垃圾。垃圾桶的盖子需要用手掀开——你犹豫了一下,决定用胳膊肘顶开。盖子“啪”地一声弹开了,但你的胳膊肘也沾上了一层黏糊糊的油渍。
或者在客厅吃薯片,手上有碎屑和油,垃圾桶的盖子需要用手掀开。你不想弄脏盖子,又不想弄脏手,最后选择——把垃圾堆在桌角,等攒够了再一次性去扔。
垃圾桶盖,这个本该帮我们隔绝脏东西的设计,反而成了最“脏”的地方。
我忍了三年。每次扔垃圾都要经历一次“要不要用手碰盖子”的灵魂拷问。直到上个月,我实在受不了了,决定做一个自己会开盖的垃圾桶。
花了一个周末,我用ESP8266 + 超声波传感器 + 舵机,把家里的普通垃圾桶改造成了智能感应垃圾桶。手一伸过去,盖子自动打开;手离开后,几秒钟自动关上。从此再也不用纠结“碰不碰盖子”这个问题了。
更妙的是,它还多了几个“隐藏技能”:垃圾满了会自动提醒我、手机上能实时看到桶里装了多少、甚至还能通过微信远程查看状态。
硬件成本加起来不到50块。如果你手里有旧开发板,成本还能更低。
今天,我就把这套改造方案完整分享出来。无论你是租房党还是自家住,只要家里有垃圾桶,都能复刻。
一、需求分析:一个“聪明”的垃圾桶需要什么能力?
| 痛点 | 理想功能 | 物联网方案 |
|---|---|---|
| 扔垃圾要用手掀盖子,脏 | 伸手自动开盖,离开自动关 | 超声波传感器探测人体靠近 → 舵机驱动开盖 |
| 不知道垃圾满了没有 | 满溢时主动提醒 | 超声波测距检测桶内垃圾高度 → 超阈值微信推送 |
| 垃圾袋套不牢、容易滑落 | 辅助吸附或提醒 | 重量传感器检测袋内垃圾重量变化 |
| 厨余垃圾气味难闻 | 桶内状态远程查看 | 温湿度传感器监测桶内环境 |
| 倒垃圾总是忘 | 定时提醒 | 云端定时任务 → 微信推送 |
本方案实现的核心功能:
✅ 人体靠近时自动开盖(超声波传感器探测)
✅ 离开后延时自动关盖(3-5秒可调)
✅ 桶内垃圾满溢检测 + 微信推送提醒
✅ 手机远程查看桶内状态(满/未满)
✅ 全部硬件成本控制在50元以内
如果家里有多个垃圾桶需要改造,每个桶只需要增加传感器和舵机,主控可以复用,成本更低。
二、为什么要自己做,而不是买成品?
市面上确实有智能感应垃圾桶在卖,价格从几十到几百不等。但它们有几个共同的问题:
第一,封闭生态。成品感应垃圾桶的功能是固定的——开盖、关盖,仅此而已。你不能给它增加“满溢提醒”,不能让它“发微信通知你”,更不能把它接入你已有的智能家居系统。
第二,电池续航焦虑。很多成品用电池供电,几个月换一次电池,扔垃圾变成了一件需要担心“电池还有没有电”的事。
第三,价格不透明。一个带红外感应的垃圾桶,成本可能不到30块,卖你两三百。
自己做的好处是:功能完全自定义、想加什么传感器就加什么、坏了随时能修、成本透明到每一根杜邦线。
更重要的是,做完之后你会真正理解“智能”是怎么实现的——下次想做别的改造,心里就有底了。
三、硬件清单(总成本约48元)
| 组件 | 型号 | 单价 | 备注 |
|---|---|---|---|
| 主控 | ESP8266 NodeMCU | 15元 | 带Wi-Fi,兼容Arduino |
| 超声波传感器 | HC-SR04 | 5元 | 测距用,探测人手和垃圾高度 |
| 舵机 | SG90(9g) | 6元 | 驱动桶盖开合 |
| 蜂鸣器 | 5V有源 | 1元 | 满溢时声音提醒(可选) |
| 普通垃圾桶 | 带盖、桶盖可掀开 | 15元 | 家里有就不用买 |
| 杜邦线 | 母对母/公对母 | 3元 | 若干 |
| USB电源线+充电头 | 5V/1A | 0元(家里有) | - |
| 合计 | 约45元 |
如果用旧手机充电器供电,可以省掉电源的钱。如果手头已经有ESP8266开发板,总成本可以压到30元以内。
选垃圾桶的小建议:选那种桶盖可以“掀开”的款式,而不是“翻盖”的。舵机推拉桶盖需要一定的活动空间,翻盖式的结构不太好改。普通家用脚踏式垃圾桶把脚踏机构拆掉后,桶盖就变成了“自由掀开”状态,非常适合改造。
四、工作原理
4.1 自动开盖逻辑
垃圾桶顶部固定一个超声波传感器,朝斜前方或正前方发射超声波,持续探测前方是否有物体靠近。
当检测到物体距离小于30cm(手伸过来了)→ 舵机转动,推开桶盖
当物体离开后超过3秒(手收回去了)→ 舵机复位,桶盖自动合上
4.2 满溢检测逻辑
同一个超声波传感器也可以用来检测桶内垃圾的高度。
将传感器安装在桶盖内侧,朝桶底方向发射超声波。当桶内垃圾堆积到距离传感器小于20cm时,判定为“满了”,触发微信推送。
注:如果想让两个功能同时工作,需要用两个超声波传感器——一个朝前(探测人手),一个朝下(探测垃圾高度)。如果你只有一个传感器,可以选择只做开盖功能,或者只做满溢检测。
4.3 系统架构
人体靠近 → 超声波测距 → ESP8266判断距离 ↓ 小于30cm → 舵机开盖 ↓ 大于30cm持续3秒 → 舵机关盖 ↓ 桶内垃圾高度小于20cm → 微信推送+蜂鸣器报警
五、电路连接(超简单,不用焊接)
ESP8266 NodeMCU 引脚分配:
| 组件 | 引脚 | ESP8266 |
|---|---|---|
| 超声波传感器(HC-SR04) | TRIG | D1(GPIO5) |
| ECHO | D2(GPIO4) | |
| VCC | 3.3V | |
| GND | GND | |
| 舵机(SG90) | 信号线 | D3(GPIO0) |
| VCC | 5V(Vin) | |
| GND | GND | |
| 蜂鸣器 | 正极 | D4(GPIO2) |
| 负极 | GND |
接线示意:
text
ESP8266 NodeMCU HC-SR04 SG90舵机 蜂鸣器 ┌─────────────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ 3.3V ───────┼───────────────│ VCC │ │ │ │ │ │ GND ────────┼───────────────│ GND │ │ │ │ │ │ D1 (GPIO5) ─┼───────────────│ TRIG │ │ │ │ │ │ D2 (GPIO4) ─┼───────────────│ ECHO │ │ │ │ │ │ 5V (Vin) ───┼─────────────────────────────────────│ VCC │ │ │ │ GND ────────┼─────────────────────────────────────│ GND │ │ │ │ D3 (GPIO0) ─┼─────────────────────────────────────│ 信号 │ │ │ │ D4 (GPIO2) ─┼─────────────────────────────────────────────────────────────│ 正极 │ │ GND ────────┼─────────────────────────────────────────────────────────────│ 负极 │ └─────────────┘ └───────┘ └───────┘ └───────┘
六、代码实现(复制即用)
6.1 完整代码
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <Servo.h> // ====== WiFi配置 ====== const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; // ====== 巴法云配置(用于微信推送,免费) ====== // 去 bemfa.com 注册获取UID const String UID = "你的私钥UID"; const String TOPIC = "trashcan001"; // ====== 引脚定义 ====== #define TRIG_PIN 5 // D1 #define ECHO_PIN 4 // D2 #define SERVO_PIN 0 // D3 #define BUZZER_PIN 2 // D4 // ====== 参数配置 ====== #define OPEN_DISTANCE 30 // 开盖距离(cm):手靠近小于30cm开盖 #define FULL_DISTANCE 20 // 满溢距离(cm):垃圾高度小于20cm判定为满 #define CLOSE_DELAY 3000 // 关盖延时(毫秒):3秒后自动关 Servo lidServo; bool isLidOpen = false; unsigned long lastOpenTime = 0; bool wasFull = false; void setup() { Serial.begin(115200); // 引脚初始化 pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(BUZZER_PIN, LOW); // 舵机初始化 lidServo.attach(SERVO_PIN); lidServo.write(0); // 关闭状态 // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi Connected!"); sendWeChat("[系统] 智能垃圾桶已启动"); } void loop() { // 1. 测量距离(向前探测——人手靠近) float frontDist = measureDistance(TRIG_PIN, ECHO_PIN); // 2. 自动开盖逻辑 if (frontDist > 0 && frontDist < OPEN_DISTANCE) { // 手靠近了,开盖 if (!isLidOpen) { lidServo.write(90); // 打开 isLidOpen = true; Serial.println("Lid opened"); } lastOpenTime = millis(); // 刷新计时 } else if (isLidOpen && (millis() - lastOpenTime > CLOSE_DELAY)) { // 手离开超过3秒,关盖 lidServo.write(0); isLidOpen = false; Serial.println("Lid closed"); } // 3. 满溢检测(向下探测——桶内垃圾高度) float downDist = measureDistance(TRIG_PIN, ECHO_PIN); // 注意:实际使用时需要调整传感器方向,向前和向下可能需要两个传感器 // 这里简化演示,用同一个传感器分时复用 if (downDist > 0 && downDist < FULL_DISTANCE) { if (!wasFull) { // 垃圾满了! wasFull = true; // 蜂鸣器报警 for (int i = 0; i < 3; i++) { digitalWrite(BUZZER_PIN, HIGH); delay(200); digitalWrite(BUZZER_PIN, LOW); delay(200); } sendWeChat("⚠️ 垃圾桶满了,该倒垃圾了!"); } } else { wasFull = false; } // 4. 每10分钟上报一次状态(可选) static unsigned long lastReport = 0; if (millis() - lastReport > 600000) { // 10分钟 String status = (wasFull) ? "满" : "未满"; sendWeChat("[状态] 垃圾桶" + status + ",距离:" + String(downDist) + "cm"); lastReport = millis(); } delay(200); } // 超声波测距函数 float measureDistance(int trigPin, int echoPin) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH, 30000); // 超时30ms if (duration == 0) return -1; // 无回波 float distance = duration * 0.034 / 2; return distance; } // 微信推送(通过巴法云) void sendWeChat(String msg) { if (WiFi.status() != WL_CONNECTED) return; HTTPClient http; String url = "http://api.bemfa.com/api/device/v1/data/1/" + UID + "/" + TOPIC + "/"; url += msg; http.begin(url); int httpCode = http.GET(); if (httpCode > 0) { Serial.println("推送成功:" + msg); } else { Serial.println("推送失败"); } http.end(); }6.2 代码说明
超声波测距:
measureDistance()函数发送10微秒的脉冲,测量回波时间,计算出距离自动开盖:检测到手靠近(距离<30cm)时舵机旋转90°开盖,手离开3秒后自动关闭
满溢检测:垃圾高度小于20cm时触发满溢报警,蜂鸣器响3声+微信推送
状态上报:每10分钟上报一次垃圾桶状态,方便远程了解情况
关于分时复用的说明:
上面的代码用同一个超声波传感器同时做“向前探测人手”和“向下探测垃圾高度”。如果你希望两个功能都正常工作,建议买两个HC-SR04传感器(多花5块钱),一个朝前装、一个朝下装,各自独立工作,互不干扰。
七、机械安装:怎么把传感器和舵机固定在垃圾桶上?
这是整个项目里最“动手”的部分,但不需要专业工具。
7.1 舵机安装(驱动桶盖)
方案一:直接粘(最简单)
用热熔胶或3M双面胶把舵机粘在垃圾桶桶身外侧,舵机摇臂用一根细铁丝或塑料片连接到桶盖边缘。舵机旋转时,摇臂推动桶盖打开。
方案二:支架固定(更稳定)
找一块硬纸板或塑料片,剪成L形支架。一端固定舵机,另一端用双面胶固定在桶身上。舵机摇臂用扎带连接桶盖。
关键点:
舵机初始位置(0°)对应桶盖关闭
舵机旋转到90°对应桶盖完全打开
如果角度不够,可以调整到120°或更大(SG90支持0-180°)
7.2 超声波传感器安装(探测人手)
传感器装在垃圾桶顶部朝向前方,用双面胶固定即可。
安装位置:传感器探头朝前偏下约15-30°,确保能探测到人伸手靠近的动作,同时不会被桶盖遮挡。
探测距离:30cm左右比较合适——手伸到垃圾桶上方时触发开盖,不会因为路过就误开。
7.3 超声波传感器安装(探测垃圾高度,可选)
如果买两个传感器,第二个装在桶盖内侧朝向桶底。测量桶内垃圾到桶口的距离,判断是否满了。
安装位置:固定在桶盖内侧中央,探头朝下。注意不要让探头被垃圾袋挡住。
7.4 走线
所有线从桶身背面走,用扎带或电工胶带固定。USB电源线从桶身底部或背面穿出,插到附近的插座上。
注意:如果垃圾桶是金属的,线缆要避开尖锐边缘,防止磨损短路。
八、微信推送配置(2分钟搞定)
使用巴法云(免费物联网云平台,无需公众号):
访问
bemfa.com注册账号在控制台绑定微信(扫码即可)
获取你的私钥UID
在代码中填入UID和你自己命名的Topic
推送原理:ESP8266通过HTTP请求调用巴法云API,巴法云把消息推送到你的微信。完全免费,不限次数。
九、使用体验:一个月后的真实感受
9.1 最直接的改变:不用再纠结“碰不碰盖子”
这是最大的改变。以前每次扔垃圾都要做一次“要不要用手碰盖子”的思想斗争——手干净的时候无所谓,手上有油污的时候就特别纠结。现在手伸过去,盖子自己打开,扔完手缩回来,盖子自己关上。
整个过程零接触。切完生肉、剥完蒜、吃完薯片——所有手上带油带屑的时候,扔垃圾都变得毫无心理负担。
9.2 满溢提醒帮我省了一件事
以前经常出现这种情况:垃圾袋已经满了,但没注意到,继续往里塞。结果第二天早上起来发现垃圾溢出来了,还得收拾。
现在垃圾桶满了会主动发微信通知我,蜂鸣器也会响三声提醒。听到声音就知道该换垃圾袋了,不用每天去掀开盖子看一眼。
9.3 续航:插电即忘
用USB插电供电,完全不需要担心电池问题。如果是电池供电的成品感应垃圾桶,几个月就要换一次电池。我这个插上电之后就不用管了,用了快一个月没出过任何问题。
9.4 一个意外的“副作用”
家人来我这儿做客,看到垃圾桶会自动开盖,都觉得很新奇。他们反复伸手、缩手、再伸手,玩了半天。虽然有点搞笑,但也说明一个问题——这种“不用手碰”的体验,一旦用过就回不去了。
十、可以怎么升级?
| 升级方向 | 方案 | 成本 |
|---|---|---|
| 手机端可视化 | 接入Blynk,手机上显示桶内状态 | 免费 |
| 垃圾分类提示 | 加装颜色传感器,识别垃圾袋颜色,语音提示分类 | 约15元 |
| 自动套袋 | 加装风扇或真空泵,一键吸附垃圾袋 | 约20元 |
| 异味检测 | 加装MQ-135气体传感器,检测异味超标推送提醒 | 约8元 |
| 多桶联动 | 一个ESP8266管理多个垃圾桶(厨余/可回收/其他) | 每个桶增加约10元 |
| 太阳能供电 | 加太阳能板+充电电池,彻底摆脱插座 | 约25元 |
如果你愿意花更多时间,还可以用ESP32-CAM加装摄像头,用AI图像识别算法对投入的垃圾进行实时分类——这个就是真正的“智能垃圾分类”了。
十一、避坑指南
❌ 坑1:超声波传感器测距不稳定
现象:手没靠近,盖子却莫名其妙打开了;或者手伸过去了,盖子没反应。
原因:HC-SR04在复杂环境下容易受到干扰。
解决:
传感器表面保持清洁,不要有灰尘或污渍
在代码中加入滑动平均滤波(取最近5次测量的平均值)
调整探测角度,避免传感器对着反光面(玻璃、金属)
❌ 坑2:舵机力矩不够
现象:舵机转了,但桶盖只打开一点点,或者根本打不开。
原因:桶盖太重,SG90的力矩(约1.5kg·cm)不够。
解决:
换成MG995金属舵机(力矩约10kg·cm,约15元)
或者在桶盖转轴上加一个弹簧助力,减轻舵机负担
调整舵机安装位置,让力臂更长
❌ 坑3:Wi-Fi信号不稳定
现象:微信推送时有时无,或者根本收不到。
解决:
把ESP8266放在离路由器近一点的地方
在代码中加入断线重连机制
换用ESP32(Wi-Fi信号更强)
❌ 坑4:满溢检测误报
现象:垃圾桶明明没满,却一直推送“满了”。
原因:传感器安装角度不对,探测到了桶壁而不是垃圾。
解决:
调整传感器角度,确保探测方向正对桶底
适当降低灵敏度(把
FULL_DISTANCE从20cm调到15cm)
十二、写在最后
一个50块钱的改造,解决了一个困扰我三年的小问题。
这就是物联网最有魅力的地方——它不一定需要造火箭、搞智慧城市,它也可以只是让一个垃圾桶变得更“懂事”。你伸手,它开盖;你离开,它关上;垃圾满了,它主动告诉你。
技术最大的价值,不是让东西变得更复杂,而是让生活变得更简单。
现在,翻翻你家的垃圾桶,看看它缺不缺一个“大脑”。