Tutorial de Sensor de Temperatura e Umidade para Sensor BME280

Nesta seção vamos criar um Sensor de Temperatura usando ESP32, ESP8266 e depois visualizar a temperatura via Alexa, Google Home ou SmartThings.

Pré-requisitos:

  1. ESP32, ESP8266 x 1.
  2. BME280 x 1.
  3. Cabos Jumper.

Introdução rápida ao Sensor de Temperatura BME280

O BME280 usa um sensor de temperatura baseado no princípio da resistência térmica. Conforme a temperatura muda, a resistência do sensor muda. O BME280 mede essa mudança na resistência e a usa para calcular a temperatura.

O BME280 se comunica com outros dispositivos usando o protocolo de comunicação I2C ou SPI para trocar dados com um microcontrolador.

Note que este tutorial é para BME280 e não BMP280. O BME280 pode medir pressão do ar, temperatura e umidade, enquanto o BMP280 pode medir apenas pressão do ar e temperatura.

Neste tutorial, vamos usar o protocolo de comunicação I2C

Fiação para BME280 com ESP8266

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

Note que você deve usar os pinos I2C no ESP8266.

Sinric Pro ESP8266 I2C Pins

Fiação para BME280 com ESP32

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

Note que você deve usar os pinos I2C no ESP32.

Sinric Pro ESP32 I2C Pins

Sinric Pro ESP32 I2C BME280 Wiring

Vamos verificar se a temperatura está conectada corretamente e funcionando.

Passo 1: Instalar bibliotecas de suporte

  1. Instalar a biblioteca BME280
  2. Instalar a biblioteca Adafruit_Sensor
  3. Instalar a Biblioteca 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

View this code on GitHub Gist

Passo 1: Criar um novo dispositivo no Sinric Pro

Sinric Pro create device alexa

Sinric Pro temperature sensor device notifications

Você pode definir o limite aqui para receber uma notificação push via aplicativo Sinric Pro quando a temperatura ficar abaixo ou acima de uma certa temperatura. Use o Tempo de Re-disparo para definir o atraso entre notificações.

Sinric Pro copy device id

Passo 2: Conectar ao Sinric Pro

Você pode gerar o código usando o recurso Zero Code ou escrevê-lo você mesmo. Se você não tem experiência em programação, recomendamos usar o recurso Zero Code no Portal para gerar o código, baixar e carregar.

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();
}

View this code on GitHub Gist

Agora você deve conseguir visualizar a temperatura via App Sinric Pro

Sinric Pro App Temperature Sensor

Note que o aplicativo Google Home mostra o sensor de temperatura como um Termostato devido às limitações do Google Home.

Solução de Problemas

  1. Este tutorial é para BME280. Certifique-se de que não é um módulo BMP280.

  2. Erro: Could not find BME280 sensor!. É provável que você não tenha feito a fiação corretamente. Você pode executar o sketch I2C scanner para verificar se o sensor está conectado corretamente.

  3. O BME280 por padrão está em modo automático para fazer leituras contínuas. Isso aquecerá o chip e afetará a temperatura lida. Mude para o Cenário de Estação Meteorológica para leituras mais precisas quando executando por um longo período.

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

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

  1. Consulte nossa página comum de Solução de Problemas para mais detalhes.

Este documento é código aberto. Viu um erro de digitação? Por favor, crie uma issue