KKM: BMP180

Senzor tlaka i temperature BMP180-easyC

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

BMP180 je vrlo precizno Boshovo rješenje za mjerenje barometrijskog pritisaka(tlaka) i temperature. Nasljednik je BMP085 i predstavlja novu generaciju preciznih digitalnih senzora tlaka. Ultra niska potrošnja(5uA po mjerenju) i niski napon optimizirani su kako bi senzor radio u modernim uređajima, tako da ćete ga često naći u mobitelima, GPS uređajima i sl. Senzor je prilagođen I2C komunikaciji pa ga vrlo jednostavno spojamo s Dasduinom. Regulator napona i I2C pull-up otpornici se nalaze na breakout pločici.

Karakteristike:
Raspon mjerenja: 300 – 1100hPa
Napon: 2 – 6V
Struja: 5uA (po mjerenju)
Odstupanje: 0.02hPa (0.17m)
Dimenzije: 21mm x 18mm

Tlak zraka mjeri u koracima od 1hPa (=0.01hPA =0.01mbar), a temperaturu 0.1°C. Osim tlaka zraka i temperature, ovim senzorom možemo mjeriti i nadmorsku visinu te tlak na površini mora. O tome nešto kasnije. Za sada još link na datasheet.

KAKO RADI BMP?

BMP180 koristi piezo efekt za odeđivanje tlaka i temperature. Dobiveni analogni signal pretvara se u digitalni pomoću ADC-a. BMP180 ima integriranu EEPROM memoriju s podacima za kalibraciju. Svaki senzor ima posebni, specifični 176bitni niz podataka koji se koristi za otkanjanje šumova, kompenzaciju pomaka i određivanje ovisnosti o temperaturi. To su zapravo zapisi o omjerima stvarnih i očitanih mjerenja, a upravo su oni razlog vrlo dobroj točnosti konačnih rezultata.

Postupak jednog mjerenja je sljedeći:

Mikrokontroler šalje niz naredbi za pokretanje mjerenje tlaka i temperature. Nakon ADC konverzije dobivamo nekompresirane vrijednosti: UP – uncompensated preassure i UT – uncompensated temperature. Te podatke možemo isčitati preko I2C interface-a, međutim za kalkulaciju temperature u stupnjevima i tlaka u hektopaskalima, potrebna je kalibracija. Konstante za kalibriranje se čitaju iz EEPROM memorije, njih također očitavamo preko I2C-a te konačno dobijemo podatke koji i nama nešto znače.

Uzimanje uzoraka može biti maksimalno 128 puta u sekundi, u tom slučaju se preporučuje samo jedno jedno mjerenje temperature.

 

KAKO POVEZATI MODUL?

Za one koji su preskočili na ovaj dio, BMP180 koristi I2C interface. Breakout ima sve potrebno za takvu vrstu komunikacije te regulator pa ulazni napom može varirati od 2-6 VDC. Odnosno, praktički je svejedno spojimo li ga na 3V3 ili 5V pin Dasduina.

ARDUINO KOD

Za očitanja s BMP180 koristiti ćemo library kojeg možete preuzeti ovdje. Ako ste nesigurni kako instalirati novi library pratite ovaj tutorial. Primjer koda, kao i uvijek, nakon instalacije library-a možete pronaći pod File – Examples. Ispod je naša verzija koja daje očitanja tlaka i temperature zraka.

Inženjeri u Bosch-u predefinirali su nešto što su nazvali oversampling_settings, a o njemu ovisi brzina i točnost očitanja te konzumacija struje. Moguće su 4 opcije, a parametri su prikazani u tablici dolje. U kodu je korišten parametar 3, odnosno ultra high resolution.

