Tutorial de Sensor de Temperatura e Umidade para Sensor BMP180

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. BMP180 x 1.
  3. Cabos Jumper.

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

O sensor BMP180 é um sensor digital de pressão barométrica e temperatura da Bosch. O sensor BMP180 pode medir pressão barométrica dentro de uma faixa de 300 a 1100 hPa (9000 m a -500 m acima do nível do mar) com uma precisão de ±0,12 hPa. Ele também pode medir temperatura dentro de uma faixa de -40 a +85 °C com uma precisão de ±2 °C. O sensor BMP180 se comunica com outros dispositivos usando a interface I2C. É um sensor de baixo consumo que consome apenas 3 μA em modo standby.

Fiação para BMP180 com ESP8266

ESP8266 Pino BMP180
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 BMP180 com ESP32

ESP32 Pino BMP180
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 BMP180 Wiring

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

Passo 1: Instalar bibliotecas de suporte

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

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

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 BMP180. Certifique-se de que não é um módulo BME280.

  2. Erro: Could not find BMP180 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. 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