Tutorial sul sensore di temperatura e umidità BMP180

In questa sezione vediamo passo passo come creare un sensore di temperatura con ESP32 o ESP8266 e poi visualizzare la temperatura tramite Alexa, Google Home o SmartThings.

Prerequisiti :

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

Breve introduzione al sensore di temperatura BMP180

Il sensore BMP180 è un sensore digitale di pressione barometrica e temperatura di Bosch. Il sensore BMP180 può misurare la pressione barometrica in un intervallo da 300 a 1100 hPa (da 9000 m a -500 m sul livello del mare) con una precisione di ±0,12 hPa. Può anche misurare la temperatura in un intervallo da -40 a +85 °C con una precisione di ±2 °C. Il sensore BMP180 comunica con altri dispositivi tramite interfaccia I2C. È un sensore a basso consumo, che richiede solo 3 μA in standby.

Cablaggio del BMP180 con ESP8266

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

Nota: su ESP8266 devi usare i pin I2C.

Sinric Pro ESP8266 I2C Pins

Cablaggio del BMP180 con ESP32

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

Nota: su ESP32 devi usare i pin I2C.

Sinric Pro ESP32 I2C Pins

Sinric Pro ESP32 I2C BMP180 Wiring

Verifichiamo che il sensore di temperatura sia collegato correttamente e funzioni.

Passo 1 : Installa le librerie necessarie

  1. Installa la libreria BMP_085
  2. Installa la libreria Adafruit_Sensor
  3. Installa la libreria 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

Visualizza questo codice su GitHub Gist

Passo 1 : Crea un nuovo dispositivo in Sinric Pro

Sinric Pro create device alexa

Sinric Pro temperature sensor device notifications

Qui puoi impostare la soglia per ricevere una notifica push tramite l’app Sinric Pro quando la temperatura scende sotto o sale sopra un certo valore. Usa il Retrigger Time per impostare il ritardo tra le notifiche.

Sinric Pro copy device id

Passo 2 : Connettiti a Sinric Pro

Puoi generare il codice con la funzione Zero Code oppure scriverlo tu stesso. Se non hai esperienza di programmazione, ti consigliamo di usare la funzione Zero Code nel Portal per generare il codice, scaricarlo e caricarlo.

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

Visualizza questo codice su GitHub Gist

Ora dovresti riuscire a vedere la temperatura tramite l’app Sinric Pro

Sinric Pro App Temperature Sensor

Nota che l’app Google Home mostra il sensore di temperatura come un Thermostat, per limitazioni di Google Home.

Risoluzione dei problemi

  1. Questo tutorial riguarda il BMP180. Assicurati che non sia un modulo BME280.

  2. Errore: Could not find BMP180 sensor!. È probabile che il cablaggio non sia corretto. Puoi eseguire lo sketch I2C scanner per verificare che il sensore sia collegato correttamente.

  3. Consulta la nostra pagina comune Risoluzione dei problemi per maggiori dettagli.

Tutorial correlati

Questo documento è open source. Hai trovato un errore di battitura? Crea una issue