Magasság mérő


Az interneten találtam erre a projektre, gondoltam én is összerakom. Egy Arduino pro mini-vel vezérelt légnyomásmérő segítségével állapítjuk meg az aktuális tengerszint feletti magasságot.
A kijelzésről az előző cikkben ismertettet OLED gondoskodik, a tápellátást egy 350mAh-ás LIPO akkumulátor szolgáltatja ami egy LIPO töltőn keresztül tölthető.

Az eredeti megtalálható: http://electro.olganet.com/2014/03/29/tiny-altimeter-oled/


Egy pár sort a légnyomásmérésről, itt a BMP180-as légnyomásmérőt használjuk ami méri az aktuális légnyomást valamint hőmérsékletet. Az aktuális légnyomás függ az adott hely tengerszint feletti magasságától, valamint a pillanatnyi légköri nyomástól. Mivel a légköri nyomás tízes nagyságrendeket változik ezért nehézkes a légnyomás értékből magasságot számolni, de van rá megoldás, hogy kiküszöböljük ezeket a pontatlanságokat. Ennél a műszernél a napi légnyomás érték beállításával oldjuk meg ezt a problémát. Tehát a net-ről kinézzük az adott hely aktuális légnyomását majd kalibrálásnál ezt az értékét írjuk be. Tudni kell ez az érték hPa (hektoPascalban) van és az adott ponton mért légnyomás érték tengerszintre átszámolt értékét adja. Ez úgy nézz ki, hogy Pécsen mért 1010hPa kézi műszerrel, az a légnyomás térképen 1022-1023hPa értékel jelenik meg azért mert ha le mennénk Pécs alá tengerszint magasságra akkor ezt az értéket mérnénk.

Ezekre az átszámításokra azért van szükség mert csak így kerülhetjük el a domborzat változásaiból
eredő légnyomás különbségeket és ez által kaphatunk egységes adatokat.

Ennek fényében a mért légnyomást összehasonlítjuk a tengerszinten mért légnyomás értékével és a
kettő különbségéből(megszorozva az adott szorzóval) megkapjuk az aktuális magasságot.
Átlagosan 100méterenkét 12hPa-al csökken a légnyomás, fordítottan 1hPa nyomásváltozásra 8méter jut. A tengerszinti átlagos légnyomás 1013.25hPa (ideális körülmények között), ezt befolyásolja az időjárás változásai.

A BMP180-ról már volt szó, vagyis a BMP183-ról a következő oldalon:

Légnyomás és hőmérséklet szenzor 140711
A különbség a BMP180 még I2C protokollt használ, de nem kell megijedni ehhez is van könyvtár:

https://github.com/adafruit/Adafruit_BMP085_Unified

Letöltés, kicsomagolás, átnevezés Adafruit_BMP085_U-ra, behelyezés az Arduino/librarie könyvtárba.

Ehhez még kelleni fog az Adafruit Sensor könyvtára ami letölthető:

https://github.com/adafruit/Adafruit_Sensor


Az OLEDről már írtam az előző cikkben :

OLED 150206

Könyvtár letölthetők:

https://github.com/adafruit/Adafruit_SSD1306

itt még felhasználjuk az Arduino grafikus könyvtárát ami letölthető:

https://github.com/adafruit/Adafruit-GFX-Library


Most nézzük a tápellátást, egy LIPO (litium-polimer) aksit használok ami 3,7V-os és 350mA-t biztosít. Ami jó dolog de töltő nélkül semmit se ér, ezért egy erre készült töltő áramkört is beszereztem. Ez TP4056 típusú mikro USB-ről üzemelő töltő ami direkt a LIPO aksinak megfelelő töltő feszültséget és töltő áramot biztosítja. A töltés állapotát piros led jelzi, a feltöltöttet pedig egy kék.


Ezenkívül az áramkör tartalmaz még egy főkapcsolót valamint egy nyomógombot egy felhúzó ellenállással.

Nézzük a kapcsolási rajzot:


Bekötés:

