Măsurare presiune atmosferică cu senzor BMP280

 Autor:   Publicat pe:   Actualizat pe:  2019-01-24T11:56:05Z

Senzorul BMP280 măsoară presiunea atmosferică și temperatura. Altitudinea poate fi estimată știind presiunea. Cei trei parametri sunt afișați pe un ecran LCD grafic.

BMP280 este un senzor digital de presiune atmosferică proiectat pentru dispozitive mobile. Senzorul are o capsulă foarte mică, de numai 2 x 2,5 milimetri. Conectarea la o placă de dezvoltare ar fi foarte dificilă, dacă nu ar exista module cu barete de pini standard. O altă problemă este că tensiunea nominală de alimentare a senzorului este de 1,8 V. Totuși, suportă tensiuni de 3,3 V. BMP280 măsoară presiunea atmosferică și temperatura. Știind că există o corelație între presiune și altitudine, pe aceasta din urmă o putem calcula.

Până la urmă am conectat senzorul la o placă de dezvoltare pe 5 V din cauza display-ului. Am trei valori de afișat, așa că am utilizat un afișaj grafic cu controller ST7920, în locul unuia alfanumeric. Deși acesta poate funcționa la 3,3 V, modul în care este configurat din fabricație nu permite setarea contrastului suficient de bună la 3,3 V. Display-ul este conectat prin interfață SPI, deci numai 4 fire sunt folosite (3 pentru SPI și unul pentru reset). BMP280 suportă atât interfață SPI cât și I2C. Deoarece singurul convertor de nivel pe care îl am este unul construit de mine pentru I2C, am ales această interfață pentru senzor.

Senzorul BMP280 pe placa de test

Senzorul BMP280 pe placa de test

BMP280 se alimentează de la ieșirea de 3,3 V a plăcii Arduino. Pentru a selecta interfața I2C, pinul CSB trebuie conectat la 3,3 V. Nu conecta SDO la 3,3 V așa cum spun unii. Acesta este un pin de ieșire care trebuie să rămână neconectat când nu este folosită interfața SPI.

Conectarea BMP280 și a afișajului la Arduino

Conectarea BMP280 și a afișajului la Arduino

În schema de mai sus, cele patru rezistoare de 10 k și cei doi tranzistori FET intră în compunerea comutatorului de nivel. Poți folosi un modul specializat în locul lui. Unele module cu BMP280 includ circuit de comutare nivel. Dacă modulul pe care îl ai nu are așa ceva, nu îl conecta direct la 5 V.

Pentru senzor am folosit biblioteca BMx280MI de Gregor Christandl. Aceasta suportă atât interfața SPI cât și I2C și poate fi instalată direct în Arduino IDE prin managerul de biblioteci. Această bibliotecă permite configurarea senzorului în funcție de modul de utilizare. Imediat după alimentare, senzorul întră în modul standby. Convertorul analog digital și filtrul inclus trebuie setate. Tabelul 7 din secțiunea 3.4 a fișei tehnice prezintă mai multe seturi de configurații în funcție de situația de utilizare. Am ales să măsor presiunea cu precizie maximă. În acest mod, curentul necesar senzorului este maxim (doar 650 microamperi). Precizia măsurării presiunii este setată la 0,16 Pa, iar a temperaturii 0,0025 grade Celsius. Aceste numere sunt foarte bune, dar precizia nu este acuratețe. Aceasta are limite mai largi: ±170 pentru presiune și ±1 grad Celsius pentru temperatură. Codul de inițializare a senzorului este următorul:

  bmp280.resetToDefaults();
  bmp280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
  bmp280.writeOversamplingTemperature(BMx280MI::OSRS_T_x02);
  bmp280.writeFilterSetting(BMx280MI::FILTER_x16);
  bmp280.writePowerMode(BMx280MI::BMx280_MODE_NORMAL);
  bmp280.writeStandbyTime(BMx280MI::T_SB_5);

Presiunea și temperatura sunt calculate după informațiile primite de la senzor. Acesta include o memorie cu date de calibrare care sunt folosite împreună cu citirea convertorului ADC pentru calcularea valorilor de ieșire. Presiunea este determinată în Pa. Am convertit-o în milimetri coloană de mercur (mmHg) înainte de afișare.

Pentru a obține altitudinea, vom folosi formula barometrică. Fișa tehnică a BMP280 nu precizează nimic de altitudine, dar în cea a senzorului BMP180 se poate găsi formula:

  altitude = 44330 * (1.0 - pow((pressure / 100) / 1013.25, 0.1903));

Numărul 1013,25 reprezintă presiunea atmosferică la nivelul mării, exprimată în hPa.

Pentru afișaj nu am folosit o bibliotecă. Fiindcă ST7920 are un mod text și include un font predefinit, este mai eficient să afișez text în acest mod folosind codul scris de mine anterior. Cele 4 rânduri de 16 caractere sunt suficiente pentru afișarea celor 3 parametri. Am folosit și modul grafic al controller-ului pentru a afișa niște pictograme în stânga parametrilor afișați.

void ST7920_displayIcon16(uint8_t row, uint8_t *icon) {
  uint8_t y_address = 0x80;
  uint8_t x_address = 0x80;
  if (row >= 2) x_address = 0x88;
  if (row % 2 == 1) y_address += 16;

  for (uint8_t i = 0; i < 16; i++) {
    ST7920_Write(LCD_COMMAND, y_address + i);
    ST7920_Write(LCD_COMMAND, x_address);
    ST7920_Write(LCD_DATA, icon[i * 2]);
    ST7920_Write(LCD_DATA, icon[i * 2 + 1]);
  }
}

Pentru a genera pictogramele, am folosit dotmatrixtool.com. Este destul spațiu în memoria flash a microcontroller-ului pentru trei bitmap-uri de 16x16 pixeli. Ca alternativă, pentru afișarea pe LCD, aș fi putut folosi biblioteca U8g2, dar aceasta funcționează numai în modul grafic, cu fonturi personalizate și ocupă mult spațiu. Codul complet pentru acest proiect este pe GitHub.

Dacă vei realiza acest circuit, trebuie să știi că nu poți înlocui LCD-ul cu altul fără a modifica semnificativ codul. Totuși, folosind modul text al ST7920, programul este eficient, rapid și folosește minimul de memorie.

Niciun comentariu :

Trimiteți un comentariu

Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.