Tutorial de sensor de temperatura y humedad para el sensor BMP180

En esta sección vamos a crear un sensor de temperatura usando ESP32, ESP8266 y luego veremos la temperatura a través de Alexa, Google Home o SmartThings.

Requisitos previos :

  1. ESP32, ESP8266 x 1.
  2. BMP180 x 1.
  3. Cables jumper.

Breve introducción al sensor de temperatura BMP180

El sensor BMP180 es un sensor digital de presión barométrica y temperatura de Bosch. El sensor BMP180 puede medir la presión barométrica en un rango de 300 a 1100 hPa (de 9000 m a -500 m sobre el nivel del mar) con una precisión de ±0,12 hPa. También puede medir la temperatura en un rango de -40 a +85 °C con una precisión de ±2 °C. El sensor BMP180 se comunica con otros dispositivos mediante la interfaz I2C. Es un sensor de bajo consumo, que solo consume 3 μA en modo de espera.

Cableado del BMP180 con ESP8266

ESP8266 Pin del BMP180
3.3V Vin
GND GND
SCL 5 (D1)
SDA 4 (D2)

Ten en cuenta que debes usar los pines I2C en el ESP8266.

Sinric Pro ESP8266 I2C Pins

Cableado del BMP180 con ESP32

ESP32 Pin del BMP180
3.3V Vin
GND GND
SCL 22
SDA 21

Ten en cuenta que debes usar los pines I2C en el ESP32.

Sinric Pro ESP32 I2C Pins

Sinric Pro ESP32 I2C BMP180 Wiring

Vamos a comprobar que la temperatura está bien cableada y funciona.

Paso 1 : Instala las librerías necesarias

  1. Instala la librería BMP_085
  2. Instala la librería Adafruit_Sensor
  3. Instala la librería Sinric Pro

Sinric Pro Install the BMP180 library

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp; // Default I2C

void setup() {
  Serial.begin(9600);

  bool status = bmp.begin();  
  if (!status) {
    Serial.println("Could not find BMP180 sensor!");
    while (1);
  } 
}
 

void loop() { 
  Serial.print("Temperature = ");
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  
  // Convert temperature to Fahrenheit
  /*Serial.print("Temperature = ");
  Serial.print(1.8 * bmp.readTemperature() + 32);
  Serial.println(" *F");*/
  
  Serial.print("Pressure = ");
  Serial.print(bmp.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Altitude (Approx) = ");
  Serial.print(bmp.readAltitude());
  Serial.println(" m");

  Serial.print("Pressure = ");
  Serial.print(bmp.readSealevelPressure());
  Serial.println(" Pa"); 

  Serial.println();
  delay(1000);
}

// Ref: https://github.com/adafruit/Adafruit-BMP085-Library/blob/master/examples/BMP085test/BMP085test.ino

Ver este código en GitHub Gist

Paso 1 : Crea un nuevo dispositivo en Sinric Pro

Sinric Pro create device alexa

Sinric Pro temperature sensor device notifications

Aquí puedes configurar el umbral para recibir una notificación push a través de la app de Sinric Pro cuando la temperatura baje por debajo o suba por encima de un valor determinado. Usa el tiempo de reactivación (Retrigger Time) para definir el retardo entre notificaciones.

Sinric Pro copy device id

Paso 2 : Conéctate a Sinric Pro

Puedes generar el código usando la función Zero Code o escribirlo tú mismo. Si no tienes experiencia con la programación, te recomendamos usar la función Zero Code del Portal para generar el código, descargarlo y flashearlo.

2.1 Código completo

#ifdef ENABLE_DEBUG
  #define DEBUG_ESP_PORT Serial
  #define NODEBUG_WEBSOCKETS
  #define NDEBUG
#endif 

#include <Arduino.h>
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
#elif defined(ESP32)
  #include <WiFi.h>
#endif

#include <Adafruit_BMP085.h>

#include "SinricPro.h"
#include "SinricProTemperaturesensor.h"

#define WIFI_SSID         ""   // Your WiFI SSID name 
#define WIFI_PASS         ""   // Your WiFi Password.
#define APP_KEY           ""   // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" (Get it from Portal -> Secrets)
#define APP_SECRET        ""   // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" (Get it from Portal -> Secrets)
#define TEMP_SENSOR_ID    ""   // Should look like "5dc1564130xxxxxxxxxxxxxx" (Get it from Portal -> Devices)
#define BAUD_RATE         115200              // Change baudrate to your need (used for serial monitor)
#define EVENT_WAIT_TIME   60000               // send event every 60 seconds

float temperature;                            // actual temperature
float humidity;                               // actual humidity
float lastTemperature;                        // last known temperature (for compare) 
 
Adafruit_BMP085 bmp;
 
void handleTemperaturesensor() {
  if (SinricPro.isConnected() == false) {
    Serial.printf("Not connected to Sinric Pro...!\r\n");
    return; 
  }

  static unsigned long last_millis;
  unsigned long        current_millis = millis();
  if (last_millis && current_millis - last_millis < EVENT_WAIT_TIME) return;
  last_millis = current_millis;
  
  float temperature = bmp.readTemperature();
  
  Serial.printf("Temperature: %2.1f Celsius\r\n", temperature);

  if (isnan(temperature)) { // reading failed... 
    Serial.printf("BME180 reading failed!\r\n");  // print error message
    return;                                    // try again next time
  }

  if (temperature == lastTemperature) {
    Serial.printf("Temperature did not changed. do nothing...!\r\n");
    return; 
  }

  SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];  // get temperaturesensor device
  bool success = mySensor.sendTemperatureEvent(temperature, -1); // send event
  if (success) {  
    Serial.printf("Sent!\r\n");
  } else {
    Serial.printf("Something went wrong...could not send Event to server!\r\n"); // Enable ENABLE_DEBUG to see why
  }

  lastTemperature = temperature;  // save actual temperature for next compare   
}


