Cum să utilizăm corect senzorul BME280

BME280 este un senzor digital integrat ce permite măsurarea temperaturii, umidității și presiunii atmosferice. Utilizat cu precădere în dispozitive mobile, datorită dimensiunii reduse și a consumului mic, senzorul BME280 oferă performanțe bune la un preț scăzut. Din acest motiv acest senzor este extrem de popular și este folosit în multe proiecte ce utilizează plăci de dezvoltare Arduino, ESP8266 sau Raspberry Pi. Bineînțeles, formatul LGA face ca senzorul să fie dificil de integrat în scheme electronice personale dar, din fericire, există disponibile componente brick / breakout ce permit conectarea simplă la o placă de dezvoltare în montaje bazate pe breadboard și fire de interconectare (de exemplu, SparkFun Atmospheric Sensor Breakout – BME280).

1

Pentru comunicația cu o placă de dezvoltare senzorul permite conectarea prin intermediul magistralei I2C sau, alternativ, prin intermediul magistralei SPI. Având în vedere faptul că senzorul funcționează la 3.3V, conectarea prin intermediul magistralei I2C se poate face fără probleme cu o placă ce funcționează la 5V (Arduino Uno, Arduino Leonardo) dar, în cazul magistralei SPI, necesită adaptor a nivelurilor logice 3.3V <-> 5V. Pentru plăcile ce funcționează la 3.3V (Adafruit Feather, NodeMCU, Raspberry Pi) nu există nici un fel de problemă. Pentru mai multe detalii legate de conectarea senzorului la diverse plăci de dezvoltare se poate parcurge materialul „SparkFun BME280 Breakout Hookup Guide”.

3

Ușurința conectării și disponibilitatea unei biblioteci de lucru cu acest senzor ne face să ignorăm complexitatea funcționării acestuia. De cele mai multe ori preluăm codul dat ca exemplu în cadrul bibliotecii și nu alocăm timpul necesar înțelegerii modului de funcționare. Montajele vor funcționa dar vom utiliza corect senzorul? Să luăm ca exemplu programul I2C_ReadAllData.ino din cadrul bibliotecii Sparkfun BME280. În cadrul acestui exemplu în partea de inițializare se realizează următoarele setări, preluate de cele mai multe proiecte ca atare:

   mySensor.settings.runMode = 3;

    mySensor.settings.tStandby = 0;

    mySensor.settings.filter = 0;

    mySensor.settings.tempOverSample = 1;

    mySensor.settings.pressOverSample = 1;

    mySensor.settings.humidOverSample = 1;

Ce reprezintă aceste setări? Sunt potrivite pentru orice proiect?

runMode – configurează modul de funcționare al senzorului. Există trei moduri de funcționare: Sleep mode – senzorul nu efectuează nici o operație dar registrele interne sunt accesibile (mySensor.settings.runMode = 0;); Forced mode – senzorul efectuează o singură citire și revine în starea de Sleep mode (mySensor.settings.runMode = 1 sau 2;); Normal mode – senzorul efectuează o succesiune continuă de citiri (mySensor.settings.runMode = 3;). Sleep mode este modul în care se află senzorul după pornire. În funcție de domeniul de utilizare se poate configura în Forced mode sau în Normal mode.

tStandby – reprezintă timpul între două achiziții succesive în Normal mode. Chiar dacă din program noi citim la un interval de câteva secunde, minute sau ore, intern senzorul realizează achiziția la intervale de: 0, 0.5ms; 1, 62.5ms; 2, 125ms; 3, 250ms; 4, 500ms; 5, 1000ms; 6, 10ms; 7, 20ms;

filter – numărul de coeficienți utilizați în filtrarea parametrilor achiziționați. Poate avea valorile: 0 – nu se aplică filtru,  1– 2 coeficienți, 2 – 4 coeficienți, 3 – 8 coeficienți, 4 – 16 coeficienți. Procesul de filtrare asigură stabilitatea procesului de achiziție rejectând fluctuațiile generate de perturbații, mai ales pentru temperatură și presiune atmosferică, crește rezoluția dar crește și timpul de achiziție.

tempOverSample, pressOverSample, humidOverSamplenumărul de eșantioane preluate la o singură citire pentru parametrii temperatură, presiune atmosferică și umiditate. Poate avea valorile: 0 – nu se efectuează oversampling, de la 1 la 5 pentru 1, 2, 4, 8, 16 eșantioane. Opțiune utilă pentru reducere zgomotelor în procesul de achiziție.

