Experimento escolar · Crecimiento vegetal

¿Cómo funciona?

Este es el flujo completo del experimento LeafGuard, de la foto del celular hasta el indicador físico de Arduino.

Diagrama del flujo de LeafGuard: Celular con MacroDroid toma foto y envía correo; automatización Gmail a OpenAI Vision; base de datos con registros y fotos; OpenAI genera resumen; salidas a página web y Arduino con LCD e indicador servo

1. Celular

MacroDroid en un Samsung S23 toma una foto de la planta automáticamente cada cierto intervalo (funciona incluso con la pantalla bloqueada), borra la foto anterior para evitar duplicados, y la envía como adjunto por correo electrónico.

2. Automatización (análisis)

n8n revisa el correo cada minuto; cuando llega uno con foto, la envía a un modelo de OpenAI con visión (GPT-4o), que responde en formato JSON estructurado con el estado de las hojas (saludable/alerta/seca), humedad aparente y observaciones.

3. Base de Datos

Airtable guarda cada análisis como una fila: fecha, estado de las hojas, humedad, observaciones, y la foto original como adjunto.

4. Automatización (resumen diario)

Un segundo flujo en n8n corre una vez al día, lee todos los registros de esa fecha en Airtable, y le pide a OpenAI que genere un resumen del comportamiento del día, guardándolo en una tabla aparte.

5. Página Web

El dashboard "LeafGuard" se conecta a Airtable y muestra una bitácora diaria: cada día es una tarjeta con su resumen, que se puede desplegar para ver cada registro individual con su foto.

6. Arduino

Una laptop con un script de Python consulta el estado más reciente en Airtable y se lo manda por cable USB a un Arduino Uno, que muestra el estado en una pantalla LCD y mueve un servo con banderas de colores tipo semáforo.

Preguntas frecuentes

¿Cómo funciona la parte del celular con MacroDroid en este proyecto?

En tu proyecto, el celular funciona como la "cámara fija" del experimento, sin que tengas que tocarlo:

MacroDroid tiene una macro configurada con un trigger de intervalo (por ejemplo, cada cierto número de minutos), que dispara automáticamente sin importar si la pantalla está bloqueada — esto lo lograste ajustando la optimización de batería del Samsung S23 para que no restrinja la app.

Cuando se dispara, la macro ejecuta una acción de "Take Photo" en modo silencioso (cámara trasera, sin sonido ni interfaz visible), capturando una imagen de la planta.

Antes de tomar la foto nueva, hay un paso de "Delete File" que borra la foto anterior, para evitar que se acumulen archivos duplicados y asegurar que siempre se trabaje con la más reciente.

Finalmente, la macro usa la acción nativa "Send Email" de MacroDroid (conectada a tu cuenta de Gmail) para mandar esa foto como adjunto a un correo con asunto fijo ("Foto planta"), que es lo que después dispara el flujo de automatización en n8n.

En resumen: el celular actúa como sensor autónomo — captura, limpia el archivo anterior, y transmite — todo sin intervención manual, cada cierto intervalo de tiempo, incluso con la pantalla apagada.

¿Cómo funciona el módulo de automatización que analiza la foto de la planta?

Este módulo es el primer bloque de "Automatización" en n8n y es el que convierte la foto en datos útiles:

Gmail Trigger — revisa la bandeja de entrada cada minuto, filtrando correos con asunto "Foto planta" que tengan adjunto. Cuando encuentra uno nuevo, dispara el flujo y descarga la imagen adjunta.

Analyze image (OpenAI Vision) — envía la foto a GPT-4o con un prompt que le pide identificar el estado de la planta y responder ÚNICAMENTE en formato JSON con: nombre_comun, nombre_cientifico, estado_hojas (saludable / alerta / seca), nivel_humedad_aparente y observaciones.

Formatear Datos (Code) — busca recursivamente el JSON dentro de la respuesta del modelo (sin depender de una ruta fija), lo parsea y extrae cada campo por separado, listo para guardar.

