Smart Herb Box: Sistema de Cultivo Interior con Alexa y Arduino
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Amazon Alexa Echo Dot | 1 |
| Arduino UNO | 1 |
| Espressif ESP8266 ESP-01 | 1 |
| Arduino Proto Shield | 1 |
| Arduino 4 Relays Shield | 1 |
| Bomba de agua (Aqua Pump) | 2 |
| Lámpara de cultivo para plantas | 1 |
| Adaptador 220V DC | 1 |
| Adaptador 12V DC | 1 |
| Cargador USB + cable | 1 |
| Manguera de aire | 1 |
| Cables jumper genéricos | 1 set |
Aplicaciones y servicios online
- Arduino IDE
- Amazon Alexa Skills Kit
- Amazon Web Services AWS Lambda
- Servidor Web PHP (API personalizada)
Sobre el proyecto
Mis plantas siempre sufrían por exceso o falta de riego, y como uso muchas hierbas en la cocina, decidí crear un sistema de riego automático configurable. La caja debe funcionar en modo automático o manual, con interfaz web para configuración y gráficos de humedad. El último paso fue integrar control por voz con Amazon Alexa para consultar humedad, encender/apagar lámpara de cultivo y activar riego manual.
Empecé con la parte técnica: Arduino, controlador WiFi, sensores de humedad, bombas, lámpara y hardware adicional (shield de relés para separar circuitos de 5V, 12V y 230V, cables y madera de haya para la estructura). El código Arduino se proporciona aquí; el código web/API no se incluye salvo gran demanda.
Paso 1: Sensor de humedad
Primer hito: leer humedad con Arduino. Sensor YL-69: VCC a GPIO (pin 6), GND a GND, A0 a pin analógico (A1).
byte vccPin = 6;
byte dataPin = A1;
void setup() {
pinMode(vccPin, OUTPUT);
digitalWrite(vccPin, LOW);
Serial.begin(9600);
while (!Serial);
}
int readHumidity() {
digitalWrite(vccPin, HIGH);
delay(500); // Tiempo de pre-alimentación
int value = analogRead(dataPin);
digitalWrite(vccPin, LOW);
return 1023 - value; // Invertir: más humedad = valor mayor
}
void loop() {
Serial.print("Nivel humedad (0-1023): ");
Serial.println(readHumidity());
delay(10000);
}
Paso 2: Relés para bombas y lámpara
Shield de 4 relés para separar circuitos: Arduino (5V), bombas (12V), lámpara (230V). El shield se alimenta de 5V y GND del Arduino. Cada relé necesita un GPIO. Importante: mi shield activa con LOW en el pin. Al definir pin como OUTPUT, se activa automáticamente. Para apagar: poner pin en INPUT y LOW. Por defecto, pines Arduino son INPUT/LOW.
byte pump1 = 11;
byte pump2 = 10;
void setup() {
Serial.begin(9600);
while (!Serial);
pinMode(pump1, OUTPUT);
digitalWrite(pump2, LOW);
}
void loop() {
digitalWrite(pump1, HIGH); // Bomba 1 OFF
pinMode(pump2, INPUT); // Bomba 2 OFF
delay(1000);
digitalWrite(pump1, LOW); // Bomba 1 ON
pinMode(pump2, OUTPUT); // Bomba 2 ON
delay(1000);
}
Paso 3: WiFi con ESP-01
Conectar ESP8266 ESP-01 a Arduino fue lo más difícil. Conexiones: VCC=3.3V, GND=GND, CH_PD=3.3V, TX=Pin 2, RX=Pin 3. Recomendable conversor de nivel 5V→3.3V para pines 2 y 3.
Ambos microcontroladores comunican por serie. Arduino UNO usa pines 0/1 para RX/TX (también para USB), así que usamos SoftwareSerial.h en pines personalizados.
#include <SoftwareSerial.h>
SoftwareSerial espSerial(3, 2); // RX, TX
void setup() {
Serial.begin(9600);
espSerial.begin(115200); // Cambiar a 9600 tras AT+UART_DEF=9600,8,1,0,0
while (!Serial);
}
void loop() {
if (espSerial.available()) Serial.write(espSerial.read());
if (Serial.available()) espSerial.write(Serial.read());
}
Ejecutando esto, puedes enviar comandos AT desde el monitor serie. Bajé baud rate a 9600 para mayor estabilidad. Librerías útiles: WiFiEsp (consume mucha memoria), MemoryFree.
El script usa HTTP 1.0 (HTTP 1.1 incluye bytes en respuesta). Cuidado con saltos de línea tras AT+CIPSEND.
Paso 4: La caja de madera
Estructura para guardar electrónica y 3 macetas de supermercado. Medí componentes y diseñé posiciones. Madera de haya (resistente a gotas sin barniz). Círculos cortados con sierra de calar en mesa casera. Soportes de macetas pegados con silicona caliente. Lados encolados con cola D3 (resistente al agua). Sin tornillos ni clavos salvo panel inferior.
Todos los circuitos, cables y tubos dentro; sensores y tubos de depósito exterior. Antes de cerrar, añadí platillos para evitar agua en electrónica.
Paso 5: Web/API
Basada en jQuery, Bootstrap, X-editable (formularios AJAX inline) y Chart.js (gráficos), en PHP. Permite configurar Arduino (pines sensores, intervalo, bombas por planta, pines VCC) y ver humedad actual + histórico.
Configuración vía JSON para Arduino. La caja consulta ajustes al inicio y periódicamente. Para parsear JSON: librería ArduinoJson. Para intervalos: StensTimer.
Paso 6: Integración Alexa
La web provee API para Alexa: recibe JSON de Alexa, traduce a JSON personalizado para Arduino (lámpara on, regar planta 1, etc.). Arduino sondea y ejecuta acciones.
Como las peticiones de voz son complejas, implementé Alexa Skill (no Smart Home). AWS Lambda reenvía JSON a mi API, que parsea intents.
var https = require('https');
exports.handler = (event, context, callback) => {
var postData = JSON.stringify(event);
var options = {
host: '<MI-SERVIDOR>',
path: '<MI-API-ENDPOINT>',
port: 443,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': postData.length,
}
};
var postRequest = https.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('Response: ' + chunk);
callback(null, JSON.parse(chunk));
});
});
postRequest.write(postData);
postRequest.end();
};
Intents implementados (multilingüe ES/EN):
ReadHumidityIntent: "¿Cómo están mis plantas?" / "¿Cómo está mi {planta}?"IrrigatePlantIntent: "Riega mis plantas" / "Riega mi {planta} por {segundos} segundos"SwitchIntent: "Enciende/apaga la lámpara"ReadIrrigateIntent: "¿Qué plantas necesitan agua?"ReadLastIrrigationIntent: "¿Cuándo se regó por última vez mi {planta}?"
Resultado
Caja de madera para macetas de supermercado, tubos de agua y sensores en tierra, depósito externo. Comandos de voz:
- "Alexa, pregunta a herb box cómo están mis plantas" → "Planta 1 bien, Planta 2 seca..."
- "Alexa, dile a herb box que riegue mi albahaca 5 segundos" → "Regando albahaca 5 segundos"
- "Alexa, pregunta a herb box qué plantas necesitan riego" → "Planta 1 seca, Planta 3 seca..."
- "Alexa, pregunta a herb box cuándo se regó mi albahaca" → "Último riego hace 36h"
- "Alexa, dile a herb box que encienda la lámpara" → "Lámpara de cultivo encendida"
Funciones planificadas
- Modo ahorro de energía en código Arduino
- Arduinos Nano externos con comunicación 2.4GHz para más plantas (solo baterías)
- API multi-instancia para amigos
- Botón físico para riego/lámpara sin web ni Alexa
- Imágenes en tarjetas de respuesta Alexa
Actualización 23/03/2018
Nuevos intents: "Qué plantas están secas" y "Cuándo fue el último riego" (importante para futuros Nanos externos).
Código
Archivos del proyecto Arduino:
EcoActionBuffer.h/.cpp: Gestión de acciones (encender/apagar pines, temporizadores)Plant.h/.cpp: Gestión de plantas (lectura humedad, actualización API)WhiteWalnut.ino: Principal (inicialización, timers, loop)WhiteWalnutApi.h/.cpp: Comunicación WiFi/HTTP con API, parseo JSON, envío humedad, recepción acciones
Arquitectura: StensTimer para tareas periódicas (actualizar API cada 60s, leer acciones cada 1s). SoftwareSerial para ESP-01. ArduinoJson para parseo. Clases implementan IStensTimerListener.
Esquemáticos
Diagrama de comunicación e interfaces. Todos los intents implementados con respuestas (multilingüe). Parsing inicial de JSON de Alexa.
Proceso de manufactura
- Sistema de Iluminación DMX Controlado por Web – Controlador Maestro Arduino
- Construye un Spybot controlado por Bluetooth con Arduino
- SERENA: Sistema de Alarma Personalizado Arduino Mega 2560 con Pantalla TFT LCD Táctil
- Estación meteorológica compacta: Arduino Nano y ESP8266 con sensor BMP280 y pantalla OLED/Nokia LCD
- Sistema de Ventilación Inteligente para Sótanos: Control de Humedad con Arduino
- Sistema de control de asistencia RFID en tiempo real con Arduino y Google Sheets
- Shield de Programación Inalámbrica para Arduino con HC-05 Bluetooth – Sin Cable USB
- Sistema Avanzado de Alerta de Colisión con Arduino – Alertas Visuales y Sonoras para Seguridad Vehicular
- Pantalla TFT Shield de Alto Rendimiento 2.8” para Arduino Nano – Display SPI 320×240
- Shield de Reloj Nixie NCS314 para Arduino UNO/MEGA – Compatibilidad IN‑14/IN‑12
- Controlador GrowBox Arduino - Firmware y Hardware Open Source