Tutorial sensore di temperatura e umidità BME280
In questa sezione realizziamo un sensore di temperatura usando ESP32, ESP8266 e poi visualizziamo la temperatura tramite Alexa, Google Home o SmartThings.
Prerequisiti :
- ESP32, ESP8266 x 1.
- BME280 x 1.
- Cavetti jumper.
Breve introduzione al sensore di temperatura BME280
Il BME280 utilizza un sensore di temperatura basato sul principio della resistenza termica. Quando la temperatura cambia, cambia anche la resistenza del sensore. Il BME280 misura questa variazione di resistenza e la usa per calcolare la temperatura.
Il BME280 comunica con altri dispositivi tramite il protocollo I2C o SPI per scambiare dati con un microcontrollore.
Nota: questo tutorial riguarda il BME280, non il BMP280. Il BME280 può misurare pressione atmosferica, temperatura e umidità, mentre il BMP280 può misurare solo pressione atmosferica e temperatura.
In questo tutorial useremo il protocollo di comunicazione I2C
Cablaggio del BME280 con ESP8266
| ESP8266 | Pin BME280 |
| 3.3V | Vin |
| GND | GND |
| SCL | 5 (D1) |
| SDA | 4 (D2) |
Nota: su ESP8266 devi usare i pin I2C.

Cablaggio del BME280 con ESP32
| ESP32 | Pin BME280 |
|---|---|
| 3.3V | Vin |
| GND | GND |
| SCL | 22 |
| SDA | 21 |
Nota: su ESP32 devi usare i pin I2C.


Verifichiamo che il sensore di temperatura sia cablato correttamente e funzioni.
Passo 1 : Installa le librerie necessarie
- Installa la libreria BME280
- Installa la libreria Adafruit_Sensor
- Installa la libreria Sinric Pro

#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
Vedi questo codice su GitHub Gist
Passo 1 : Crea un nuovo dispositivo in Sinric Pro
- Accedi al tuo account Sinric Pro, apri il menu Devices a sinistra e fai clic sul pulsante Add Device (in alto a sinistra).
- Inserisci il nome del dispositivo Temperature Sensor, la descrizione My Temperature Sensor e seleziona il tipo di dispositivo Temperature Sensor.

- Fai clic su Next nella scheda 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.
-
Fai clic sulla scheda Others e poi su Save
-
La schermata successiva mostra le credenziali necessarie per collegare il dispositivo appena creato.

- Copia Device Id, App Key e App Secret. Tieni questi valori al sicuro. NON CONDIVIDERLI SU FORUM PUBBLICI!
Passo 2 : Connettiti a Sinric Pro
Puoi generare il codice usando la funzione Zero Code oppure scriverlo tu stesso. Se non hai esperienza di programmazione, ti consigliamo di usare la funzione Zero Code del Portale per generare il codice, scaricarlo e caricarlo sulla scheda.
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 <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();
}
Vedi questo codice su GitHub Gist
Ora dovresti riuscire a vedere la temperatura nell’app Sinric Pro

Nota che l’app Google Home mostra il sensore di temperatura come un termostato, per un limite di Google Home.
Risoluzione dei problemi
-
Questo tutorial riguarda il BME280. Assicurati che non sia un modulo BMP280.
-
Errore: Could not find BME280 sensor!. Probabilmente il cablaggio non è corretto. Puoi eseguire lo sketch I2C scanner per verificare che il sensore sia cablato correttamente.
-
Il BME280 per impostazione predefinita è in modalità automatica per effettuare letture continue. Questo scalda il chip e influisce sulla temperatura letta. Passa allo scenario Weather Station per letture più precise durante un funzionamento prolungato.
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 millisecondsVedi: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/advancedsettings/advancedsettings.ino
- Per maggiori dettagli consulta la nostra pagina generale di Risoluzione dei problemi.
Tutorial correlati
- Come controllare un ESP32 o ESP8266 con Alexa e Google Home
- Sensore di temperatura e umidità DHT11, DHT22, AM2302
- Sensore di temperatura DS18B20
- Sensore di temperatura BMP180
- Sensore di temperatura LM35, LM335 e LM34
Questo documento è open source. Hai trovato un errore? Crea una issue