InicioTarjetas de DesarrolloESP32¿Cómo hacer un panel de control con Adafruit IO, BMP180 y el...

¿Cómo hacer un panel de control con Adafruit IO, BMP180 y el ESP32?

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.

También te enseñare a realizar la conexión y a cómo programar para lograr la comunicación de ambos dispositivos. Recuerda que antes de iniciar con el tutorial debes considerar tener instalado la placa de ESP32 instalada en el IDE Arduino.

Los materiales que estaremos utilizando serán:

¿Qué es adafruit IO? Es una plataforma diseñada para visualizar, responder e interactuar con los datos de su proyecto. A demás se mantienen los datos privados (los feeds de datos son privados de forma predeterminada) y seguros. Lo grandioso de adafruit IO es que cuenta con un servidor en la nube y para poder usarlo solo debes tener internet y tendrás acceso a él.

Está destinado principalmente para almacenar y luego recuperar datos. A demás puedes construir tableros que te permitan visualizar los datos.

Algunas funciones que puedes hacer con adafruit IO son:

  • Muestra tus datos en tiempo real y en línea
  • Controle motores, lea datos de sensores conectado a Internet
  • Conecte sus proyectos a servicios web como Twitter, canales RSS, servicios meteorológicos, etc
  • Conecte su proyecto a otros dispositivos con acceso a Internet

La mejor parte es que Adafruit IO es gratuito.

El controlador que vamos a utilizar es un ESP32 DevkitV1 de 30 pines y el sensor que vamos a usar para este sistema es un BMP-180 y para programarlo utilizaremos lenguaje C.

Antes de iniciar 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, posteriormente hacer la conexión del sensor BMP180 al ESP32.

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.

Diagrama de conexión del ESP32 al BMP180

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, altitud, presión sobre el nivel del mar y altitud real. Aquí te dejo un ejemplo de cómo debes hacerlo:

Creación de los parámetros – Feeds

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
Formación del panel de control

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.

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.

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”

Código de prueba

#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).

Visualizando los datos

TUTORIALES RELACIONADOS