在这个项目中,我将向您展示如何使用Arduino制作智能垃圾箱,当您带着垃圾接近时,垃圾箱的盖子会自动打开。
优势
这款 Arduino Nano 智能垃圾桶的主要优点是它有助于保持清洁和环保的环境。这项努力的灵感来自“Swaach BharatMission”。在这个项目中,自动垃圾桶建立在一个基于微控制器的平台上,即ArduinoNano板,该板与两个伺服电机,一个超声波传感器和一个红外传感器连接。超声波传感器放置在垃圾箱的顶部,用于检测物体或人。阈值高度设置在特定级别。这款Arduino Nano 智能垃圾箱使用超声波传感器感知人或物体,该传感器使用 Arduino Nano将消息发送到伺服电机。当人靠近这个自动智能垃圾箱时,垃圾箱盖将自动打开您的垃圾箱,一段时间后它会自动关闭。
构建Arduino智能垃圾箱所需的组件
Arduino 纳米
两个伺服电机 (MG996R)
HC-SR04 超声波传感器
红外传感器(通用)
两个 LED(用于视觉反馈)
7.4V锂离子电池
LM2596 直流/直流降压转换器
直流插座和开关
跳线
面包板或PCB(印刷威廉希尔官方网站 板)
使用Arduino Nano的智能垃圾箱威廉希尔官方网站 图
下图显示了带有Arduino的智能垃圾箱的威廉希尔官方网站 图。这是一个非常简单的设计,因为该项目仅涉及三个主要组件(超声波传感器、红外传感器和伺服电机),而不是Arduino Nano。
重要: 将降压转换器的输出电压调整为 8V 至 8.2V 的范围,因为 7.4V 锂离子电池的充电电压为 8.2V。通过 12V充电插座为电池充电时,此调整是必要的,因为降压转换器将有效地将电压从 12V 降低到 8V。
将 Arduino Nano 连接到面包板或 PCB。确保连接电源和接地引脚。通过开关将 7.4V 锂离子电池连接到 Arduino Nano 的Vin 引脚。此开关允许您从外部电源打开和关闭Arduino。开关、充电插座和Arduino nano编程端口如下图所示。
将正极(红色)线连接到 DC-DC 降压转换器的 7.5V 输出,并在必要时确保将其调整为 8.1V。然后,将接地(黑色)线连接到 ArduinoNano 上的接地 (GND)。数字信号(蓝色)线应连接到 Arduino Nano 上的数字引脚 2。
将正极线连接到 DC-DC 降压转换器的 7.4V 输出。如果需要,确保将其调整为 8.1V。接下来,将地线连接到 Arduino Nano 上的接地
(GND)。最后,将传感器的数据或“信号”线连接到 Arduino Nano 上的数字引脚 4。我们用来打开和关闭盖子的两个伺服电机如下所示。
首先,从伺服电机 (1&2) 中取出信号线并将它们连接到 Arduino 上的一个 PWM 引脚,例如引脚 9 和5。接下来,将伺服电机的电源线连接到DC-DC转换器的7.4V输出。最后,将伺服电机的地线连接到Arduino上的GND引脚之一。
在电源设置中,使用二极管将电池正极端子连接到 LM2596 降压转换器的输出,然后通过开关将其连接到 Arduino 的 Vin引脚。将电池负极端子连接到 Arduino、LM2596 降压转换器和其他部件上的接地 (GND)。最后,将 LM2596 的输入连接到直流插座。
根据需要使用螺钉、螺母和热胶将所有组件固定到车身框架上。确保所有连接牢固且没有松动的电线或潜在的短路。在打开威廉希尔官方网站 电源之前,请务必仔细检查您的连接。
Arduino智能垃圾箱设计
我专门为这个 Arduino Nano 智能垃圾箱项目创建了自定义的开合盖子设计和超声波传感器支架,您可以在下图中看到我使用 Onshape 制作的CAD 设计的屏幕截图,以及我构建的实际垃圾箱。
如果您有兴趣重新创建这个项目或将我的设计融入您自己的作品中,我已经包含了 CAD .dxf 文件,您可以从 thingiverse 下载。
使用Arduino代码的智能垃圾箱
在这个基于Arduino的智能垃圾箱的代码中,两个传感器用于物体检测。第一个传感器是超声波传感器,第二个传感器是红外传感器。当我们的手或脚进入超声波或红外传感器的范围内时,它会向Arduino发送信号。然后,Arduino将向相反方向旋转两个舵机,使垃圾箱盖打开。此外,LED指示灯将亮起。我已将超声波传感器的范围设置为40cm,但您可以根据需要进行修改。一旦我们的手离开传感器,经过 2 秒的延迟,舵机将向后旋转,盖子将关闭。
#include 《Servo.h》
该系列包括控制伺服电机所需的伺服库。
const int trigPin = 2; // Trig pin of the ultrasonic sensor
const int echoPin = 3; // Echo pin of the ultrasonic sensor
const int irSensorPin = 4; // IR sensor pin
const int ledPin = 7; // LED pin
const int lightPin = 6; // Light pin
这些行声明用于各种组件的引脚编号的常数,例如超声波传感器(trigPin 和 echoPin)、红外传感器、LED 和其他光源。
Servo servo1;
Servo servo2;
bool lidOpen = false; // Variable to track the lid status
unsigned long lastObjectTime = 0; // Timestamp to track when object was
last detected
这些行创建 Servo 类的实例,该类将用于控制两个伺服电机(servo1 和 servo2)。
这里声明了两个变量:lidOpen 是一个布尔变量,用于跟踪盖子是打开还是关闭,lastObjectTime
是一个无符号长变量,用于记录上次检测到对象的时间戳。
void setup() {
servo1.attach(9);
servo2.attach(5);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(irSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
// Initialize the servo positions to keep the lid closed
servo1.write(90); //right
servo2.write(90); //left
// Delay for 1 second
delay(1000);
// Initialize the serial communication for debugging
Serial.begin(9600);
}
在 setup() 函数中,伺服电机连接到引脚 9 和 5。超声波传感器引脚、红外传感器引脚、LED 引脚和灯引脚配置为 OUTPUT 或INPUT。伺服电机的初始位置是保持盖子关闭(90 度)。有 1000 毫秒(1 秒)的延迟。串行通信初始化为调试,波特率为 9600。
void loop() {
// Check if an object is within a certain range using the ultrasonic
sensor
long duration;
int distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1; // Calculate distance in centimeters
Serial.println(distance);
在 loop()
函数中,代码使用超声波传感器连续测量距离。它触发传感器,记录信号返回所需的时间,并以厘米为单位计算距离,并在串行监视器上显示结果
// Check if the IR sensor is activated
int irSensorValue = digitalRead(irSensorPin);
Serial.println(irSensorValue);
该代码检查红外传感器的状态(高电平或低电平),并将该值打印到串行监视器。
// If distance is less than 40 cm or the IR sensor is activated
if (distance 《 40 || irSensorValue == LOW ) { // Change the threshold value
as needed
// If the lid is not open, open it and set the status
if (!lidOpen) {
lidOpen = true;
digitalWrite(ledPin, HIGH);
digitalWrite(lightPin, HIGH);
Serial.println(“Led On”);
该模块以 if 语句开头,该语句检查两个条件:第一个距离小于 40 cm,由超声波传感器检测到,第二个 irSensorValue 处于 LOW状态,表示 IR 传感器已激活(即检测到物体)。如果满足任一条件,代码将检查 lidOpen 变量是否为 false。如果盖子未打开(!lidOpen 为
true),则继续打开盖子 lidOpen 设置为 true,表示盖子已打开。通过将 LED (ledPin) 和灯 (lightPin)设置为高电平状态来打开它们,从而提供视觉反馈。一条消息“Led On”打印到串行监视器进行调试。
for (int angle = 90; angle 《= 180; angle++) {
servo1.write(angle);
servo2.write(180 - angle);
delay(10);
}
}
在开盖部分内,使用for循环逐渐打开盖子。此循环从 90 度的初始角度迭代到最终 180度的角度。它以协调的方式改变舵机1和舵机2的角度,以产生平稳的开盖运动。每一步增加 10 毫秒的小延迟,以控制伺服电机的速度。
lastObjectTime = millis(); // Record the time when an object was
detected
打开盖子后,代码使用 millis() 记录当前时间。此时间戳存储在 lastObjectTime 变量中,用于跟踪上次检测到对象的时间。
else {
// If the lid was open and it‘s been more than 2 seconds since an object
was detected, close it
if (lidOpen && millis() - lastObjectTime 》= 2000)
如果块 1 中的条件均不满足(即未检测到物体或物体超出范围),则代码将继续检查盖子是否打开。它验证 lidOpen 是否为true,指示盖子当前处于打开状态。它进一步检查自上次检测到对象以来是否超过 2 秒,使用 millis() 函数计算时间差。
{
for (int angle = 180; angle 》= 90; angle--) {
servo1.write(angle);
servo2.write(180 - angle);
delay(20);
}
lidOpen = false;
// Turn off the LED
digitalWrite(ledPin, LOW);
digitalWrite(lightPin,LOW);
Serial.println(“Led Off”);
}
}}
如果盖子打开并且距离上次检测到物体已经超过 2 秒,则盖子会逐渐关闭。LED 和灯已关闭,lidOpen 变量设置为 false。
总之,该代码通过在检测到物体(通过超声波传感器或红外传感器)时打开盖子并在指定的不活动时间(2秒)后关闭盖子来控制“智能垃圾箱”。伺服电机的使用确保了盖子的平稳运动,并通过 LED 和灯提供视觉反馈。
智能垃圾箱的工作原理
在视频中,您可以观察到超声波传感器在垃圾箱盖的自动操作中起着至关重要的作用。当任何物体或您的手接近位于垃圾箱上方的超声波传感器时,传感器就会被激活,导致盖子打开。只要盖子继续检测到您的手的存在,它就会保持在打开位置。
然而,盖子的设计是为了响应传感器磁场的变化。一旦您将手抽出传感器的范围,盖子就会自动关闭之前会短暂延迟 2秒。此功能可确保在使用完垃圾箱后顺利方便地关闭盖子。
此外,红外 (IR)传感器已集成到系统中,位于垃圾箱的下部。这项创新意味着您甚至不需要用手实际接近红外传感器。如果您只是将脚或身体的任何部位从远处靠近红外传感器,它就会检测到运动并激活,从而导致盖子打开。同样,当您离开红外传感器的范围时,盖子将再次关闭,保持免提和卫生的体验。
结论
智能垃圾箱的核心概念是以物体识别为中心,通过使用HC-SR04超声波传感器和红外传感器来实现这一点。该项目的灵感来自强调清洁和卫生的“Swaach
Bharat Mission”。它的主要目标是建造一个垃圾箱,当有人或物体接近时,它可以自主打开盖子,使垃圾处理成为一种更方便、更卫生的体验。
该项目的设计和建造涉及创建定制的盖子机构和传感器支架,展示了使用 3D
设计工具的灵活性。红外传感器的加入增加了免提体验,允许用户在没有物理接触的情况下打开盖子。
审核编辑:陈陈
全部0条评论
快来发表一下你的评论吧 !