BMP180
VIN        kapcsoló 3,7V
GND      GND
SCL       Pro mini - A5
SDA      Pro mini - A4

OLED

VCC         kapcsoló 3,7V
GND          Gnd
CLK            10           órajel
MOSI            9         adatbevitel
CS              12         chip select
D/C             11         command/data parancs/adat vonal


A pro mini nem csatlakoztatható közvetlenül a számító géphez ezért usb-soros illesztőt kell használnunk a felprogramozásához, erről bővebben a következő oldalról:

Arduino Pro Mini 150214

Az összeépítés mindenkinek saját szíve ügye, én magam részéről a legegyszerűbb módját választottam: fogtam az akksit és rá ragasztottam a szükséges panelokat (persze csak forrasztás után). Remélem azért másnak ez jóval esztétikusabbra sikerül, mondjuk egy lapos akkuval ez is szebb lett volna ;)

A kód:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//oled definiálása
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13


Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);


int gomb;
int szamlal =0;
float tengerszint_nyomas;
int ten_nyom[60];

void setup(){
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC);

//ha nem használjuk a beallitas függvényt akkor evvel a sorral állítjuk be a tengerszint értéket
// tengerszint_nyomas = SENSORS_PRESSURE_SEALEVELHPA;
bmp.begin();
pinMode(4,INPUT);

//bejelentkezés
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(25,25);
display.clearDisplay();
display.println("Elektromanoid");
display.display();
delay(5000);

//nyomás értékek feltöltése tömbbe
int k=0;
for(int i=970;i<1031;i++)
{
ten_nyom[k]=i;
k++;
}

//aktuális tengerszinti nyomás beállítása a beallitas függvénnyel
tengerszint_nyomas = beallit();
}

void loop(){
sensors_event_t event;
bmp.getEvent(&event);

gomb = digitalRead(4);
delay(100);


//menu ertekei
if((gomb == HIGH) && (szamlal<4))
szamlal++;
else if ((gomb == HIGH) && (szamlal==4))
szamlal = 1;
Serial.println(szamlal);

switch(szamlal){
case 1:{

//hőmérséklet kiíratása
float temperature;
bmp.getTemperature(&temperature);
display.setTextSize(3);
display.setCursor(0,20);
display.clearDisplay();
display.print(temperature);
display.println(" C");
display.display();
break;
}

case 2:{

//légnyomás
display.setTextSize(2);
display.setCursor(0,20);
display.clearDisplay();
display.print(event.pressure);
display.println("hPa");
display.display();
break;
}

case 3:{

//maggaság

display.setTextSize(3);
display.setCursor(0,20);
display.clearDisplay();
display.print(bmp.pressureToAltitude(tengerszint_nyomas,
event.pressure));
display.println("m");
display.display();
break;
}
}
}


float beallit()
{
int j;
display.setTextSize(1);
display.setCursor(35,0);
display.clearDisplay();
display.println("BEALLITAS");
display.setCursor(0,20);
display.println("Nyomd a gombot a ki-vant ertek elereseig!");
display.display();

for(int i=0;i<100;i++)
{
delay(100);
gomb = digitalRead(4);
if(gomb == HIGH){
tengerszint_nyomas = ten_nyom[j];
if(j>60)
j=0;
j++;
display.setTextSize(2);
display.setCursor(0,20);
display.clearDisplay();
display.print(tengerszint_nyomas);
display.println("hPa");
display.display();
}
}
szamlal =1;
return(tengerszint_nyomas);
}


A progi elindítása után, a beállítás menüben állíthatjuk be az aktuális légnyomás értéket (ezt a netről
informálhatjuk le) a gomb folyamatos nyomva tartásával vagy nyomkodásával. A beállításra elvileg
10 másodperc áll rendelkezésre(a kiírással együtt) utána automatikusan vissza tér a program a fő ciklusba. A fő ciklusban a hőmérséklet, a légnyomás és a tengerszint feletti magasságot tudjuk váltogatni gombnyomásra.


Mindenkinek jó építést!