neděle 11. ledna 2015

I2C tlakoměr BMP180

Tentokrát přišel od Číňana I2C tlakoměr BMP180 od společnosti Bosch. U tohoto senzoru není měření tak jednoduché jako u popisovaného teplotního senzoru. Tlak je závislý na spustě veličin, nejdůležitější je teplota, čidlo tedy musí nejprve změřit teplotu a poté výslednou teplotu započítat při výpočtu aktuálního tlaku.

Dalším problémem je, že všude je udáván tlak přepočtený na hladinu moře, proto můj tlakoměr naměřil 980 Pa namísto obligátních 101 kPa. Pro měření jsme si opět napsal jednoduchý skriptík. K Turrisu je testovací destička připojena prostřednictvím rozšiřujícího konektoru, kde je mimo napájení vyvedena také sběrnice I2C. Adresa zařízení je v tomto případě 0x77.

Destička barometru je připojena prostřednictvím I2C k našemu Turrisu.
Nejprve spustíme konverzi teploty, poté naměřenou hodnotu vyčteme z adresy 0xF6 a nyní se už konečně dostaneme k vlastnímu měření tlaku. Aktuálně využívám nejpřesnější a tedy i nejdelší variantu měření, kterou spustíme zápisem hodnoty 0xF4 do registru na adrese 0xF4. Výsledná hodnota je tříbajtová, začíná na adrese 0xF6 a končí na 0xF8. Tato hodnota však nepředstavuje přímo tlak v pascalech, ještě je nutné ji dle kalibračních hodnot přepočíst na absolutní tlak.

#/bin/ash

rozhrani=1
adresa=0x77

echo "Teplota;P2;P1;P0"

while true; do
    i2cset -y $rozhrani $adresa 0xF4 0x2E # spustíme měření teploty
    sleep 1
    T=`i2cget -y $rozhrani $adresa 0xF6 w` # vyšteme aktuální teplotu
    i2cset -y $rozhrani $adresa 0xF4 0xF4 # spustíme měření tlaku (nejdelší ale nejvyšší přesnost)
    sleep 1
    P0=`i2cget -y $rozhrani $adresa 0xF6`
    P1=`i2cget -y $rozhrani $adresa 0xF7`
    P2=`i2cget -y $rozhrani $adresa 0xF8`
    echo -e "$T;$P0;$P1;$P2"
   
    sleep 60 # minutku počkáme
done

Dále uvádím výpočet koeficientů z kalibrace senzoru:
    c3 = 160.0 * pow(2.0,-15) * AC3;
    c4 = pow(10.0,-3) * pow(2.0,-15) * AC4;
    b1 = pow(160.0,2) * pow(2.0,-30) * VB1;
    c5 = (pow(2.0,-15) / 160) * AC5;
    c6 = AC6;
    mc = (pow(2.0,11) / pow(160.0,2)) * MC;
    md = MD / 160.0;
    x0 = AC1;
    x1 = 160.0 * pow(2.0,-13) * AC2;
    x2 = pow(160.0,2) * pow(2.0,-25) * VB2;
    y0 = c4 * pow(2.0,15);
    y1 = c4 * c3;
    y2 = c4 * b1;
    p0 = (3791.0 - 8.0) / 1600.0;
    p1 = 1.0 - 7357.0 * pow(2.0,-20);
    p2 = 3038.0 * 100.0 * pow(2.0,-36);



A jak si otestovat, zda měříme správně? Následující graf představuje necelý den měření, tvar křivky jsem porovnával s údaji z meteostanic nadšencův okolí. Na všech křivkách je patrné minimu které se ještě prohloubí a je následováno nárůstem nad počáteční hodnotu.

Pro přepočet tlaku na tlak v nulové nadmořské výšce je třeba použít následující vzorec (P je absolutní tj naměřený tlak a p0 je tlak na hladině moře).







Žádné komentáře:

Okomentovat