Create a record (Airtable) — crea una fila nueva en la tabla "Table 1" con todos esos campos, más la fecha y hora en zona horaria de Panamá.

Subir Foto a Airtable (HTTP Request) — en paralelo, extrae el binario real de la imagen (base64 correcto con "Extract from File") y la sube directo al campo "Attachments" de ese mismo registro, para que la foto quede visible junto con el análisis.

En resumen: correo con foto entra → IA la analiza y estructura los datos → todo se guarda junto (datos + imagen) en la misma fila de la base de datos.

La tabla "Table 1" guarda por cada foto: Numeracion, fecha, nombre_comun, nombre_cientifico, estado_hojas, nivel_humedad_aparente, observaciones, texto_original (JSON crudo de respaldo) y Attachments.

¿Cómo funciona el módulo de automatización del resumen diario?

Este es el segundo flujo de "Automatización" en n8n, separado del que analiza cada foto, y corre solo una vez al día:

Schedule Trigger — se dispara a una hora fija (por ejemplo, 11:59 PM), en vez de reaccionar a un correo.

Airtable - Registros de Hoy — busca en la tabla "Table 1" solo los registros de esa fecha exacta, usando la fórmula IS_SAME({fecha}, TODAY(), 'day'). Trae todas las fotos analizadas durante el día.

Combinar Registros del Dia (Code) — junta todos los registros en un solo bloque de texto, listando hora, estado de las hojas, humedad y observaciones. También maneja la lectura anidada de campos para evitar problemas de estructura.

OpenAI - Generar Resumen — pasa ese texto a un modelo de OpenAI (solo texto, sin visión) y le pide un resumen breve de 3-4 oraciones sobre el comportamiento general de la planta ese día.

Airtable - Guardar Resumen — crea una fila nueva en la tabla "Resumenes_Diarios" con la fecha, el resumen generado y la cantidad de registros de ese día.

La tabla "Resumenes_Diarios" guarda por día: fecha, resumen y cantidad_registros. Es justo lo que alimenta la vista principal de la bitácora web.

¿Cómo lee la página web los datos de la base de datos?

La página web "LeafGuard" se conecta directo a Airtable usando tu token de API, y lee de las dos tablas para armar las dos capas de la bitácora:

Tabla "Resumenes_Diarios" — alimenta la vista principal. Cada fila se convierte en una tarjeta de día con la fecha, el resumen generado por IA y un indicador de color según el estado predominante.

Tabla "Table 1" — alimenta el detalle desplegable. Al abrir una tarjeta de día, la página filtra esta tabla por esa fecha exacta y muestra cada registro individual con su foto en miniatura, hora exacta, estado de las hojas, humedad y observación.

Las tarjetas de resumen (Días registrados, Registros totales, Días saludables, Último estado) se recalculan en tiempo real contra Airtable cada vez que cargas o presionas "Actualizar".

La gráfica de "montaña" (índice de salud diario: saludable=2, alerta=1, seca=0) también se calcula agrupando y promediando los registros de "Table 1" por fecha.

¿Cómo lee el Arduino los datos de la base de datos para mover el indicador servo y el LCD?

El Arduino no se conecta directamente a Airtable (un Arduino Uno no tiene WiFi), así que usas tu laptop como puente:

Script de Python en tu laptop (Windows, Python 3.13) — consulta la API de Airtable y lee específicamente el campo estado_hojas del registro más reciente en la tabla.

Ese script manda el dato al Arduino Uno por conexión USB (comunicación serial), enviando el estado que leyó.

El Arduino recibe el dato por el puerto serial y, según el valor:

• Muestra el estado en la pantalla LCD I2C 16x2 usando la librería LiquidCrystal I2C.

• Mueve el servo a la posición correspondiente, donde una varita con banderas de colores (verde/amarillo/rojo) queda apuntando según el estado.

La cadena real es: Base de Datos → Script de Python (puente) → Arduino (USB/Serial) → LCD + Servo. En el diagrama, el bloque "Arduino" representa todo ese conjunto.