En este tutorial aprenderás a realizar un panel de control con la plataforma de Adafruit IO, utilizando cómo unidad de control al ESP32 y cómo unidad de captación de datos al sensor BMP180.
Introducción
¿Qué es adafruit IO?
Es una plataforma en la nube diseñada específicamente para proyectos de Internet de las Cosas (IoT). Esta plataforma facilita la conexión de dispositivos físicos a internet y visualización de los datos que estos generan.
¿Qué hace Adafruit IO?
- Recopilación de datos: Te permite conectar una amplia variedad de dispositivos, desde Arduino y Raspberry Pi hasta sensores y actuadores, para recopilar datos en tiempo real.
- Almacenamiento de datos: Almacena los datos que recolectas en la nube, lo que te permite acceder a ellos desde cualquier lugar y en cualquier momento.
- Visualización de datos: Ofrece herramientas para crear visualizaciones personalizadas de tus datos, como gráficos, tablas y medidores. Esto te ayuda a comprender mejor lo que está sucediendo en tu proyecto.
- Control de dispositivos: Puedes utilizar Adafruit IO para controlar dispositivos remotamente, por ejemplo, encender o apagar luces, ajustar la temperatura o activar motores.
- Integración con otras plataformas: Se integra con otras plataformas y servicios populares, como IFTTT y Google Assistant, lo que te permite crear automatizaciones y controlar tus dispositivos de forma más inteligente.
Al igual que otras plataformas en la nube como Arduino Cloud cuanta con una versión de paga y una versión gratuita. Para esta practica será suficiente con las funcionalidades de la versión gratuita
Materiales
- 1 x ESP32 DevkitV1
- 1 x Sensor de presión barométrica BMP180
- 1 x Cable de datos USB C
- 1 x Cable de datos Micro USB
Diagrama de Conexión
El sensor de presión BMP-180 cuenta con 4 pines, un voltaje de alimentación a (3.3v – 5v), una tierra (GND), un serial bus clock (SCL) y un serial bus data (SDA). A continuación te mostrare las conexiones que debes realizar.
Antes de continuar, revisa las conexiones de tu circuito y asegúrate de que todo este en orden.
Requerimientos Previos
Antes de iniciar a programar lo primero que tendrás que hacer es entrar a la página oficial de Adafruit IO y crear una cuenta si no estás registrado.
Después de crear tu cuenta y de hacer la conexión, comienza con la creación de los Feeds para los parámetros de temperatura, presión sobre el nivel del mar y altitud real.
Para ello dirígete a Feeds en la cinta de opciones superior, te dirigirá a la pagina de Feeds donde debes seleccionar “New Feeds”. En el nombre coloca el nombre de alguno de los parámetros antes mencionados, luego da clic en “Create” y ¡Listo! Puedes guiarte en siguiendo el gif:
Continuaremos con la creación del panel, donde podrás visualizar:
- Temperatura ambiente o del entorno
- Presión barométrica
- Altitud aproximada
- Presión sobre el nivel del mar
- Altitud real
Para crear un nuevo Panel dirígete la opción “Dashboards” en la cinta de opciones superior, te dirigirá a una nueva pantalla en la que debes seleccionar la opción de “New Dashboard”, asígnale el nombre que prefieras y da clic en “Create”.
Antes de entrar de lleno al código, te recomiendo tener a la mano tu nombre de la red y la contraseña. Así cómo el nombre del usuario y key.
Código
Datos a modificar:
Nombre de la red y contraseña
#define WLAN_SSID “Nombre_de_tu_Internet”
#define WLAN_PASS “Password”
Nombre del usuario y key
#define AIO_USERNAME “Reemplácelo con tu nombre de usuario”
#define AIO_KEY “Reemplace con su Clave de autenticación del proyecto”
El nombre de usuario y el key lo puedes encontrar dando clic en “Adafruit IO Key” en la parte superior derecha de la página.
#include "Adafruit_MQTT.h" #include "Adafruit_MQTT_Client.h" #include <Adafruit_BMP085.h> #include <WiFi.h> float tempe,presion,alti,presion_nivel,altitud_real; float kpascal_1,kpascal_2; Adafruit_BMP085 bmp; #define WLAN_SSID "Nombre_de_tu_Internet" #define WLAN_PASS "Password" unsigned long previousMillis = 0; /************************* Adafruit.io Setup *********************************/ #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "Reemplácelo_con_tu_nombre_de_usuario" #define AIO_KEY "Reemplace_con_su_clave_de_autenticación_del_proyecto" /************ Estado global (¡no necesita cambiar esto!) ******************/ // Cree una clase ESP8266 WiFiClient para conectarse al servidor MQTT WiFiClient client; // o ... use WiFiFlientSecure para SSL //WiFiClientSecure client; // Configure la clase de cliente MQTT pasando el cliente WiFi y el servidor MQTT y los detalles de inicio de sesión. Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); /****************************** Feeds ***************************************/ // Configure un feed llamado 'onoff' para suscribirse a los cambios. Adafruit_MQTT_Publish dato1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/temp"); // FeedName Adafruit_MQTT_Publish dato2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/pres"); // FeedName Adafruit_MQTT_Publish dato3 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/altitud"); // FeedName Adafruit_MQTT_Publish dato4 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/pres-nivel"); // FeedName Adafruit_MQTT_Publish dato5 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/altitud-real"); // FeedName void MQTT_connect(); void setup() { Serial.begin(115200); if (!bmp.begin()) { Serial.println("No se pudo encontrar un sensor BMP085 válido, ¡verifique el cableado!"); while (1) {} } delay(10); // Conéctese al punto de acceso WiFi. Serial.println(); Serial.println(); Serial.print("conectado a "); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { MQTT_connect(); Serial.print("Temperature = "); tempe=bmp.readTemperature(); Serial.print(tempe); Serial.println(" °C"); if (! dato1.publish(tempe)) { Serial.println(F("Failed")); } else { Serial.println(F("OK!")); } delay(2000); Serial.print("Pressure = "); presion=bmp.readPressure(); kpascal_1=presion/1000; Serial.print(kpascal_1); Serial.println(" KPa"); if (! dato2.publish(kpascal_1)) { Serial.println(F("Failed")); } else { Serial.println(F("OK!")); } delay(2000); // Calcular altitud suponiendo barométrica 'estándar' // presión de 1013.25 milibares = 101325 Pascal Serial.print("Altitude = "); alti=bmp.readAltitude(); Serial.print(alti); Serial.println(" metros"); if (! dato3.publish(alti)) { Serial.println(F("Failed")); } else { Serial.println(F("OK!")); } delay(2000); Serial.print("Presión a nivel del mar: "); presion_nivel=bmp.readSealevelPressure(); kpascal_2=presion_nivel/1000; Serial.print(kpascal_2); Serial.println(" Pa"); if (! dato4.publish(kpascal_2)) { Serial.println(F("Failed")); } else { Serial.println(F("OK!")); } delay(2000); // puedes obtener una medición más precisa de la altitud // si conoce la presión actual del nivel del mar que // variar con el clima y tal. Si son 1015 milibares // eso es igual a 101500 pascales. Serial.print("Real altitude = "); altitud_real=bmp.readAltitude(101500); Serial.print(altitud_real); Serial.println(" metros"); if (! dato5.publish(altitud_real)) { Serial.println(F("Failed")); } else { Serial.println(F("OK!")); } delay(2000); } void MQTT_connect() { int8_t ret; // Stop if already connected. if (mqtt.connected()) { return; } Serial.print("Connecting to MQTT... "); uint8_t retries = 3; while ((ret = mqtt.connect()) != 0) { // conectar devolverá 0 para conectado Serial.println(mqtt.connectErrorString(ret)); Serial.println("Reintentando la conexión MQTT en 5 segundos ..."); mqtt.disconnect(); delay(10000); // espera 5 segundos retries--; if (retries == 0) { // basically die and wait for WDT to reset me while (1); } } Serial.println("MQTT conectada!"); }
Copia, pega, copila y carga el código al ESP32. En el panel de control deberás visualizar la temperatura qué está detectando en ese mismo instante, la presión (Kpa), altitud (metros), presión sobre el nivel del mar (Kpa) y la altitud real (metros).