La Inteligencia Artificial (IA) está revolucionando la forma en que aprendemos y enseñamos, extendiendo su influencia incluso al mundo de la música. En este artículo, exploraremos cómo la IA no solo está ayudando a crear canciones, sino que también nos sirve para componer temas que tienen un propósito educativo.
Veremos algunas canciones que tratan temas de filosofía, de matemáticas o de física. Estas canciones no son sólo melodías agradables, sino herramientas de aprendizaje diseñadas para hacer que conceptos complejos sean más accesibles y atractivos.
La música y las canciones pueden ser herramientas poderosas para enseñar conceptos de matemáticas y física por varias razones:
Memorización a través del ritmo y la repetición: Las canciones suelen tener estructuras repetitivas y ritmos pegajosos que facilitan la memorización de fórmulas, reglas y conceptos. Por ejemplo, canciones que incluyen tablas de multiplicar o fórmulas físicas pueden ayudar a los estudiantes a recordarlas con mayor facilidad.
Asociación conceptual: Los conceptos abstractos de matemáticas y física pueden asociarse con melodías o letras que los simplifican. Por ejemplo, una canción sobre la segunda ley de Newton podría incluir versos que expliquen la relación entre fuerza, masa y aceleración de una manera más accesible y comprensible.
Engagement y motivación: La música es intrínsecamente motivadora. Los estudiantes a menudo encuentran más agradable aprender mediante canciones, lo que aumenta su participación y reduce la ansiedad que a veces generan las materias como las matemáticas y la física.
Desarrollo de patrones: La música y las matemáticas están intrínsecamente relacionadas a través de patrones y estructuras. Enseñar conceptos matemáticos como fracciones, simetría, proporciones, o secuencias a través de la música puede hacer que estos patrones sean más visibles y comprensibles para los estudiantes.
Aplicación en problemas reales: Las canciones pueden ser utilizadas para contextualizar problemas de física y matemáticas en situaciones cotidianas. Por ejemplo, una canción sobre la gravedad puede relacionar el concepto con actividades diarias como saltar o dejar caer objetos, ayudando a los estudiantes a comprender mejor cómo se aplica la física en el mundo real.
Multisensorialidad: Aprender a través de la música involucra varios sentidos: auditivo (escuchar), visual (leer letras, ver diagramas asociados), y kinestésico (si se acompaña de movimientos). Este enfoque multisensorial puede reforzar el aprendizaje, especialmente para aquellos estudiantes que aprenden mejor a través de estímulos variados.
Aprendizaje colaborativo: Las canciones suelen ser una actividad grupal, lo que fomenta el aprendizaje colaborativo. Los estudiantes pueden trabajar juntos para interpretar, cantar o incluso crear canciones que reflejen los conceptos matemáticos o físicos, lo que refuerza su comprensión a través de la enseñanza mutua.
Aquí tienes algunas ideas de playlists creadas con IA que podrían ser útiles para distintas materias académicas. Estas listas están diseñadas para ayudar a estudiantes a aprender de manera entretenida y efectiva, utilizando canciones que podrían incluir letras educativas, ritmos que faciliten la memorización, y música que potencie el enfoque.
Matemáticas
Filosofía
Las nuevas tecnologías hacen posible esta fascinante fusión de música y educación, al mismo tiempo que representa un gran desafío para la comunidad educativa que transformará la enseñanza en el futuro.
¿Cómo podemos aprovechar la tecnología para generar material educativo atractivo y diferente?
Es muy sugerente dejarse llevar por lo que nos muestran las películas de ciencia ficción, interiorizando esa sensación, de que tarde o temprano las máquinas se revelarán contra sus creadores. Bastan unas cuantas sesiones de cine, y vemos como muchas películas basan sus argumentos en enfrentamientos entre humanos y máquinas.
Los humanos y las máquinas son dos tipos diferentes de seres, cada uno con sus propias habilidades y limitaciones. Los humanos somos seres vivos con capacidades como el pensamiento consciente, la emoción y el libre albedrío, mientras que las máquinas son creadas por el ser humano y se basan en la lógica y la programación para realizar tareas específicas. Aunque las máquinas pueden ser muy útiles y eficientes en ciertas áreas, todavía hay muchas cosas que solo los seres humanos somos capaces de hacer. Por lo tanto, no se puede decir que exista una competencia real entre los humanos y las máquinas, sino que más bien deberíamos verlas como herramientas que nos ayudan a hacer nuestro trabajo de manera más eficiente.
La inteligencia de las máquinas es un tema altamente debatido en el campo de la ciencia de la computación y la inteligencia artificial. No existe una única forma de medir la inteligencia de las máquinas, ya que esta puede manifestarse de muchas maneras diferentes y dependerá del contexto en el que se utilice la máquina. Una forma común de medir la inteligencia de las máquinas es a través del uso de tests de inteligencia artificial, que pueden evaluar su capacidad para resolver problemas, razonar, planificar, aprender y ejecutar tareas de manera autónoma. Sin embargo, estos tests tienen sus propias limitaciones y no pueden medir todos los aspectos de la inteligencia de las máquinas. En general, la forma en que se mide la inteligencia de las máquinas seguirá siendo un tema de debate en el futuro.
¿Cómo podríamos evaluar el nivel de inteligencia de las diferentes inteligencias artificiales que van apareciendo? El famoso Test de Turing fue creado como una prueba para evaluar la capacidad de una IA para hacerse pasar por un humano, utilizando como única interfaz una conversación por chat. No estamos hablando necesariamente de que la máquina sea inteligente, sino que simplemente es capaz de simular el comportamiento humano.
Por lo tanto el Test de Turing no nos vale para medir el nivel de inteligencia de las máquinas. Para poder abordar esta cuestión, tenemos que ver antes, que es la inteligencia y como la medimos en las personas.
¿Qué es la inteligencia?
Veamos algunas definiciones:
La inteligencia es la habilidad para adquirir conocimientos, pensar y razonar con eficacia, y manejarse en el entorno de modo adaptativo.
La inteligencia es la capacidad de entender, asimilar, elaborar información y utilizarla para resolver problemas y parece estar ligada a funciones mentales como percepción y memoria.
Poco nos aportan estas definiciones para medir la inteligencia. Por otro lado, ya no se habla de inteligencia como de una propiedad única, sino que hay muchos tipos de inteligencia. Howard Gardner, estudioso y profesor de la Universidad de Harvard que se dedicó a investigar las capacidades cognitivas del ser humano, presentó la teoría de las inteligencias múltiples en 1983:
Inteligencia lingüístico-verbal: habilidad para dominar el lenguaje.
Inteligencia lógico-matemática: habilidad para razonar de forma deductiva y lógica y la capacidad de resolver problemas matemáticos.
Inteligencia espacial-visual: capacidad para observar el mundo y los objetos desde distintas perspectivas para resolver problemas.
Inteligencia musical-auditiva:capacidad para componer o interpretar piezas musicales.
Inteligencia corporal-kinestésica: la habilidad para utilizar el propio cuerpo pudiendo para expresar o para moverse.
Inteligencia Intrapersonal: capacidad para entenderse a sí mismos.
Inteligencia interpersonal: capacidad para relacionarse y llevarse bien con otras personas.
Inteligencia naturalista: capacidad para clasificar y comprender elementos del medio natural (objetos, animales y plantas) para sobrevivir.
Inteligencia emocional: comprende tanto a la inteligencia intrapersonal como la interpersonal. Autoconciencia, autocontrol, automotivación, empatía y habilidades sociales.
Inteligencia colaborativa: capacidad para escoger la mejor opción para alcanzar una meta, trabajando en equipo.
Inteligencia creativa: capacidad para innovar y abordar situaciones de múltiples formas, con flexibilidad, produciendo soluciones originales.
Inteligencia existencial filosófica: capacidad para reflexionar sobre la propia existencia.
¿Cómo de inteligentes son las máquinas?
Las máquinas pueden ser muy inteligentes en ciertos aspectos, pero todavía tienen muchas limitaciones en comparación con los seres humanos. Las máquinas se basan en la lógica y la programación para realizar tareas específicas, lo que las hace muy eficientes y precisas en ciertas áreas. Sin embargo, las máquinas carecen de la capacidad de pensamiento consciente, la emoción y el libre albedrío que caracterizan a los seres humanos, lo que limita su capacidad para resolver problemas de manera creativa y adaptarse a situaciones cambiantes. En general, se puede decir que las máquinas son muy inteligentes en ciertos aspectos, pero todavía tienen mucho camino por recorrer en comparación con la inteligencia humana.
¿Y si medimos el desempeño de las máquinas en cada una de las facetas de la inteligencia descritas para las personas? De forma específica, las máquinas ya manifiestan aptitudes sorprendentes en muchas de las dimensiones de la inteligencia. Para responder a la pregunta de cómo de inteligentes son las máquinas vamos a analizar cada una de estas dimensiones.
Tipos de inteligencia desarrollada por las máquinas
Las máquinas pueden desarrollar diferentes tipos de inteligencia, dependiendo del contexto en el que se utilicen y de la forma en que estén programadas. Algunos de los tipos de inteligencia que las máquinas pueden desarrollar incluyen:
Inteligencia colaborativa
Los cobots son robots diseñados para trabajar de manera colaborativa con los seres humanos en lugar de reemplazarlos. Los cobots suelen ser diseñados para ser más pequeños y menos potentes que los robots industriales tradicionales, y suelen tener sistemas de seguridad incorporados para evitar lesiones a las personas que trabajan junto a ellos. Los cobots se utilizan en una variedad de aplicaciones, como la manipulación de objetos pequeños en la industria de la electrónica, el empaquetado de alimentos y la fabricación en general. Los cobots pueden ayudar a los seres humanos a aumentar su eficiencia y a realizar tareas que son difíciles o peligrosas para ellos, como trabajar en entornos poco amigables o repetitivos.
Inteligencia creativa
La creatividad se refiere a la capacidad de producir ideas o trabajos originales y valiosos, y es una cualidad muy difícil de medir y reproducir en una máquina. Sin embargo, hay algunos ejemplos de máquinas que han demostrado cierta capacidad para la creatividad, como DALL-E 2 o Stable Diffusion.
En este campo, al igual que en la generación de imágenes sintéticas está habiendo una gran revolución impulsada por los grandes modelos de Inteligencia Artificial. Merece especial atención el nuevo modelo de GPT-3 entrenado especialmente para la conversación. Es impresionante y lo puedes probar aquí.
Adicionalmente a la generación de texto, encontramos herramientas como Whisper que nos permiten implementar soluciones de reconocimiento de voz. Whisper es un sistema de reconocimiento automático de voz (ASR) entrenado en 680.000 horas de datos supervisados multilingües y multitarea recopilados de la web. El uso de un conjunto de datos tan grande ofrece un mejor comportamiento con los acentos, el ruido de fondo y el lenguaje técnico. Además, permite la transcripción simultánea en varios idiomas, así como la traducción de esos idiomas al inglés.
Inteligencia lógico-matemática
Problemas clásicos de primaria son fácilmente resolubles por una máquina.
Aumentamos un poco el nivel, y probamos con problemas de 6º de Primaria. Vemos que aun siendo un problema sencillo, la máquina no consigue expresar un resultado. En cualquier caso es interesante como desarrolla una respuesta indicando lo que necesita obtener para calcular la respuesta correcta.
Probamos con el mismo problema con el otro modelo de IA. En este caso, el sistema nos dará una respuesta siempre, aunque esta no sea correcta. Esto nos lleva a plantearnos la siguiente cuestión. ¿Qué ocurre con verificación de los resultados que empezará a ofrecer la IA con cada vez más frecuencia? ¿Quién verificará que las respuestas son correctas? ¿Qué ocurrirá con la confianza en la idoneidad de las respuestas o de los contenidos generados automáticamente cuando estos sean indistinguibles de los contenido generados por una persona?
En este último ejemplo vemos que la máquina se está equivocando de nuevo al no entender que tiene que hacer algunos cálculos intermedios.
Pero si le planteamos el problema al nuevo modelo de Chat GPT-3, fijaros lo que es capaz de hacer. Le ha costado unos 3 segundos resolver un problema matemático de los que se plantean en nuestras escuelas a niños de 10 años y lo hace además argumentando perfectamente los pasos que ha dado para resolverlo.
Inteligencia espacial
La inteligencia espacial es una forma de inteligencia que se refiere a la habilidad de percibir, imaginar y manipular objetos en espacio. Las personas con alta inteligencia espacial tienen una buena capacidad para comprender y representar objetos en tres dimensiones, lo que les permite, por ejemplo, resolver problemas de geometría y navegar en espacios complejos. La inteligencia espacial también es importante en actividades como la lectura de mapas, el diseño de edificios y la conducción de vehículos.
En este campo, a las máquinas les queda mucho terreno por recorrer, pero si nos fijamos en lo que están consiguiendo ya en espectáculos de drones con luces, creando escenas impresionantes, está claro que en pocos años, también en esta dimensión de la inteligencia nos superarán ampliamente.
Inteligencia musical
Hace algunos años empezaron a surgir ejemplos de composiciones musicales creadas de forma artificial. En el siguiente video podemos ver un ejemplo de video musical creado siguiendo el estilo de los Beatles:
Hoy día encontramos servicios como AIVA, que nos ofrecen la posibilidad de crear música de forma muy sencilla.
En la creación artística, las máquinas han conseguido aprender el sentido de la estética y los patrones que asociamos con la belleza y con la harmonía. Pero cuando se trata de emocionar o de transmitir algún sentimiento, todavía no alcanzan los resultados que hemos conseguido los humanos. La capacidad de poner la piel de gallina o de emocionar hasta conseguir hacer saltar las lágrimas es algo que todavía no está al alcance de las máquinas. ¿Cuándo crees que veremos el primer éxito musical creado totalmente de forma artificial? Yo creo que no falta tanto y que en pocos años lo veremos hecho realidad.
Inteligencia corporal-cinestésica
La inteligencia corporal es una forma de inteligencia que se refiere a la habilidad de utilizar el cuerpo para expresarse y resolver problemas. Las personas con alta inteligencia corporal tienen una buena coordinación, equilibrio y destreza física, lo que les permite, por ejemplo, bailar, jugar deportes y realizar tareas manuales. La inteligencia corporal también se relaciona con la capacidad de sentir y controlar las emociones a través del lenguaje corporal y el contacto físico. Esta forma de inteligencia es importante en áreas como el teatro, la danza y la educación física.
Son ampliamente conocidos los videos de Boston Dynamics en los que vemos como robots cada vez más sofisticados, caminan, saltan, hacen piruetas o realizan trabajos sencillos
No es comparable lo que consiguen los robots con lo que podemos hacer los humanos en un teatro lleno de espectadores disfrutando con un ballet o con cualquier tipo de espectáculo. La danza puede ser una forma hermosa de expresión artística que combina el movimiento corporal, la música y el ritmo. Los bailarines pueden crear una gran variedad de efectos visuales y emocionales mediante el uso de diferentes movimientos, estilos y técnicas. La belleza de la danza está en su capacidad para transmitir emociones, contar historias y crear conexiones entre las personas a través del lenguaje del cuerpo. Esto, todavía, no lo pueden hacer los robots.
Os animo a ver el siguiente video en el que los alumnos del conservatorio de Mariemma preparan la actuación de final de curso. El sentimiento y la capacidad de combinar de elementos para crear un espectáculo de este tipo, no están al alcance de las máquinas.
Tipos de inteligencia todavía no desarrollada por las máquinas
Como hemos visto, las máquinas empiezan a ser plenamente competentes en campos que antes eran impensables o simplemente formaban parte de la ciencia ficción. Todavía no hay ninguna entidad artificial que sea capaz de orquestas todas estas capacidades con la adaptabilidad de los seres humanos, pero vemos como de forma separada empiezan a despuntar en muchos campos.
Los reductos en los que las máquinas todavía no demuestra cierta competencia son los relacionados con la inteligencia intrapersonal (capacidad para entenderse a sí mismos), la inteligencia interpersonal (capacidad para relacionarse y llevarse bien con otras personas) o la inteligencia emocional, entendida como autoconciencia, autocontrol, automotivación, empatía y habilidades sociales. Este tipo de inteligencia podría estar ya abordado por las máquinas, cuando nos hacen por ejemplo, detección de emociones.
La inteligencia existencial (capacidad para reflexionar sobre la propia existencia) es quizás la última frontera antes de que las máquinas adquieran capacidades de inteligencia realmente comparables con la humana. Mientras tanto veremos como surgen nuevas herramientas inteligentes cada vez más sofisticadas, aunque como hemos visto, el listón lo hemos puesto realmente alto. Las máquinas inteligentes, no son una amenaza, son una herramienta más que tenemos que aprender a utilizar y una gran oportunidad para acelerar el progreso.
Desque que aparecieron los grandes modelos de tipo GPT-3, asistimos a una revolución en la generación de contenidos sintéticos. La aceleración del proceso creativo y la exploración de nuevas formas de arte ya es una realidad. Amenaza para algunos, oportunidad para otros, lo que está claro es que esta nueva herramienta cognitiva ha venido para quedarse.
Anteriormente vimos como generar retratos de Lorca, o como generar una historia con openai. Incluso probamos como escribir un pequeño ensayo sobre el metaverso. Vamos a experimentar con la generación de imágenes sintéticas para evaluar su aplicación para ilustrar poemas usando como entrada el texto de cada verso junto con alguna indicación del estilo de las imágenes a generar.
NOCHE DEL AMOR INSOMNE
(Federico García Lorca)
Noche arriba los dos con luna llena, yo me puse a llorar y tú reías. Tu desdén era un dios, las quejas mías momentos y palomas en cadena.
Noche abajo los dos. Cristal de pena, llorabas tú por hondas lejanías. Mi dolor era un grupo de agonías sobre tu débil corazón de arena.
La aurora nos unió sobre la cama, las bocas puestas sobre el chorro helado de una sangre sin fin que se derrama.
Y el sol entró por el balcón cerrado y el coral de la vida abrió su rama sobre mi corazón amortajado.
El arte siempre ha estado muy ligado a la tecnología del momento influyendo en las artes plásticas. El arte en la prehistoria ha perdurado hasta nuestros días en los dibujos y marcas realizados en cuevas. Las matemáticas influyeron en la creación de pinturas con perspectiva durante El Renacimiento y desde que se inventó la fotografía, de nuevo, la pintura, con el impresionismo se reinventó mostrando nuevas formas de mostrar la realidad.
Ahora, con la aparición de los grandes modelos de Inteligencia Artificial, quizás nos toque volver a vivir un nuevo movimiento creativo, en el que los contenido sintéticos se mezclan con las ideas creativas de los artistas, en el que la técnica se libera de las limitaciones que impone el hecho de dominar una serie de destrezas que no todo el mundo puede o ha podido desarrollar.
Ya no es necesario saber dibujar para iniciarse en el proceso creativo. Las ideas pueden hacerse realidad en cuestión de segundos, utilizando las herramientas que hoy están a disposición de todos. Open AI, Dall-e 2, Stable Diffusion y muchos otros que surgirán en los próximos meses o incluso semanas, viendo al ritmo que están proliferando.
Veamos el resultado aplicado a la generación de retratos del poeta con más influencia y popularidad de la literatura española del siglo XX, Federico García Lorca.
Todos estos retratos han sido generados por el modelo de Inteligencia Artificial Stable Diffusion utilizando el siguiente prompt:
prompt = «portrait Anime Federico García Lorca cute-fine-face, pretty face, realistic shaded Perfect face, fine details. realistic shaded lighting by Ilya Kuvshinov Giuseppe Dangelico Pino and Michael Garmash and Rob Rey, IAMAG premiere, aaaa achievement collection, elegant freckles, fabulous machine»
Texto utilizado para generar los retratos de Lorca con el modelo Stable Diffusion
Como habrás podido ver, no todas las imágenes tienen un parecido con el poeta granadino, pero sí que todas ellas tienen una serie de rasgos característicos, el pelo oscuro y las cejas abundantes. Tengamos en cuenta que estas imágenes no existían antes de ejecutar el modelo.
Las hemos creado a partir de un texto con el que expresamos que queremos un retrato del también dramaturgo Federico, siguiendo un estilo pictórico determinado (Picasso, Anime, Digital Art, impresionismo romántico…). En pocos minutos podemos generar decenas de imágenes para seleccionar las que se adapten mejor a lo que estemos buscando para luego afinar mejor nuestra idea o proyecto.
Vamos a construir un sistema de riego automático con Arduino controlado por voz a través de Alexa.
Gracias a todo el contenido que muchas personas comparten en Internet, he podido introducirme en el mundo del IoT. Quiero agradecer con mi humilde contribución, la generosidad de todos aquellos que ayudan a los demás compartiendo su conocimiento.
¿En qué consiste el proyecto?
La mejor forma de aprender en esto del IoT es marcarse un reto y empezar a buscar soluciones, investigando y leyendo sobre todas las materias que necesitas para llevarlo a cabo.
El reto que vamos a abordar, es el de construir un sistema de riego automático para unas jardineras. El sistema consiste en unos sensores de humedad de suelo, un dispositivo ESP8266 y una pequeña bomba de agua que se acciona cuando la humedad del suelo es muy baja.
El sistema está conectado a Internet a través de WiFi, de forma que podamos consumir un servicio MQTT con el que poder controlar los parámetros básicos del sistema de forma remota. Además escribimos en una base de datos de ThingSpeak todas las lecturas de los sensores de humedad para poder visualizar en todo momento el estado del sistema de riego.
Finalmente configuramos Alexa para poder accionar el riego y pararlo en cualquier momento o incluso usar las skills de Alexa para programar el horario y la duración de los períodos de riego.
Los sensores de humedad son muy poco fiables y tienen muchas variaciones en las medidas. Esto complica enormemente encontrar el valor correcto con el que determinar cuando la tierra no tiene humedad para activar la bomba de agua. Un valor muy alto implicará que la bomba no se activará nunca y un valor demasiado bajo podría llevarnos a que la bomba riegue demasiado.
Para evitarlo, usamos 4 sensores distribuidos por la jardinera de forma que calculamos la media de las 4 medidas. Para tomar las medidas de cada sensor, realizamos a su vez varias lecturas cada pocos milisegundos para minimizar el efecto del ruido de este tipo de sensores.
La lectura de la humedad del suelo varía incluso en función de la humedad relativa del aire o en función de la incidencia del sol en la tierra. Esto también dificulta encontrar el valor correcto de humedad en el que se debe disparar la bomba de agua. Fijar este valor en el código es bastante tediosa, ya que cada vez que tengas que cambiarlo te obliga a compilar y cargar de nuevo el código en el ESP8266.
La solución a este problema la encontramos usando un servidor MQTT. En mi caso he usado Adafruit por ser gratuito. Implemento un feed para definir el límite de humedad por encima del cual se debe accionar la bomba de agua y otro para implementar el tiempo de riego medido en segundos. Con estos dos valores puedo controlar el funcionamiento de todo el sistema.
Componentes
Empecemos por recopilar los componentes que necesitamos para desarrollar el sistema:
En el siguiente diseño esquemático puedes ver las conexiones del sistema. La alimentación a 5V está proporcionada por un cargador reciclado.
Aunque el diseño es sencillo, es aconsejable probar por partes el circuito.
Antes de usar el multiplexor, puedes probar el diseño configurando un solo sensor de humedad, que deberá ir en la única entrada analógica que dispone el ESP8266.
Configuración de la conexión con ThingSpeak
ThingSpeak™ es un servicio de plataforma de análisis de IoT que le permite agregar, visualizar y analizar flujos de datos en tiempo real en la nube. ThingSpeak proporciona visualizaciones instantáneas de los datos publicados por sus dispositivos en ThingSpeak. Con la capacidad de ejecutar código MATLAB® en ThingSpeak, puede realizar análisis y procesamiento en línea de los datos a medida que ingresan. ThingSpeak se usa a menudo para la creación de prototipos y la prueba de concepto de sistemas IoT que requieren análisis.
Empecemos con la creación del canal:
Una vez que te hayas registrado, ve a la sección My Channels para crear una canal nuevo.
2. Escribe el nombre que quieras para tu canal junto con una pequeña descripción. A continuación indican los campos que vamos a rellenar desde nuestro sistema de riego. Es importante que mantengas estos nombres. En el caso de que quieras cambiarlos, deberás ajustar el código en consecuencia.
3. Una vez creado el canal, ve a la sección API Keys y copia los valores del Channel ID y de la Write API Key. Los necesitarás para configurar el código más adelante.
// Variables para definir la conexión con ThingSpeak
unsigned long myChannelNumber = 1234567; //Código de canal de Things Speak
const char * myWriteAPIKey = "API_KEY"; // Indicar aquí el código de escritura de ThingSpeak
4. Por último, ve a la sección privada para componer la visualización de los datos según tus preferencias.
Configuración de la conexión con Adafruit IO
Para poder manejar nuestro sistema de riego, vamos a usar un servidor MQTT publicado con Adafruit.
Vamos a definir dos variables, una a la que llamaremos humedad y que nos permitirá configurar el nivel de humedad con el que queremos activar la bomba. Recuerda que valores altos, indican una humedad más baja.
La otra variable, que llamaremos tiempo_de_riego, la usaremos para poder configurar el tiempo de riego antes de parar la bomba y volver a consultar los valores de humedad. Esto veréis que os dará mucho juego para poder configurar el riego como queráis. Es importante que no pongas un tiempo de riego muy elevado para evitar que se queme la bomba.
Una vez que tengas creadas las dos variables (las variables, se llaman Feed en Adafruit), busca la información acerca del MQTT Key, que lo necesitarás también en el código.
Una vez tengas las cadenas de MQTT Key, pulsa sobre el icono de la llave sobre fondo amarillo para activar el token de acceso seguro. Recuerda mantener estos valores en un lugar seguro. Copia de esta pantalla, el username y la active key.
Por último configura un dashboard para poder configurar las dos variables de humedad y tiempo_de_riego de forma fácil.
Truco: Puedes hacerte un acceso directo a este dashboard en tu móvil para poder ajustar los valores del sistema de riego cuando quieras.
Con esto lo tendremos todos para probar el código. Lo que haremos será suscribirnos a estos dos canales MQTT de forma que nuestro sistema lea los valores de configuración para humedad y tiempo de riego.
Código
A continuación tienes el código completo, pero recuerda que es mejor que vayas montándolo por partes, para asegurarte que todo va encajando bien, el hardware y las conexiones con ThingSpeak y Adafruit.
#include <ESP8266WiFi.h>; // Para la conexión WiFi
#include "ThingSpeak.h" // Para enviar los datos a ThingSpeak
#include <DHT.h>
#include "Adafruit_MQTT.h" // Para conectar con
#include "Adafruit_MQTT_Client.h"
// Definición de parámetros para servidor MQTT de Adafruit
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_NAME "AIO_NAME" // Sustituir por vuestra cuenta de Adafruit IO
#define AIO_KEY "/feeds/humedad"
#define AIO_PASS "AIO_PASS" // Sustituir por la password de Adafruit IO
#define MAXSUBSCRIPTIONS 5
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_NAME, AIO_PASS);
Adafruit_MQTT_Subscribe limite_humedad = Adafruit_MQTT_Subscribe(&mqtt, "JacoboAriza/feeds/humedad");
Adafruit_MQTT_Subscribe tiempo_de_riego = Adafruit_MQTT_Subscribe(&mqtt, "JacoboAriza/feeds/tiempo_de_riego");
Adafruit_MQTT_Publish humedad_mqtt = Adafruit_MQTT_Publish(&mqtt, "JacoboAriza/feeds/humedad/get");
Adafruit_MQTT_Publish riego_mqtt = Adafruit_MQTT_Publish(&mqtt, "JacoboAriza/feeds/tiempo_de_riego/get");
// Usuarios y claves para la conexión WiFi
char ssid[] = "NOMBRE_WIFI_01"; //SSID - Red WiFi a la que me conecto
char pass[] = "PASSWORD_WIFI_01"; // Passowrd de la red WiFi
String ssis2 = "NOMBRE_WIFI_02"; //SSID - Red WiFi a la que me conecto
String pass2 = "PASSWORD_WIFI_02"; // Passowrd de la red WiFi
String ssid3 = "NOMBRE_WIFI_03"; //SSID - Red WiFi a la que me conecto
String pass3 = "PASSWORD_WIFI_03"; // Passowrd de la red WiFi
// Variables para definir la conexión con ThingSpeak
unsigned long myChannelNumber = 1234567; //Código de canal de Things Speak
const char * myWriteAPIKey = "API_KEY"; // Indicar aquí el código de escritura de ThingSpeak
// Variables a definir según la configuración deseada
const int numero_de_sensores = 4; // Número de sensores de humedad
const int numero_de_medidas = 10; // Número de medidas para hacer la media
int motorPin = 14;
int limite_medida = 900;
int tiempo_de_riego_maximo = 60;
int entrada_sensor_humedad = A0; // Entrada analógica con las entradas de los sensores de humedad.
int multiplexor[4] = {5,4,0,2};
int sensores[4][numero_de_sensores] = {{0,0,0,0},{1,0,0,0},{0,1,0,0},{1,1,0,0}};
float medidas[numero_de_sensores];
String texto = "";
float value_1 = 0;
float valor = 0;
String value = "";
// --------------------------------------------------------------------------------------------- //
// Descripción: Parametrización inicial //
// --------------------------------------------------------------------------------------------- //
void setup() {
pinMode(entrada_sensor_humedad, INPUT);
pinMode(motorPin, OUTPUT);
pinMode(multiplexor[0], OUTPUT);
pinMode(multiplexor[1], OUTPUT);
pinMode(multiplexor[2], OUTPUT);
pinMode(multiplexor[3], OUTPUT);
Serial.begin(9600);
digitalWrite(motorPin, HIGH);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
internet();
mqtt.subscribe(&limite_humedad);
mqtt.subscribe(&tiempo_de_riego);
}
// --------------------------------------------------------------------------------------------- //
// Descripción: Función principal //
// --------------------------------------------------------------------------------------------- //
void loop() {
// Nos conectamos al servidor MQTT donde tenemos los parámetros de configuración que regulan el riego:
// 1. Límite de humedad para accionar la bomba.
// 2. Número de segundos en los que se activa la bomba en cada ciclo.
MQTT_connect();
// Este bloque de código sirve para forzar que la lectura posterior siempre se realice.
Serial.println ("Leyendo variables...");
if (! humedad_mqtt.publish(0)) {
Serial.println(F("Failed"));
} else {
Serial.println(F("OK!"));
}
// Leemos el último valor publicado
Adafruit_MQTT_Subscribe * subscription;
while (subscription = mqtt.readSubscription(5000)) {
if (subscription == &limite_humedad)
{
Serial.print("Límite: ");
texto = ((char *) limite_humedad.lastread);
limite_medida = texto.toInt();
Serial.println(texto);
}
}
// Este bloque de código sirve para forzar que la lectura posterior siempre se realice.
if (! riego_mqtt.publish(0)) {
Serial.println(F("Failed"));
} else {
Serial.println(F("OK!"));
}
while (subscription = mqtt.readSubscription(5000)) {
if (subscription == &tiempo_de_riego)
{
Serial.print("Tiempo de riego: ");
texto = ((char *) tiempo_de_riego.lastread);
tiempo_de_riego_maximo = texto.toInt();
Serial.println(texto);
}
}
// Ping al servidor para mantener la conexión mqtt activa
if (!mqtt.ping())
{
mqtt.disconnect();
}
Serial.println("___________");
// Comenzamos con las lecturas de los sensores y con el cálculo de cada medida
float medida = 0;
float media_de_las_medidas = 0;
for (int i = 0; i < numero_de_sensores; i++){
for (int j = 0; j < 4; j++){
digitalWrite(multiplexor[j],sensores[i][j]); // Escribimos la codificación asociada a cada sensor para solicitar la medida al multiplexor.
}
medida = 0; // inicializamos la medida
for (int m = 0; m < numero_de_medidas; m++){ // Para establecer cada medida, hacemos 10 lecturas y calculamos la media
valor = analogRead(entrada_sensor_humedad);
medida = medida + valor;
}
medida = medida / numero_de_medidas;
media_de_las_medidas = media_de_las_medidas + medida;
medidas[i] = medida; // vamos escribiendo en la matriz de medidas todas los valores calculados
Serial.print("i:");
Serial.print(i);
Serial.print(", valor:");
Serial.println(medida);
delay(2000);
}
// Esperamos 8 segundos antes de subir los datos a ThingSpeak, de forma que no saturemos al servidor.
delay(8000);
subir_datos(medidas);
// Calculamos la medida de las medidas de los sensores
media_de_las_medidas = media_de_las_medidas / numero_de_sensores;
// A continuación verificamos las variables definidas en el servidor MQTT
Serial.print ("Verificando límite de humedad. Límite de medida: ");
Serial.println (limite_medida);
// Si la media de las medidas es mayor que el límite fijado en el servidor MQTT, accionamos la bomba por el tiempo definido.
if (media_de_las_medidas > limite_medida){
Serial.print ("Iniciando el riego durante ");
Serial.print (tiempo_de_riego_maximo);
Serial.println (" segundos...");
digitalWrite(motorPin, LOW); // Activamos el relé que acciona la bomba.
delay(tiempo_de_riego_maximo*1000);
}
digitalWrite(motorPin, HIGH); // Desactivamos el relé de la bomba.
if (WiFi.status() != WL_CONNECTED){ // Si el módulo se desconecta de la red WiFi, lo intentamos de nuevo.
internet();
}
}
// --------------------------------------------------------------------------------------------- //
// Descripción: Función para conectarse a la red WiFi //
// Nota: Durante las pruebas observé desconexiones frecuentes. Por este motivo he añadido la //
// opción de ir alternando entre dos de las redes WiFi que tengo en casa. Por favor ajustar //
// esta función según las necesidades particulares de cada uno. //
// --------------------------------------------------------------------------------------------- //
void internet()
{
int intentos = 0;
int intercambia = 0;
Serial.println("Iniciando conexión: ");
if (WiFi.status() != WL_CONNECTED)
{
while (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid, pass);
delay(5000);
Serial.print(".");
if (intercambia == 0){
char ssid[] = "MIWIFI_2G_TJYY_EXT"; //SSID - Red WiFi a la que me conecto
char pass[] = "DR32Uy6T"; // Passowrd de la red WiFi
intercambia = 1;
}else{
char ssid[] = "devolo-029"; //SSID - Red WiFi a la que me conecto
char pass[] = "WYKPYBLHGUASQNFA"; // Passowrd de la red WiFi
intercambia = 0;
}
}
Serial.println("");
Serial.println("WiFi conectado");
}
}
// --------------------------------------------------------------------------------------------- //
// Descripción: Función para subir los datos al servidor de ThingSpeak. Subimos las 4 medidas //
// de los sensores de humedad más la media de dichas medidas. //
// --------------------------------------------------------------------------------------------- //
void subir_datos(float medidas[numero_de_sensores]){
int canal = 0;
float media = 0;
media = 0;
for (int i=0; i < numero_de_sensores; i++){ // En los canales del 1 al 4 almacenamos las medidas de los sensores
canal = i+1;
media = media + medidas[i];
ThingSpeak.setField(canal,medidas[i]);
}
media = media / numero_de_sensores;
ThingSpeak.setField(5,media); // Calculamos la media de las medidas
// Hacemos un primer intento de subir los datos. Al usar una cuenta gratuita tenemos limitación sobre la velocidad a la que podemos subir información.
// En el caso de que falle, probamos pasados 2 segundos.
int mensaje = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (mensaje == 200){
Serial.println("Canal actualizado correctamente.");
}
else{
delay(2000);
if (mensaje == 200){
Serial.println("Canal actualizado correctamente.");
}
else{
Serial.println("Problema actualizando el canal. Código de error HTTP " + String(mensaje));
}
}
}
// --------------------------------------------------------------------------------------------- //
// Descripción: Función para conectarse al servicio MQTT de Adafruit IO //
// --------------------------------------------------------------------------------------------- //
void MQTT_connect()
{
int8_t ret;
// Si ya estamos conectados, salimos de la función.
if (mqtt.connected())
{
return;
}
Serial.print("Conectándose al servidor MQTT... ");
uint8_t retries = 3; // definimos un número máximo de 3 intentos
while ((ret = mqtt.connect()) != 0)
{
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Reintentando la conexión con el servidor MQTT en 5 segundos...");
mqtt.disconnect();
delay(5000); // espera de 5 segundos
retries--;
if (retries == 0)
{
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT conectado!");
}
Montaje
Así es como queda finalmente:
El montaje de las cajas estancas es gracias a Ángel y a su impresora 3D. Os animo a visitar su página que contiene proyectos muy interesantes sobre Arduino y con la Alhambra FPGA.
Configuración de la conexión con Alexa
Ya lo tenemos todo funcionando y ahora, ¿por qué no conectar nuestro sistema con Alexa? De esa forma podremos controlar por voz nuestro sistema de riego.
Para ello necesitaremos configurar un pequeño servicio con IFTTT y con el a su vez podremos configurar las skills de Alexa según nuestras necesidades. Yo lo utilizo para poder regar cuando lo necesite simplemente diciendo «Alexa, riega las plantas». También para configurar el riego de forma automática en los días que quiera, por la duración que necesite y a la hora deseada.
Básicamente nos conectaremos con Alexa a nuestro servidor MQTT definido en Adafruit IO a través de IFTTT, de forma que cambiemos el valor de humedad con el que se activa el riego. Por ejemplo, bajando el nivel de humedad a 0, estaremos asegurando que la bomba se active y empieza a regar. Del mismo modo, cuando queremos que deje de regar, enviaremos al servidor MQTT un valor alto de humedad y nuestra bomba se parará.
Vamos primero a configurar el servicio IFTTT activando la integración con Alexa y con Adafruit:
Publicamos dos applets, uno para iniciar el riego y otro para pararlo. Estos dos applet los podrás utilizar después desde Alexa para definir las skills.
Los dos applets siguen el siguiente esquema. Si en Alexa dices una frase en particular, entonces enviamos un valor al servicio MQTT humedad definido en Adafruit:
Enviamos el valor 0 para empezar a regar:
Y el valor 900 para dejar de regar:
Una vez lo tengas conectado solo tendrás que definir la rutina que quieras:
Consejos
Durante las pruebas, me he encontrado muchos problemas. Uno de ellos aunque ahora me parece obvio es el de los vasos comunicantes. Después de cada ciclo de riego empecé a observar que el agua del depósito se vaciaba muy deprisa y siempre que comprobaba los niveles me encontraba el depósito medio vacío. Empecé a sospechar que podría ser algún problema con el código y que se me quedaba en algunas situaciones el motor encendido.
Pero no, simplemente cuando dejaba de activar la bomba, la goma de riego estaba completamente llena y según el dichoso principio de los vasos comunicantes, el agua tendía a equilibrar los niveles. Cosa que significaba que el depósito se me vaciaba justo hasta el nivel del gotero que se encontraba a mayor altura.
Es decir la bomba, aunque esté apagada no corta la conexión con el tubo del riego. ¿Cómo lo he resuelto? He colocado esta conexión en el circuito de riego, entre el depósito y las jardineras, ubicada a una altura mayor que el nivel máximo del depósito. Regulando el gotero para que salgan apenas unas gotas (lo he colocado justo encima de una de las jardineras y así no desperdicio agua), consigo romper la estanqueidad del circuito y problema resuelto.
Otro de los problema ha sido con las cajas estancas. Al estar selladas con silicona, cuando hace demasiado calor, el aire que contienen se calienta mucho y se expande, llegando a romper algunas de las juntas. Para este problema te recomiendo aplicar dos medidas: la primera es no usar una pistola de silicona caliente, sino algún otro material que resista mejor los cambios de temperatura, como silicona apta para exteriores o cualquier otro pegamento que puedas encontrar en el mercado.
La segunda medida es pintar de blanco las carcasas, de esa forma reduces mucho el calor, sobre todo si el color del hilo utilizado en la impresora 3D es de algún color muy oscuro.
Después de varios meses, es posible que el agua pudiera generar algún tipo de algas. Aprovecha cuando tengas el bidón vacío para limpiarlas, ya que pueden llegar a atorar la bomba.
Por otro lado, es posible que el cable de la bomba sea muy corto y te quede alguna soldadura sumergida debajo del agua. En este caso, si que puedes usar una pistola de silicona líquida para sellar la soldadura.
Referencias
Os dejo algunas referencias que he consultado en Internet para ir componiendo el proyecto, cachito a cachito:
En este proyecto hemos aplicado muchos conceptos que no es fácil encontrar juntos. Hablamos de conexión de un dispositivo Arduino a través de Internet, envío de información para su explotación en ThingSpeak, conexión con un servidor MQTT y control por voz a través de Alexa.
Aquí os dejo el fruto (nunca mejor dicho) de este proyecto, un montón de cosas aprendidas y una pequeña cosecha de tomates cultivados en casa. Rico, rico.
Ya hemos visto como una máquina puede generar textos con sentido de forma automática. Ahora Openai, ha liberado su nuevo modelo que se denomina dalle2 y que permite generar imágenes a partir de descripciones en lenguaje natural.
Probando Dalle 2
«Un cubo de Rubik en 4k hecho de frutas»
«Running in an apocalyptic landscape in Madrid. Digital art»
«Una pájaro tomando una cerveza en la playa en arte digital»
«Elefantes paseando en la Alhambra»
La generación de contenidos sintéticos ya es una realidad y en breve veremos como se pueden generar secuencias animadas o videos.
La generación de contenidos sintéticos combinada con el metaverso abre un campo infinito para nuevas aplicaciones y usos. Lo que vemos, oímos o leemos puede ser o no ser contenido generado por un ser humano.
El mundo del Internet de las cosas, IoT por sus siglas en inglés (Internet of Things) está al alcance de todo el mundo. Basta un poco de electrónica que se puede conseguir por pocos euros y conexión a Internet.
Con un ESP8266 y algunos sensores puedes empezar a jugar. Puedes monitorizar en tiempo real la temperatura y la humedad. En los siguientes gráficos puedes ver en tiempo real las oscilaciones de temperatura y la humedad del suelo:
Muchas personas piensan que la Inteligencia Artificial es una amenaza para nuestros puestos de trabajo. Estamos ante una nueva herramienta, que necesita por supuesto de normativas de control, pero que más que una amenaza, es un instrumento que potencia nuestras capacidades. No solo las capacidades físicas, como era el caso de las herramientas a las que estamos tan acostumbrados, como pueden ser una excavadora o una cosechadora, sino que ahora podemos potenciar nuestras capacidades cognitivas.
El siguiente ejemplo vamos a ver como un artículo completo puede ser elaborado por una Inteligencia Artificial. Simplemente he partido de la siguiente instrucción:
A partir de aquí, todo el contenido está generado por una máquina solo con la instrucción que le he indicado en lenguaje natural.
Texto generado automáticamente hablando del metaverso
«El metaverso es una realidad virtual en la que los usuarios pueden interactuar y experimentar de manera inmersiva.
A diferencia de otros mundos virtuales, el metaverso está conectado a una red global de computadoras, lo que permite que los usuarios de todo el mundo se encuentren y colaboren en el mismo espacio.
A corto plazo, el metaverso podría ofrecer una gran cantidad de oportunidades para el aprendizaje, la investigación y el desarrollo de nuevas tecnologías.
También podría ser utilizado como una plataforma para la creación de nuevos mundos virtuales, que podrían ser utilizados para el entretenimiento, la educación o el trabajo. En el futuro, el metaverso podría convertirse en la principal forma en la que la gente interactúa con la tecnología, y podría transformar la forma en la que se lleva a cabo el comercio, la educación y la investigación.
El metaverso es una idea que ha sido explorada por la ciencia ficción durante muchos años, y ahora está comenzando a convertirse en una realidad. A medida que avanzan las tecnologías de realidad virtual, se está haciendo cada vez más posible la creación de mundos virtuales inmersivos y realistas.
La clave para el éxito del metaverso será su capacidad para atraer y mantener a un gran número de usuarios, y se espera que se convierta en una plataforma muy utilizada en los próximos años.»
Podemos decir categóricamente que por ahora no. Lo único a lo que podemos aspirar de momento es a simular algunas características para crear respuestas que se parezcan a las que daría un humano. En este contexto, surgen los bots, chatbots o asistentes virtuales que nos permiten interactuar con una máquina utilizando nuestro propio idioma. Más abajo podrás hablar con una inteligencia artificial.
Cuando tenía unos 5 años, vi una serie que me marcó para siempre. Se trata de Galáctica Estrella de Combate. En esa sería salían unos robots que se llamaban Cylon que se rebelaron contra sus creadores. Es el típico argumento de muchas historias de ciencia ficción, lo sé, pero de cosas sencillas como estas, se van construyendo los sueños y las aficiones. Os dejo un enlace con algunos vídeos sobre esta fantástica serie:
He programado este asistente Cylon para que puedas jugar con él.
En el siguiente frame puedes chatear en español con la inteligencia artificial cylon. Responde a preguntas sencillas como a ¿Qué tiempo hace en Madrid?, ¿Qué es una Galaxia? o ¿Quién es Cristiano Ronaldo?. Recientemente le he incorporado el modelo GPT-3 de open.ai que muestra un comportamiento muy interesante al mantener conversaciones sobre cualquier tema.
Puedes ver otras aplicaciones de GPT-3 en este artículo (este modelo se puede usar para escribir historias sintéticas).
¡Recuerda ser amable con él!, todavía está aprendiendo. 🙂
También lo puedes usar en telegram. Escanea este código QR y prueba conversaciones interesantes con el asistente.
Pues la verdad es que una pregunta difícil de responder en pocas palabras. Podemos decir es una rama de las Ciencias de la Computación que abarca un gran número de disciplinas y de técnicas. Y como una imagen vale más que mil palabras…