扔垃圾这件小事,我花50块把它变成了“不用动手”的事 阅读提示本文记录我用ESP8266超声波舵机把一个普通垃圾桶改造成“智能感应垃圾桶”的全过程。自动开盖、满溢提醒、远程查看状态——成本不到50块再也不用弯腰掀盖子了。 开篇那个让我忍了三年的“脏手”问题你有没有过这样的经历厨房里切完生肉满手油污想去扔垃圾。垃圾桶的盖子需要用手掀开——你犹豫了一下决定用胳膊肘顶开。盖子“啪”地一声弹开了但你的胳膊肘也沾上了一层黏糊糊的油渍。或者在客厅吃薯片手上有碎屑和油垃圾桶的盖子需要用手掀开。你不想弄脏盖子又不想弄脏手最后选择——把垃圾堆在桌角等攒够了再一次性去扔。垃圾桶盖这个本该帮我们隔绝脏东西的设计反而成了最“脏”的地方。我忍了三年。每次扔垃圾都要经历一次“要不要用手碰盖子”的灵魂拷问。直到上个月我实在受不了了决定做一个自己会开盖的垃圾桶。花了一个周末我用ESP8266 超声波传感器 舵机把家里的普通垃圾桶改造成了智能感应垃圾桶。手一伸过去盖子自动打开手离开后几秒钟自动关上。从此再也不用纠结“碰不碰盖子”这个问题了。更妙的是它还多了几个“隐藏技能”垃圾满了会自动提醒我、手机上能实时看到桶里装了多少、甚至还能通过微信远程查看状态。硬件成本加起来不到50块。如果你手里有旧开发板成本还能更低。今天我就把这套改造方案完整分享出来。无论你是租房党还是自家住只要家里有垃圾桶都能复刻。一、需求分析一个“聪明”的垃圾桶需要什么能力痛点理想功能物联网方案扔垃圾要用手掀盖子脏伸手自动开盖离开自动关超声波传感器探测人体靠近 → 舵机驱动开盖不知道垃圾满了没有满溢时主动提醒超声波测距检测桶内垃圾高度 → 超阈值微信推送垃圾袋套不牢、容易滑落辅助吸附或提醒重量传感器检测袋内垃圾重量变化厨余垃圾气味难闻桶内状态远程查看温湿度传感器监测桶内环境倒垃圾总是忘定时提醒云端定时任务 → 微信推送本方案实现的核心功能✅ 人体靠近时自动开盖超声波传感器探测✅ 离开后延时自动关盖3-5秒可调✅ 桶内垃圾满溢检测 微信推送提醒✅ 手机远程查看桶内状态满/未满✅ 全部硬件成本控制在50元以内如果家里有多个垃圾桶需要改造每个桶只需要增加传感器和舵机主控可以复用成本更低。二、为什么要自己做而不是买成品市面上确实有智能感应垃圾桶在卖价格从几十到几百不等。但它们有几个共同的问题第一封闭生态。成品感应垃圾桶的功能是固定的——开盖、关盖仅此而已。你不能给它增加“满溢提醒”不能让它“发微信通知你”更不能把它接入你已有的智能家居系统。第二电池续航焦虑。很多成品用电池供电几个月换一次电池扔垃圾变成了一件需要担心“电池还有没有电”的事。第三价格不透明。一个带红外感应的垃圾桶成本可能不到30块卖你两三百。自己做的好处是功能完全自定义、想加什么传感器就加什么、坏了随时能修、成本透明到每一根杜邦线。更重要的是做完之后你会真正理解“智能”是怎么实现的——下次想做别的改造心里就有底了。三、硬件清单总成本约48元组件型号单价备注主控ESP8266 NodeMCU15元带Wi-Fi兼容Arduino超声波传感器HC-SR045元测距用探测人手和垃圾高度舵机SG909g6元驱动桶盖开合蜂鸣器5V有源1元满溢时声音提醒可选普通垃圾桶带盖、桶盖可掀开15元家里有就不用买杜邦线母对母/公对母3元若干USB电源线充电头5V/1A0元家里有-合计约45元如果用旧手机充电器供电可以省掉电源的钱。如果手头已经有ESP8266开发板总成本可以压到30元以内。选垃圾桶的小建议选那种桶盖可以“掀开”的款式而不是“翻盖”的。舵机推拉桶盖需要一定的活动空间翻盖式的结构不太好改。普通家用脚踏式垃圾桶把脚踏机构拆掉后桶盖就变成了“自由掀开”状态非常适合改造。四、工作原理4.1 自动开盖逻辑垃圾桶顶部固定一个超声波传感器朝斜前方或正前方发射超声波持续探测前方是否有物体靠近。当检测到物体距离小于30cm手伸过来了→ 舵机转动推开桶盖当物体离开后超过3秒手收回去了→ 舵机复位桶盖自动合上4.2 满溢检测逻辑同一个超声波传感器也可以用来检测桶内垃圾的高度。将传感器安装在桶盖内侧朝桶底方向发射超声波。当桶内垃圾堆积到距离传感器小于20cm时判定为“满了”触发微信推送。注如果想让两个功能同时工作需要用两个超声波传感器——一个朝前探测人手一个朝下探测垃圾高度。如果你只有一个传感器可以选择只做开盖功能或者只做满溢检测。4.3 系统架构人体靠近 → 超声波测距 → ESP8266判断距离 ↓ 小于30cm → 舵机开盖 ↓ 大于30cm持续3秒 → 舵机关盖 ↓ 桶内垃圾高度小于20cm → 微信推送蜂鸣器报警五、电路连接超简单不用焊接ESP8266 NodeMCU 引脚分配组件引脚ESP8266超声波传感器HC-SR04TRIGD1GPIO5ECHOD2GPIO4VCC3.3VGNDGND舵机SG90信号线D3GPIO0VCC5VVinGNDGND蜂鸣器正极D4GPIO2负极GND接线示意textESP8266 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元或者在桶盖转轴上加一个弹簧助力减轻舵机负担调整舵机安装位置让力臂更长❌ 坑3Wi-Fi信号不稳定现象微信推送时有时无或者根本收不到。解决把ESP8266放在离路由器近一点的地方在代码中加入断线重连机制换用ESP32Wi-Fi信号更强❌ 坑4满溢检测误报现象垃圾桶明明没满却一直推送“满了”。原因传感器安装角度不对探测到了桶壁而不是垃圾。解决调整传感器角度确保探测方向正对桶底适当降低灵敏度把FULL_DISTANCE从20cm调到15cm十二、写在最后一个50块钱的改造解决了一个困扰我三年的小问题。这就是物联网最有魅力的地方——它不一定需要造火箭、搞智慧城市它也可以只是让一个垃圾桶变得更“懂事”。你伸手它开盖你离开它关上垃圾满了它主动告诉你。技术最大的价值不是让东西变得更复杂而是让生活变得更简单。现在翻翻你家的垃圾桶看看它缺不缺一个“大脑”。