În manualul oficial al senzorului se dau următoarele scenarii de utilizare a acestor parametrii:

Sistem de monitorizare a vremii (curent consumat de senzor aproximativ 0.16 µA)

Forced mode

Oversampling temperatură, umiditate, presiune: 1

Filter off

mySensor.settings.runMode = 1;

mySensor.settings.filter = 0;

mySensor.settings.tempOverSample = 1;

mySensor.settings.pressOverSample = 1;

mySensor.settings.humidOverSample = 1;

Sistem de monitorizare a umidității (curent consumat de senzor aproximativ 2.9 µA)

Forced mode

Oversampling temperatură, umiditate:1, presiune: 0

Filter off

mySensor.settings.runMode = 1;

mySensor.settings.filter = 0;

mySensor.settings.tempOverSample = 1;

mySensor.settings.pressOverSample = 0;

mySensor.settings.humidOverSample = 1;

Sistem de navigare în interior – precizie mare în determinarea altitudinii (curent consumat de senzor aproximativ 633 µA)

Normal mode, tStanby = 0.5ms

Oversampling temperatură:1, umiditate:0, presiune: 16

Filter coefficient 16

mySensor.settings.runMode = 3;

mySensor.settings.tStandby = 0;

mySensor.settings.filter = 5;

mySensor.settings.tempOverSample = 1;

mySensor.settings.pressOverSample = 4;

mySensor.settings.humidOverSample = 0;

Sistem gaming – răspuns rapid la modificarea altitudinii (curent consumat de senzor aproximativ 581 µA)

Normal mode, tStanby = 0.5ms

Oversampling temperatură:1, umiditate:0, presiune: 4

Filter coefficient 16

mySensor.settings.runMode = 3;

mySensor.settings.tStandby = 0;

mySensor.settings.filter = 5;

mySensor.settings.tempOverSample = 1;

mySensor.settings.pressOverSample = 2;

mySensor.settings.humidOverSample = 0;

În funcție de destinația sistemului în care utilizați senzorul BME280 puteți ajusta acești parametrii pentru a atinge performanțele dorite. Nu utilizați modul Normal pentru un sistem ce efectuează citiri la intervale mari de timp, modul Forced asigură un consum mult mai mic. Pentru citiri rapide nu utilizați un număr mare de oversampling. Dacă aveți nevoie doar de unul sau doi parametrii din cei trei furnizați de senzor puteți dezactiva parametrul nefolositor prin atribuirea valorii 0 la oversampling scăzând consumul și crescând viteza de achiziție. Pentru acuratețe mare în achiziție utilizați un număr mare de coeficienți de filtrare.

Mini Stație Meteo Weather Underground

Serviciul Weather Undergroud este un serviciu independent (nu este un serviciu al unei țări sau strucutură oficială) de predicție a vremii. Acest serviciu Internet permite realizarea de prognoze locale pe baza informațiilor provenite de la o stație meteo personală (PWS – Personal Wether Station) sau corelând informațiile de la mai multe stații meteo personale aflate într-o anumită zonă. Serviciul Weather Underground permite completarea funcționalității unei stații meteo personale cu partea de istoric și predicție a evoluției vremii și oferă o modalitate convenabilă în care utilizatorul poate consulta informațiile furnizate de stația meteo de oriunde prin Internet.

În cadrul proiectului de față vom prezenta realizarea unei mini stații meteo (măsoară doar temperatura, umiditatea și presiunea atmosferică) ce raportează datele măsurate către serviciul Weather Underground. Pentru partea de achiziție vom utiliza un singur senzor capabil să măsoare toți cei trei parametrii: BME280. Bineînțeles, sistemul prezentat poate fi extins și cu alți senzori specifici unei stații meteo: senzori pentru viteza și direcția vântului, senzor pentru cantitatea de precipitații sau senzor pentru indexul radiațiilor ultraviolete.

2

Ca placă de dezvoltare vom utiliza Adafruit HUZZAH ESP8266 breakout ce ne va permite o conectare simplă la Internet prin WiFi la un cost scăzut. Schema de interconectare între placa de dezvoltare și senzorul BME280 este următoarea:

3

Comunicația între senzor și placa de dezvoltare se bazează pe protocolul I2C prin urmare legărutile sunt:

  • Pinul SDA al senzorului se conectează la pinul #4 al plăcii de dezvoltare;
  • Pinul SCL al senzorului se conectează la pinul #5 al plăcii de dezvoltare;
  • Pinii 3.3V și GND ai senzorului se conectează la pinii 3V și GND ai plăcii.

