Máquina de Vending Inverso (RVM): Kit DIY de Sistema Inteligente de Reciclaje
Componentes y materiales
- 1 × Arduino Mega 2560
- 1 × NodeMCU ESP8266 Breakout Board
- 2 × Sensor de proximidad inductivo (15 mm)
- 1 × Sensor de proximidad capacitivo (12 mm)
- 2 × Servomotor SG90
- 1 × LCD alfanumérico 16×2
- 2 × Sensor ultrasónico HC-SR04
- 1 × Módulo GPS (genérico)
- 1 × Zumbador piezoeléctrico
- 1 × Potenciómetro 100k Ω
- 1 × Pulsador
- 2 × LED rojo 5 mm
- 1 × Cables jumper
- 1 × Batería 12 V
- 1 × Batería 9 V
- 2 × Protoboard
Herramientas necesarias
- Soldador
- Multímetro digital
- Pelacables
Aplicaciones y servicios en línea
- Arduino IDE
- Blynk
- ThingSpeak API
Sobre el proyecto
Motivación
¿Dónde terminan las botellas de plástico? En vertederos, océanos, ríos y aceras. Se estima que hay 46.000 piezas de plástico por milla cuadrada en el océano. Cada botella tarda hasta 1000 años en descomponerse, liberando sustancias tóxicas. Solo el 12% de los 35.000 millones de botellas anuales se recicla.
Idea
Una máquina inteligente que acepta botellas de plástico y latas metálicas, y recompensa al usuario con puntos canjeables. Usa sensores de proximidad para distinguir el material y un sistema de códigos en pantalla LCD para la recompensa, evitando cupones de papel.
Funcionamiento
- El usuario introduce el envase por la ranura.
- Sensores inductivos y capacitivos identifican el material:
- Inductivo = 1 → objeto metálico
- Inductivo = 0 y capacitivo = 1 → objeto plástico
- Se muestra un código encriptado en la LCD.
- El usuario escanea el código QR de la máquina, accede a la web y canjea los puntos.
- Un sensor ultrasónico monitoriza el nivel de llenado; cuando está lleno, notifica al recolector vía Blynk y envía la ubicación GPS por ThingSpeak.
Código
1. Segregación de residuos (Arduino Mega)
#include
#include
LiquidCrystal lcd(1,2,4,5,6,7);
const int btn = 3;
int sensorPlastico = A0, sensorMetal = A1, sensorMetal2 = A2;
Servo servoPlastico, servoMetal;
int posP = 90, posM = 360;
void setup() {
pinMode(btn, INPUT_PULLUP);
lcd.begin(16,2);
servoPlastico.attach(9);
servoMetal.attach(8);
pinMode(sensorPlastico, INPUT_PULLUP);
pinMode(sensorMetal, INPUT_PULLUP);
pinMode(sensorMetal2, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
lcd.setCursor(0,0); lcd.print("INSERTAR METAL"); lcd.setCursor(0,1); lcd.print(" LADO DERECHO "); delay(6000); lcd.clear();
int sPlastico = digitalRead(sensorPlastico);
int sMetal1 = digitalRead(sensorMetal);
int sMetal2 = digitalRead(sensorMetal2);
// Lógica para plástico
if (sPlastico == 1 && sMetal1 != 1) {
for (posP = 90; posP <= 240; posP++) { servoPlastico.write(posP); delay(5); }
delay(500);
for (posP = 240; posP >= 90; posP--) { servoPlastico.write(posP); delay(5); }
}
// Lógica para metal
if (sMetal2 == 1 && sPlastico == 0) {
for (posM = 360; posM >= 50; posM--) { servoMetal.write(posM); delay(5); }
delay(500);
for (posM = 50; posM <= 360; posM++) { servoMetal.write(posM); delay(5); }
}
}
2. Monitor de nivel de llenado (NodeMCU ESP8266)
#include
#include
#include
#include
#include
#define TRIGGER 5
#define ECHO 4
char auth[] = "TU_AUTH_TOKEN";
char ssid[] = "TU_WIFI";
char pass[] = "TU_PASS";
unsigned long channelID = 1067056;
const char* writeAPIKey = "TU_API_KEY";
TinyGPSPlus gps;
SoftwareSerial ss(4, 5); // RX, TX
BlynkTimer timer;
WidgetMap myMap(V0);
void setup() {
Serial.begin(115200);
ss.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(TRIGGER, OUTPUT);
pinMode(ECHO, INPUT);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
Blynk.run();
timer.run();
// Lectura GPS
while (ss.available() > 0) {
if (gps.encode(ss.read()) && gps.location.isValid()) {
float lat = gps.location.lat();
float lon = gps.location.lng();
ThingSpeak.setField(3, lat);
ThingSpeak.setField(4, lon);
ThingSpeak.writeFields(channelID, writeAPIKey);
Blynk.virtualWrite(V1, String(lat,6));
Blynk.virtualWrite(V2, String(lon,6));
myMap.location(1, lat, lon, "RVM_Location");
}
}
// Ultrasonido
digitalWrite(TRIGGER, LOW); delayMicroseconds(2);
digitalWrite(TRIGGER, HIGH); delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
long dur = pulseIn(ECHO, HIGH);
int dist = (dur/2) / 29.1;
if (dist <= 5) Blynk.notify("¡Vaciar la máquina!");
Blynk.virtualWrite(V6, dist);
ThingSpeak.writeField(channelID, 1, dist, writeAPIKey);
delay(100);
}
Esquemático
Diagrama de conexiones completo disponible en el repositorio del proyecto.
Proceso de manufactura
- La evolución y fabricación de máquinas de coser: de la innovación del siglo XIX a la automatización moderna
- Construya una Puerta con Auto‑Bloqueo Inteligente Usando la Proximidad Bluetooth de su Smartphone
- Monitor de temperatura casero con Raspberry Pi, MCP9808, InfluxDB y Grafana
- Máquinas expendedoras de patatas fritas: Funcionamiento y ventajas
- Máquinas expendedoras de leche fresca: Cómodas, asequibles y ecológicas
- Cómo las Máquinas Expendedoras de Patatas Fritas Entregan Patatas Calientes y Frescas a Demanda
- Descubre las Máquinas Expendedoras de Fideos: Funcionamiento y Qué Puedes Obtener
- Explora la Innovadora Máquina Expendedora de Té, Café y Sopa
- Máquinas Expendedoras de Comidas Preparadas: Comida Fresca y Saludable al Instante
- Todo lo que necesitas saber sobre las máquinas expendedoras de refrescos
- Desbloqueando Beneficios: El Potencial de Negocio de las Máquinas Expendedoras de Helados