///////////////////////////////////////////////////////////////////////////////
/*                                                                           */
/*                                                                           */
/* (c) e-radionica.com 2015 - http://e-radionica.com/hr/faq/#privatnost      */
/* techsupport@e-radionica.com                                               */
/*                                                                           */
/*                                                                           */
/* Senzor tlaka zraka BMP180 - KKM tutorial                                 */
///////////////////////////////////////////////////////////////////////////////
#include "SFE_BMP180.h"
#include "Wire.h"
SFE_BMP180 tlak;
double tlakZraka, tempZraka;
void setup() {
  // zapocinjem serijsku komunikaciju
  Serial.begin(9600);
  
  // provjera je li sve uredu
  if(tlak.begin())  Serial.println("BMP180 uspjesno povezan.");
  else
  {
    Serial.print("Upss.. provjeri kako je modul spojen na Croduino...");
    while(1);
  }
}
void loop() {
  
  // ocitavam i printam tlak zraka
  tlakZraka = ocitajTlak();
  Serial.println("Tlak zraka = " + String(tlakZraka) + "hPa");
  
  // ocitavam i zapisujem temp zraka
  tempZraka = ocitajTemperaturu();
  Serial.print("Temp zraka = " + String(tempZraka));
  Serial.print(char(176));
  Serial.println("C");
  // ispisuj podatke svakih 1000ms = 1sekundu
  delay(1000);
  Serial.println();
}
double ocitajTlak()
{
  char status;
 /*
  *  definiramo varijable:
  *  temp - temperatura zraka
  *  Tlak - tlak zraka
  *  tlak0 - tlak na povrsini mora
  *  nadVisina - nadmorska visina 
  */
  double temp, Tlak, tlak0, nadVisina;
  
  // zapocinjemo mjerenje temperature
  // ako je mjerenje uspješno funkcija vraca delay u ms
  // u suprotnom nam vraća 0 (nulu)
  
  status = tlak.startTemperature();
  if(status != 0)
  {
    delay(status);
    // vraća 1 za uspjesno, odnosno 0 za neuspjesno mjerenje
    status = tlak.getTemperature(temp);
    if(status != 0)
    {
      // zapocinjem mjerenje tlaka
      // 3 je oversampling_settings, pogledaj tutorial
      // ako je mjerenje uspješno funkcija vraca delay u ms
      // u suprotnom nam vraća 0 (nulu)
      status = tlak.startPressure(3);
      if(status != 0)
      {
        delay(status);
        // vraća 1 za uspjesno, odnosno 0 za neuspjesno mjerenje
        status = tlak.getPressure(Tlak,temp);
        if(status != 0)
        {
          return(Tlak);
        }
      }
    }
  }
}
double ocitajTemperaturu()
{
  char status;
  double temp;
  
  // zapocinjemo mjerenje temperature
  // ako je mjerenje uspješno funkcija vraca delay u ms
  // u suprotnom nam vraća 0 (nulu)
  
  status = tlak.startTemperature();
  if(status != 0)
  {
    delay(status);
    // vraća 1 za uspjesno, odnosno 0 za neuspjesno mjerenje
    status = tlak.getTemperature(temp);
    if(status != 0)
    {
      return(temp);
    }
  }
}

 

KAKO RAČUNATI NADMORSKU VISINU?

Već smo spomenuli da pomoću BMP180 senzora tlaka možemo računati nadmorsku visinu, odnosno tlak zraka na površini mora. Za računanje navedenog moramo znati trenutni tlak zraka i jednu od navedenih parametara.
Recimo da želimo računati nadmorsku visinu(altitude), koristiti ćemo formulu:

Untitled
Gdje je:
p – trenutni tlak zraka
p0 – tlak zraka na površini mora.

Iz navedenog dolazimo do zaključka kako je promjena tlaka od 1hPa jednaka promjeni visine od 8.43m. Odnosno, s promjenom visine od 10m tlak se mijenja za 1.2hPa. Formula za računanje tlaka zraka na površini mora je:

Untitled
Prevedeno u Arduino jezik to bi izgledalo ovako:

// funkcija za racunanje tlaka na povrsini mora pomocu tlaka zraka i nadmorske visine
// gdje je: p-tlak zraka, p0 - tlak zraka na povrsini mora i a-nadmorska visina
double racunajTlak0(double p, double a)
{
  return(p/pow(1-(a/44330.0),5.255));
}
// funkcija za racunanje nadmorske pomocu tlaka zraka i tlaka zraka na povrsini mora
// gdje je: p-tlak zraka, p0 - tlak zraka na povrsini mora i a-nadmorska visina
double racunajTlak0(double p, double p0)
{
  return(44330.0*(1-pow(p/p0,1/5.255)));
}