Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

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

Objetivos de aprendizaje

¿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:

  1. Crear Zap: "Catch Hook" (Webhooks by Zapier)
  2. Copiar URL webhook personalizada
  3. Probar: añadir parámetros ?temperature=0&moisture=0&light=0&warning=0 y abrir en navegador
  4. Configurar acción "Send Email" (Gmail): destinatario, asunto, cuerpo HTML
  5. ¡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

Smart Plant Communicator: Kit Arduino MKR IoT para Jardinería Automatizada

Proceso de manufactura

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