Placa va trimite la un interval de 60 de minute (1 oră) datele achiziționate către serviciul Weather Underground iar între două postări se va afla în mod de consum redus. Din acest motiv există o legătură între pinul #16 și pinul RST al plăcii. Pinul #16 are funcționalitate de Wake ce permite resetarea plăcii pentru a ieși din modul de consum redus. Pentru mai multe informații despre modul de consum redus al circuitului ESP8266 puteți consulta materialul „ESP8266 Deep Sleep with Arduino IDE”.

Pentru alimentarea plăcii puteți un regulator de 3.3V sau una sau mai multe baterii ce furnizează între 4V și 6V (alimentarea se va face în acest caz prin intermediul pinului Vbat). Având în vedere consumul redus al sistemului funcționarea pe baterii se poate face pe perioade lungi de timp.

Pentru programarea plăcii Adafruit HUZZAH ESP8266 este nevoie de un programator FTDI sau de un cablu FTDI. Pentru mai multe informații despre funcționarea plăcii de dezvoltare Adafruit HUZZAH ESP8266 puteți consulta materialul „Adafruit HUZZAH ESP8266 breakout – Adorable bite-sized WiFi microcontroller, at a price you like!”.

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.3 având instalate extensia ESP8266 Community 2.3.0 și biblioteca Sparkfun BME280 1.1.0. În cadrul programului trebuie personalizate datele de conectare la rețeaua WiFi (ssid și pass) precum și datele de autentificare la platforma Weather Underground (ID și PASSWORD).

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>

#include “SparkFunBME280.h”

#include “Wire.h”

BME280 mySensor;

char ssid[] = “…”;

char pass[] = “…”;

WiFiClient client;

void setup() {

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {

      delay(500);

    }

  mySensor.settings.commInterface = I2C_MODE;

  mySensor.settings.I2CAddress = 0x77;

  mySensor.settings.runMode = 3;

  mySensor.settings.tStandby = 0;

  mySensor.settings.filter = 0;

  mySensor.settings.tempOverSample = 1;

  mySensor.settings.pressOverSample = 1;

  mySensor.settings.humidOverSample = 1;

  mySensor.begin();

  delay(100); }

void loop() {

  float tempC = mySensor.readTempC();

  float humidity = mySensor.readFloatHumidity();

  float pressure = mySensor.readFloatPressure();

  delay(100);

  String url = “http” + “://weatherstation.wunderground.com/”

  url += “weatherstation/updateweatherstation.php?”

  url += “ID=…&PASSWORD=…”

  url += “&dateutc=now&=&action=updateraw&”;

  url += “baromin=” + String(pressure * 29.92 / 101325);

  url += “&tempf=” + String(9/5.0 * tempC + 32.0);

  url += “&humidity=” + String(humidity);

  url += “&dewptf=” + String(9/5.0 * (tempC – (100.0 –

humidity) /5.0) + 32.0);

  HTTPClient http;

  http.begin(url);

  int httpCode = http.GET();

  delay(1000);

  http.end();

  delay(1000);

  ESP.deepSleep(3600L*1000000L);  }

Așa cum am precizat și anterior, serviciul Weather Underground este un serviciu independent de prognoză meteorologică bazată în principal de rețele de stații meteo proprii (în SUA) sau private (PWS – Personal Weather Station, în restul lumii). Platforma online a acestui serviciu permite înregistrarea datelor provenite de la orice PWS și realizarea de prognoze de evoluție a vremii zonale ca o alternativă mult mai rafinată la serviciile naționale de meteorologie. Serviciul este gratuit dar necesită înregistrare. Un utilizator poate înregistra mai multe stații meteo aflate în locații diferite. Imediat după înregistrarea stației meteo personale se poate porni sistemul și datele înregistrate vor apărea imediat în fereastra asociată stației respective.

4

După o perioadă de 24 – 48 de ore, dacă datele raportate sunt valide – se încadrează într-un interval de valori decent de apropiat ca celelalte stații meteo din zonă, stația meteo va apărea și în WunderMap și va putea fi văzută de orice alt utilizator al serviciului. WunderMap poate fi consultată în varianta web sau în varianta de mobil (la fel și prognozele meteorologice furnizate de Weather Underground).

5