// setup function for WiFi connection
void setupWiFi() {
  Serial.printf("\r\n[Wifi]: Connecting");

  #if defined(ESP8266)
    WiFi.setSleepMode(WIFI_NONE_SLEEP); 
    WiFi.setAutoReconnect(true);
  #elif defined(ESP32)
    WiFi.setSleep(false); 
    WiFi.setAutoReconnect(true);
  #endif

  WiFi.begin(WIFI_SSID, WIFI_PASS); 

  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf(".");
    delay(250);
  }
  IPAddress localIP = WiFi.localIP();
  Serial.printf("connected!\r\n[WiFi]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}

bool onPowerState(const String &deviceId, bool &state) {
  return true; // request handled properly
}

// setup function for SinricPro
void setupSinricPro() {
  // add device to SinricPro
  SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];
  mySensor.onPowerState(onPowerState);
  
  // setup SinricPro
  SinricPro.onConnected([](){ Serial.printf("Connected to SinricPro\r\n"); }); 
  SinricPro.onDisconnected([](){ Serial.printf("Disconnected from SinricPro\r\n"); });
  //SinricPro.restoreDeviceStates(true); // Uncomment to restore the last known state from the server.
  SinricPro.begin(APP_KEY, APP_SECRET);  
}

void setupBMP180() { 
  bool status = bmp.begin();  
  if (!status) {
    Serial.println("Could not find BMP180 sensor!");
    while (1);
  } 
}

// main setup function
void setup() {
  Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n");

  setupBMP180();
  setupWiFi();
  setupSinricPro();
}

void loop() {
  SinricPro.handle();
  handleTemperaturesensor();
}

Ver este código en GitHub Gist

Ahora deberías poder ver la temperatura a través de la app de Sinric Pro

Sinric Pro App Temperature Sensor

Ten en cuenta que la app de Google Home muestra el sensor de temperatura como un termostato debido a las limitaciones de Google Home.

Solución de problemas

  1. Este tutorial es para el BMP180. Asegúrate de que no sea un módulo BME280.

  2. Error: Could not find BMP180 sensor!. Es probable que no esté bien cableado. Puedes ejecutar el sketch escáner I2C para comprobar si el sensor está bien cableado.

  3. Consulta nuestra página general de Solución de problemas para más información.

Tutoriales relacionados

Este documento es de código abierto. ¿Has visto una errata? Crea una issue