Tutorial de sensor de temperatura y humedad BME280

En esta sección te guiamos para crear un sensor de temperatura con ESP32 y ESP8266, y después ver la temperatura a través de Alexa, Google Home o SmartThings.

Requisitos previos :

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

Introducción rápida al sensor de temperatura BME280

El BME280 usa un sensor de temperatura basado en el principio de resistencia térmica. A medida que cambia la temperatura, cambia también la resistencia del sensor. El BME280 mide este cambio de resistencia y lo usa para calcular la temperatura.

El BME280 se comunica con otros dispositivos mediante el protocolo de comunicación I2C o SPI para intercambiar datos con un microcontrolador.

Ten en cuenta que este tutorial es para el BME280, no para el BMP280. El BME280 puede medir presión del aire, temperatura y humedad, mientras que el BMP280 solo puede medir presión del aire y temperatura.

En este tutorial vamos a usar el protocolo de comunicación I2C

Cableado del BME280 con ESP8266

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

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

Sinric Pro ESP8266 I2C Pins

Cableado del BME280 con ESP32

ESP32 Pin BME280
3.3V Vin
GND GND
SCL 22
SDA 21

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

Sinric Pro ESP32 I2C Pins

Sinric Pro ESP32 I2C BME280 Wiring

Comprobemos que el sensor de temperatura está bien cableado y funciona.

Paso 1 : Instala las librerías necesarias

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

Sinric Pro Install the BME280 library

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

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // Default I2C

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

  bool status = bme.begin(0x76);  
  if (!status) {
    Serial.println("Could not find BME280 sensor!");
    while (1);
  } 
}
 

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

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

  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

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

// Ref: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/bme280test/bme280test.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 Retrigger Time para establecer el retraso entre notificaciones.

Sinric Pro copy device id

Paso 2 : Conéctate a Sinric Pro

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

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 <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.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)
float lastHumidity;                           // last known humidity (for compare)

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // Default I2C
 
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 = bme.readTemperature();
  float humidity = bme.readHumidity();

  Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", temperature, humidity);

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

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

  SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];  // get temperaturesensor device
  bool success = mySensor.sendTemperatureEvent(temperature, humidity); // 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  
  lastHumidity = humidity;        // save actual humidity 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 setupBME280() { 
  bool status = bme.begin(0x76);  
  if (!status) {
    Serial.println("Could not find BME280 sensor!");
    while (1);
  } 
}

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

  setupBME280();
  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 BME280. Asegúrate de que no se trate del módulo BMP280.

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

  3. El BME280 está, por defecto, en modo automático para tomar lecturas continuas. Esto calienta el chip y afecta a la temperatura leída. Cambia al escenario Weather Station para obtener lecturas más precisas cuando funcione durante un periodo prolongado.

Serial.println("-- Weather Station Scenario --");
Serial.println("forced mode, 1x temperature / 1x humidity / 1x pressure oversampling,");
Serial.println("filter off");
bme.setSampling(Adafruit_BME280::MODE_FORCED,
                Adafruit_BME280::SAMPLING_X1, // temperature
                Adafruit_BME280::SAMPLING_X1, // pressure
                Adafruit_BME280::SAMPLING_X1, // humidity
                Adafruit_BME280::FILTER_OFF   );
                    
// suggested rate is 1/60Hz (1m)
delayTime = 60000; // in milliseconds

Referencia: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/advancedsettings/advancedsettings.ino

  1. Consulta nuestra página general de Solución de problemas para más detalles.

Tutoriales relacionados

Este documento es de código abierto. ¿Ves un error? Por favor, crea una incidencia