Nota
¡Hola, bienvenido a la Comunidad de Entusiastas de Raspberry Pi, Arduino y ESP32 en Facebook! Profundiza en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros entusiastas.
¿Por qué unirte?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Vistas previas exclusivas: Accede a nuevos anuncios de productos y avances antes que nadie.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.
👉 ¿Estás listo para explorar y crear con nosotros? Haz clic en [aquí] y únete hoy mismo!
Lección 35: Bote de basura inteligente
Este proyecto se centra en el concepto de un bote de basura inteligente. El objetivo principal es hacer que la tapa del bote se abra automáticamente cuando un objeto se acerque dentro de una distancia preestablecida (20 cm en este caso). La funcionalidad se logra mediante el uso de un sensor ultrasónico de distancia acoplado a un motor servo. La distancia entre el objeto y el sensor se mide continuamente. Si el objeto está lo suficientemente cerca, el motor servo se activa para abrir la tapa.
Componentes necesarios
En este proyecto necesitamos los siguientes componentes.
Es muy conveniente comprar un kit completo, aquí tienes el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit de Sensor Universal Maker |
94 |
También puedes comprarlos por separado a través de los enlaces a continuación.
Introducción al componente |
Enlace de compra |
|---|---|
ESP32 & Placa de Desarrollo (Placa ESP32) |
|
Conexiones
Código
Análisis del código
El proyecto se basa en el monitoreo en tiempo real de la distancia entre un objeto y un bote de basura. Un sensor ultrasónico mide continuamente esta distancia, y si un objeto se acerca dentro de los 20 cm, el bote de basura lo interpreta como una intención de desechar basura y abre automáticamente su tapa. Esta automatización agrega inteligencia y comodidad a un bote de basura convencional.
Configuración inicial y declaración de variables
Aquí, incluimos la biblioteca
ESP32Servoy definimos las constantes y variables que utilizaremos. Se declaran los pines para el servo y el sensor ultrasónico. También tenemos un arregloaverDistpara almacenar las tres mediciones de distancia.#include <ESP32Servo.h> // Configurar los parámetros del motor servo Servo servo; const int servoPin = 27; const int openAngle = 0; const int closeAngle = 90; // Definir los valores mínimos y máximos del ancho de pulso para el servo const int minPulseWidth = 500; // 0.5 ms const int maxPulseWidth = 2500; // 2.5 ms // Configurar los parámetros del sensor ultrasónico const int trigPin = 26; const int echoPin = 25; long distance, averageDistance; long averDist[3]; // Umbral de distancia en centímetros const int distanceThreshold = 20;
Función
setup()La función
setup()inicializa la comunicación serial, configura los pines del sensor ultrasónico y establece la posición inicial del servo en la posición cerrada.void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); servo.attach(servoPin); servo.write(closeAngle); delay(100); }
Función
loop()La función
loop()es responsable de medir continuamente la distancia, calcular su promedio y luego tomar una decisión sobre si abrir o cerrar la tapa del bote de basura en función de esta distancia promedio.void loop() { // Medir la distancia tres veces for (int i = 0; i <= 2; i++) { distance = readDistance(); averDist[i] = distance; delay(10); } // Calcular la distancia promedio averageDistance = (averDist[0] + averDist[1] + averDist[2]) / 3; Serial.println(averageDistance); // Controlar el servo basado en la distancia promedio if (averageDistance <= distanceThreshold) { servo.attach(servoPin); // Readjuntar el servo antes de enviar un comando delay(1); servo.write(openAngle); // Rotar el servo a la posición abierta delay(3500); } else { servo.write(closeAngle); // Rotar el servo de vuelta a la posición cerrada delay(1000); servo.detach(); // Desadjuntar el servo para ahorrar energía cuando no se use } }
Función de lectura de distancia
Esta función,
readDistance(), es la que interactúa con el sensor ultrasónico. Envía un pulso y espera un eco. El tiempo que tarda el eco se utiliza para calcular la distancia entre el sensor y cualquier objeto frente a él.Puedes consultar el Principio del sensor ultrasónico.
float readDistance() { // Enviar un pulso en el pin trigger del sensor ultrasónico digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Medir el ancho del pulso en el pin echo y calcular el valor de distancia float distance = pulseIn(echoPin, HIGH) / 58.00; // Fórmula: (340m/s * 1us) / 2 return distance; }
Función de escritura del servo
Esta función mapea el valor del ángulo al ancho de pulso y llama a la función
writeMicroseconds(pulseWidth)para mover el servo a un ángulo específico.// Función para hacer funcionar el servo void servoWrite(int angle){ int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth); servo.writeMicroseconds(pulseWidth); }