Smart Plant Communicator: Kit Arduino MKR IoT para Jardinería Automatizada
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino MKR IoT Bundle | 1 |
Aplicaciones y servicios online
- Zapier (automatización)
- ThingSpeak API (gráficos en la nube)
Sobre el proyecto
Nota: Este tutorial podría estar desactualizado. Consulta aquí la versión más reciente.
Introducción
Como dijo el poeta William Wordsworth: "Tu mente es el jardín, tus pensamientos las semillas, la cosecha pueden ser flores o maleza". Mantener vivas las plantas es un reto: son pésimas comunicándose.
Una opción es llevarlas contigo, pero no es práctico. Tras meses intentando "hablar" con nuestra Planta Araña, usamos el MKR IoT Bundle para crear un dispositivo que monitoriza remotamente el bienestar de cualquier planta.
En resumen
Aprenderás a proteger tus plantas asegurando su supervivencia con "magia Arduino". Monitorizando humedad, temperatura y luz, garantizas su felicidad. Envía emails y gráficos diarios y notifica necesidades.
Componentes del bundle usados
- Sensor temperatura TMP36
- Fototransistor (luz)
- Sensor humedad casero (DIY)
Objetivos de aprendizaje
- Introducción a servicio Zapier
- Envío peticiones HTTP
- Gestión RTC (Reloj Tiempo Real) y alarmas
- Construcción sensor humedad DIY
- Gráficos con ThingSpeak #ProTips
- Estilizar emails con HTML/CSS #ProTips
- Probar APIs con PostMan #ProTips
¿Quieres saber más?
Este tutorial es parte de una serie de experimentos con MKR1000 e IoT. Todos usan componentes del MKR IoT Bundle: Love You Pillow, Puzzle Box, Pavlov's Cat, The Nerd, Plant Communicator.
Configurar Zapier
Zapier automatiza APIs de otras apps. Lo usaremos para enviar email con datos del Arduino. Pasos:
- Crear Zap: "Catch Hook" (Webhooks by Zapier)
- Copiar URL webhook personalizada
- Probar: añadir parámetros
?temperature=0&moisture=0&light=0&warning=0y abrir en navegador - Configurar acción "Send Email" (Gmail): destinatario, asunto, cuerpo HTML
- ¡Felicidades! Acabas de enviar una petición HTTP. El Arduino hará lo mismo pero con valores reales de sensores.
Para testing avanzado de APIs ver #ProTip PostMan al final.
Configurar la placa
Librerías necesarias: WiFi101 (Internet, escaneo redes) y RTCZero (eventos temporizados). Instalar desde Library Manager.
Para usar API de Zapier (HTTPS), subir certificados al MKR1000 (aplica a la mayoría de servicios online). Subir ejemplo FirmwareUpdater de WiFi101 y añadir dominio hooks.zapier.com.
> Examples > WiFi101 > FirmwareUpdater
Si usas Arduino Web Editor, esta función no está implementada; usa Arduino Desktop IDE.
Enviar petición HTTP
Listos para enviar desde Arduino. Valores de ejemplo que luego sustituirán sensores reales:
float temperature = 22;
int moisture = 150;
int light = 40;
String warning = "This is a warning message";
warning.replace(" ", "%20"); // Codificar espacios
La función send_email() reconstruye la URL del webhook con los parámetros y la envía al servidor Zapier.
#include <WiFi101.h>
#include <WiFiSSLClient.h>
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
String httpsRequest = SECRET_REQUEST; // Tu URL Zapier
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void setup() {
Serial.begin(9600);
while (!Serial); delay(2000);
Serial.print("Conectando WiFi: "); Serial.println(ssid);
while (WiFi.begin(ssid, password) != WL_CONNECTED) {
Serial.print("."); delay(500);
}
Serial.println("\nWiFi conectado");
}
void loop() {
float temperature = 22;
int moisture = 150;
int light = 40;
String warning = "This is a warning message";
warning.replace(" ", "%20");
send_email(temperature, moisture, light, warning);
delay(20000); // Cada 20s (¡Cuidado! Zapier gratis: 100 req/mes)
}
void send_email(float temperature, int moisture, int light, String warning) {
String _temperature = String(temperature);
String _moisture = String(moisture);
String _light = String(light);
String _warning = warning;
if (client.connect(host, 443)) {
client.println("POST " + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + " HTTP/1.1");
client.println("Host: " + String(host));
client.println("Connection: close");
client.println();
delay(1000);
while (client.available()) {
char c = client.read();
Serial.write(c);
}
client.stop();
} else {
Serial.println("Fallo conexión cliente");
}
}
RTC y Alarmas
Usar RTC del MKR1000 para email diario a hora fija. Ejemplo: hora inicial 16:00 4/12/2017, alarma diaria a 16:01. La alarma usa interrupción: no delay() dentro, usar flag booleano para actuar en loop().
#include <RTCZero.h>
RTCZero rtc;
const byte seconds = 0, minutes = 0, hours = 16;
const byte day = 4, month = 12, year = 17;
bool email_already_sent = false;
void setup() {
Serial.begin(9600); while (!Serial); delay(2000);
rtc.begin();
rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);
rtc.setAlarmTime(16, 1, 0);
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmMatch);
}
void loop() {
if (!email_already_sent) {
// send_email();
email_already_sent = true;
}
}
void alarmMatch() {
Serial.println("¡Alarma!");
email_already_sent = false;
}
Sensor humedad suelo DIY
Dos alambres en la maceta forman resistencia variable según humedad. Configuración divisor de tensión: Arduino mide voltaje proporcional a resistencia. Más humedad = menos voltaje medido. Con resistencia 1MΩ y dos alambres creamos el sensor.
Subir sketch para leer valores. Probar primero en tierra seca y anotar valor → umbral para email de emergencia.
int moisturePin = A2;
int threeshold = 800; // Calibrar según resistencia usada
void setup() {
Serial.begin(9600); while (!Serial); delay(2000);
}
void loop() {
Serial.println(get_average_moisture());
delay(5000);
}
int get_average_moisture() {
int tempValue = 0;
for (int a = 0; a < 10; a++) {
tempValue += analogRead(moisturePin);
delay(100);
}
return tempValue / 10; // Media 10 lecturas
}
Añadir sensores temperatura y luz
Esquemático adjunto. Funciones de lectura:
float get_temperature() {
int reading = analogRead(A1);
float voltage = reading * 3.3 / 1024.0;
float temperatureC = (voltage - 0.5) * 100; // 10mV/°C, offset 500mV
// float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
return temperatureC;
}
int get_light() {
return analogRead(A0);
}
#ProTip: Gráficos con ThingSpeak
ThingSpeak para gráficos bonitos. Pasos: crear cuenta, nuevo canal, 3 campos (luz, temp, humedad), obtener Write API Key. Librería ThingSpeak.h. Sketch sube valores cada minuto.
#include <WiFi101.h>
#include <WiFiSSLClient.h>
#include "ThingSpeak.h"
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
WiFiClient ThingSpeakClient;
unsigned long myChannelNumber = 356392;
const char * myWriteAPIKey = SECRET_WRITE_API;
void setup() {
Serial.begin(9600); while (!Serial); delay(2000);
// Conexión WiFi...
ThingSpeak.begin(ThingSpeakClient);
}
void loop() {
ThingSpeak.setField(1, get_light());
ThingSpeak.setField(2, get_temperature());
ThingSpeak.setField(3, get_average_moisture());
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.println("Datos enviados a nube");
delay(60000); // Cada 1 min
}
En sketch completo Pro: adjuntar subida a alarma RTC cada minuto. Gmail no permite iframes/gráficos en email, pero podemos enviar enlace a ThingSpeak en botón bonito (ver siguiente tip). Alternativas: Dweet.io, freeboard.io.
#ProTip: Estilizar tu email
Zapier permite HTML/CSS en cuerpo del email. Cambiar "Body Type" a HTML y pegar plantilla:
<!doctype html>
<html><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.container{ margin:0 10%; background:#ECF1F1; min-height:100%; padding:5% 0 10%; font-family:monospace; letter-spacing:2px; }
.title{ text-align:center; color:#0CA1A6; font-size:1.5em; padding-top:0.2vh; }
.subtitle{ text-align:center; color:#0CA1A6; font-size:1.1em; padding:0 4% 4%; }
.data{ padding:2% 5%; margin:0 15%; background:#F7F9F9; text-align:left; color:#4E5B61; font-size:1em; font-weight:bold; }
.bttn{ padding:3%; margin:10% 25% 0; background:#00979D; text-align:center; color:#F7F9F9; font-size:1.4em; }
.disclaimer{ text-align:center; color:#DA5B4A; font-size:1.1em; font-weight:bold; margin-top:10%; }
.bttn:hover{ background:#008184; } a{ text-decoration:none; }
</style></head><body>
<div class="container">
<h2 class="title">¡HOLA!</h2>
<h4 class="subtitle">Tu actualización diaria del jardín ☘</h4>
<div class="data">♨ Temperatura: {{querystring__temperature}} C</div>
<div id="humidity" class="data">☔ Humedad: {{querystring__moisture}}</div>
<div class="data">☀ Luz: {{querystring__light}}</div>
<div class="disclaimer">{{querystring__warning}}</div>
<a href="tu_enlace_thingSpeak"><div class="bttn">VER GRÁFICO</div></a>
</div></body></html>
#ProTip: Probar API con PostMan
PostMan facilita construir URLs y ver respuestas. Pegar URL base de Zapier, añadir parámetros, enviar. Muestra respuesta y compone URL final.
Código completo
Sketch integrado con RTC, alarmas, sensores, envío email (Zapier), subida ThingSpeak, email HTML. Incluye todos los #ProTips.
Esquemático

Proceso de manufactura
- Lanzamiento de Reliable Plant: Su Guía Confiable para la Excelencia en Mantenimiento
- Mantenimiento de Planta Desmitificado: Mejores Prácticas para Industrias Modernas
- Fertilizantes: Ciencia, Producción y Futuros Sostenibles
- Circuitos integrados (CI): chips compactos y potentes que impulsan la electrónica moderna
- Kit MOSMusic: Control de Iluminación de Alta Potencia Sincronizada con Música vía MOSFET y Arduino
- Componentes Esenciales de una Taladradora: Visión General Completa
- Mantenimiento de plantas de energía: prácticas probadas para producción fiable
- Componentes Clave del Motor de Combustión Interna
- Desbloqueando valor en plantas químicas a granel: estrategias para el crecimiento
- Dominando la sintaxis de netlist SPICE: Nomenclatura de componentes, elementos pasivos y activos, y definición de fuentes
- Pronóstico IIoT 2018: Cómo las plantas inteligentes están transformando la manufactura