低成本自动翻盖垃圾桶:红外感应+舵机控制方案

你是否想过,一个普通的纸板盒子也能变身成智能设备?本项目教你用 Arduino 开发板、超声波传感器(HC-SR04)和微型舵机,亲手打造一款 免手触、自动翻盖的智能垃圾桶。当手或物体靠近时,桶盖自动开启;离开后延时关闭,全程无需接触,既卫生又便捷。
准备工作:
材料:
材料名称
数量
备注
esp8266
1
拓展版
1
5v电源
1
超声波传感器
1
sg90
1
公对公杜邦线
4根
公对母杜邦线
3根
直尺
1
纸板
1
56*42大小的纸板,可以用其他材料代替
热胶枪
1
壁纸刀
1
1
画图及裁剪





123
首先,准备一块纸板,并确保你有直尺和笔 。在纸板上设计你的图案时,每个正方形的尺寸应设定为14厘米乘以14厘米。使用直尺和笔仔细地标记出这些正方形的轮廓。完成标记后,小心地使用壁纸刀沿着所画的线条进行切割。请务必精确测量并缓慢切割,以保证每个正方形的尺寸准确无误。
2
粘合





123
在将所有部分切割完毕后,您需要对每一个连接处进行精确折叠。根据设计,这些折叠线将是未来盒子边缘的接合处。完成折叠后,使用热熔胶对相邻部分的纸板进行粘接,确保每个连接点都牢固结实。逐步进行此操作,直到所有的连接处都被妥善处理,并且各个面完美地结合在一起,最终形成一个正方形的盒子。请确保在操作热熔胶枪时要小心,以避免烫伤或意外发生。
3
放置传感器





123
在纸板结构的组装完成后,为确保传感器正常工作且避免外界干扰导致误触发,需对传感器进行合理安装与防护。具体操作如下:
- 安装红外避障传感器(HC-SR04):将超声波传感器(如HC-SR04)固定于纸板盒子的正面中央位置,使其朝向前方,用于检测前方障碍物。使用胶带或热熔胶将其牢固粘贴,确保其水平稳定,避免因晃动影响测距精度。
- 安装舵机(Tower Pro SG90):在盒子两侧边缘处安装小型舵机,用于驱动机械结构或调整传感器角度。将舵机通过胶带或小夹具固定在纸板侧壁,并预留出足够的空间以便旋转。舵机输出轴可连接简易挡板,实现动态调节功能。
4
烧录代码

#include <Servo.h>
// === 引脚定义(NodeMCU)===
#define TRIG_PIN 5 // D1 → GPIO5
#define ECHO_PIN 4 // D2 → GPIO4
#define SERVO_PIN 2 // D4 → GPIO2(推荐)
Servo lidServo;
// === 配置参数 ===
const int OPEN_ANGLE = 180; // 打开角度
const int CLOSE_ANGLE = 0; // 关闭角度
const int TRIGGER_DISTANCE = 25; // 触发距离(cm)
const unsigned long CLOSE_DELAY = 3000; // 人走后延迟关盖时间(3秒)
// === 状态变量 ===
bool isLidOpen = false; // 当前桶盖是否打开
unsigned long lastSeenTime = 0; // 上次检测到人的时刻
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
lidServo.attach(SERVO_PIN);
lidServo.write(CLOSE_ANGLE); // 初始关闭
isLidOpen = false;
Serial.println("✅ 智能垃圾桶:人在即开,人走3秒后关");
}
long getDistance() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0 || duration > 23200) return -1; // 超时或超距
long dist = duration * 0.034 / 2;
return (dist < 2 || dist > 400) ? -1 : dist;
}
void loop() {
long dist = getDistance();
// 调试输出(可选)
if (dist == -1) {
Serial.println("📏 距离: 无效");
} else {
Serial.print("📏 距离: ");
Serial.print(dist);
Serial.println(" cm");
}
bool personDetected = (dist > 0 && dist <= TRIGGER_DISTANCE);
if (personDetected) {
// 有人 → 立即开盖(如果还没开)
if (!isLidOpen) {
lidServo.write(OPEN_ANGLE);
isLidOpen = true;
Serial.println("🗑️ 开盖(检测到人)");
}
// 更新“最后看到人”的时间
lastSeenTime = millis();
} else {
// 无人 → 检查是否该关盖
if (isLidOpen) {
if (millis() - lastSeenTime >= CLOSE_DELAY) {
lidServo.write(CLOSE_ANGLE);
isLidOpen = false;
Serial.println("🔒 关盖(3秒无人)");
}
// 否则:继续保持开盖,等待超时
}
}
delay(100); // 检测间隔(可调,越小响应越快)
}
5
演示
0
0
0
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0