Image
3.3.2016 0 Comments

ARDUINO – programovamie mikrokontrolérov Atmel /13.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

V minulej časti sme si vysvetlili, akým spôsobom môžeme k Arduinu  pripojiť dve LED diódy. Pomocou Arduina sme vytvorili jednoduchý web server, ktorý sme pripojili k lokálnej počítačovej sieti a cez webový prehliadač sme sa naučili pripojené LED diódy zapínať a vypínať. Dnes si vytvoríme niečo užitočné, a tak si ukážeme meranie a zobrazovanie atmosférického tlaku a teploty ako akýsi prazáklad budúcej meteostanice alebo riadiaceho minicentra.

Čo k tomu budeme potrebovať?

Samozrejme náš web server postavený na Arduine a ethernet shielde. Ale aby sme mohli merať tlak a teplotu, budeme potrebovať nejaký vhodný snímač – senzor. Existuje viacero typov tlakových senzorov, avšak v poslednej dobe sa najčastejšie používa senzor BMP085 alebo jeho novší variant BMP180. Obidva senzory majú veľkú výhodu – okrem merania tlaku merajú aj teplotu, takže v tomto prípade máme „dva v jednom“. Dokonca môžeme určiť, s akou presnosťou meranie prebehne! Ak si uvedomíme, že hodnota tlaku veľmi tesne súvisí s výškou, v ktorej sa meria, tak jednoduchým prepočtom pomocou tohto modulu dokážeme merať aj výšku, v ktorej je modul umiestnený. Takže vlastne „tri v jednom“! A práve toto sa veľmi často využíva v rôznych aplikáciách, ako si povieme neskôr.

My použijeme senzor BMP085 (tí, ktorí majú typ BMP180 nech nezúfajú, princíp je v podstate rovnaký!). Samotný senzor tlaku a teploty je síce možné zakúpiť, ale pre nás je podstatne výhodnejšie používať modul, ktorý tento senzor obsahuje. Modul totiž okrem senzora obsahuje ďalšie súčiastky a obvody, ktoré zabezpečujú správnu činnosť senzora. Takýto modul potom už iba pripojíme k Arduinu alebo shieldu a môžeme ho používať. Tento modul sa dá kúpiť na Internete za cenu pod dve eurá! Moduly so senzorom bývajú rôzneho tvaru alebo farby, môžu mať dokonca aj inak rozložené pripojovacie piny. A čo je najdôležitejšie – môžu mať rôzne napájanie! Staršie moduly boli napájané napätím 5 Voltov, tie novšie používajú napätie 3,3 Voltov. Preto si už pri kúpe overme, aké napájanie náš modul potrebuje. V prípade, že sa k tejto informácii z rôznych dôvodov nevieme dostať (staršia kúpa alebo nám niekto modul daroval), doporučujem modul najprv pripojiť na nižšie napätie 3,3 Voltov a ak nebude správne pracovať, tak ho prepnúť na napätie 5 Voltov. Dokonca môžeme zistiť, že modul pracuje na obidvoch napätiach bezchybne! Ale radšej buďme opatrní!

Pripojenie modulu

Aj keď má modul spravidla 6 pinov, pre našu prácu stačia štyri piny. Okrem napájania modul používa ku komunikácii zbernicu I2C. Modul pripojíme k Arduinu Uno (alebo všetkým klonom a variantom s kontrolérom Atmel 386) takto:

Modul BMP Arduino
Vcc 3,3 V
GND GND
SDA A4
SCL A5


Obr.č.1


Obr.č.2

Podobne, ako je to na obrázku č.1. V prípade, že máme modul inej modifikácie, tak spôsob pripojenia síce zodpovedá tabuľke, ale realizácia môže byť ako na obrázku č.2.

V prípade, že máme starší modul, ktorý potrebuje napájanie 5 Voltov, pin modulu s označením Vcc pripojíme k Arduinu na pin označený 5V (o dierku vedľa).

Keďže ethernet shield je nadstavbou nad Arduinom a jeho piny sú priebežné a teda identické, pripojenie modulu k shieldu nebude problém. Nevyužité piny modulu ponecháme nepripojené!

Poznámka:

Pre Arduino Mega platí iný spôsob pripojenia!

Softvérová práca s modulom

Aby sme sa hneď na začiatku nevyľakali, poviem, že  získanie správnych hodnôt z modulu je vďaka dostupným knižniciam veľmi jednoduchá. Ale treba spomenúť, že primárna práca s modulom je pomerne zložitá. Najprv treba vyčítať tzv. kalibračné hodnoty z modulu. Jedná sa o jedenásť 16-bitových čísiel, uložených v pamäti modulu. Tie tam boli zadané pri výrobe a otestovaní modulu a každý modul má tieto hodnoty rôzne! Tieto hodnoty sa vyčítavajú ako 8-bitové čísla, ktoré potom musíme zameniť za 16-bitové čísla, a nakoniec ich použijeme pre ďalšie výpočty. Druhým krokom je vyčítanie nekompezovanej hodnoty teploty a pomocou získaných kalibračných hodnôt a výpočtov dostaneme reálnu teplotu na desatiny stupňa. Tretím krokom je vyčítanie nekompezovanej hodnoty tlaku a pomocou získaných kalibračných hodnôt a výpočtov dostaneme reálnu hodnotu tlaku s presnosťou na 0,3 hPa. Posledným krokom je prepočet získaného tlaku na nadmorskú výšku alebo na reálnu výšku. Výpočet vôbec nie je jednoduchý, pozrime na vzorec na obrázku č.3.

My touto cestou nepôjdeme! Nie že by sme to nedokázali, ale nie je to nutné. Pre tieto moduly existujú knižnice, ktoré nám celý spôsob získania a výpočet potrebných dát zjednodušujú. Jedna z knižníc je v starších verziách vývojového prostredia už priamo jeho súčasťou (BMP085.h), druhom možnosťou je použitie knižnice od firmy Adafruit (Adafruit_BMP085.h). Obidve knižnice dávajú rovnaké výsledky, a je len na nás, ktorú použijeme. Dnes si ukážeme prácu s knižnicou BMP085, nabudúce sa budeme venovať tej druhej.

Ak táto knižnica nie je súčasťou vývojového prostredia IDE Arduina ( v niektorých novších verziách bola nahradená práve knižnicou Adafruit, stiahneme si ju z tejto stránky: https://code.google.com/archive/p/bmp085driver/downloads . Súbor rozzipujeme a jednoducho prekopírujeme do adresára /libraries na mieste, kde máme nainštalované vývojové prostredie Arduina. Potom prostredie jednoducho spustíme a knižnica je už súčasťou prostredia. Dokonca tu nájdeme niekoľko vzorových príkladov pod položkou menu File – Examples – BMP085.

Skeč programu

Na výpise je kód skeče našej aplikácie:

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <BMP085.h>
 
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9C, 0xB7 };
IPAddress ip(192,168,100,170);
 
EthernetServer mojServer(80);
 
BMP085 dps = BMP085(); 
long Tlak = 0, Vyska = 0, Teplota = 0;
 
void setup(){
    Ethernet.begin(mac, ip);
    mojServer.begin(); //spustíme server
    Wire.begin();
    delay(1000);
    dps.init(MODE_STANDARD, 18501, true);
}
 
void loop(){
    dps.getPressure(&Tlak);
    dps.getAltitude(&Vyska);
    dps.getTemperature(&Teplota);
   
    EthernetClient Klient = mojServer.available();
    if (Klient){
        boolean prazdnyRiadok = true;
        while (Klient.connected() && Klient.available()){
            // ak klient odosiela HTTP požiadavku
            char c = Klient.read(); //čítaj znaky v bajtoch od klienta
           
            if(c == '\n' && prazdnyRiadok){
                Klient.println("HTTP/1.1 200 OK");
                Klient.println("Content-Type: text/html");
                Klient.println("Connection: close");
                Klient.println("Refresh: 1");
                Klient.println();
                Klient.println("<!DOCTYPE HTML>");
                Klient.println("<html>");
                Klient.println("<head>");   
                Klient.println("<title>Arduino WEB server</title>");
                Klient.println("<meta charset='UTF-8'>");
                Klient.println("</head>");
                Klient.println("<body>");
                 // vypíše text
                Klient.print("<H1>");
                Klient.println("Ahoj, ja som Tvoj Arduino tlakový a teplotný web server :-)");    
                Klient.print("</H1>");
                Klient.print("<P>");
                Klient.print("<H3>");
                Klient.print("Výška: ");
                Klient.println(Vyska/100);
                Klient.print(" metrov");
                Klient.print("<P>");
                Klient.print("Tlak: ");
                Klient.println(Tlak/100);
                Klient.print(" hPa");
                Klient.print("<P>");
                Klient.print("Teplota: ");
                Klient.println((float)Teplota/10);
                Klient.print(" Celzia");   
                Klient.print("</H3>");
                Klient.println("</body>");
                Klient.println("</html>");
            }
           
            if(c == '\n'){
                prazdnyRiadok = true;
            }
            else if(c != '\r'){
                prazdnyRiadok = false;
                   /*ak klient nepošle dvakrát za sebou \r a \n
                   znamená to, že stále odosiela dáta*/
            }
        }
 
        Klient.stop(); //komunikácia je skončená
    }
}
 

Jadrom skeče je príklad webového servera z minulých častí. Pribudlo pár nových riadkov, ktoré si teraz vysvetlíme:

V sekcii načítavania knižníc pribudli dve nové – Wire.hBMP085.h. Obidve slúžia na prácu so senzorom. V sekcii definície premenných pribudli tieto premenné – dps triedy BMP085 a premenné Tlak, VyskaTeplota typu long, ktorým je hneď nastavená hodnota nula.

V sekcii void setup() pribudli tieto príkazy – Wire.begin() , ktorý aktivuje prácu so sbernicou I2C. Táto zbernica potrebuje k svojej činnosti poznať niekoľko dôležitých vecí, hlavne adresu I2C zariadenia. Nebojte sa, všetko dôležité si za nás vyčíta z knižnice BMP085, takže stačí iba aktivácia daným príkazom. Po krátkej pauzičke (jednu sekundu - delay) nasleduje inicializácia premennej dps príkazom dps.init. Ten má tri dôležité parametre. Prvým je mód presnosti a môže dosahovať tieto hodnoty:

  1. MODE_ULTRA_LOW_POWER -  značí presnosť 0,06hPa
  2. MODE_STANDARD - značí presnosť 0,05hPa
  3. MODE_HIGHRES  - značí presnosť 0,04hPa
  4. MODE_ULTRA_HIGHRES  - značí presnosť 0,03hPa

Musíme si uvedomiť, že čím je mód presnosti merania a výpočtu vyšší, tak aj samotný výpočet trvá dlhšie. Zároveň sa môže stať, že zariadenie bude až príliš citlivé a zobrazované hodnoty budú „poskakovať“. Najvhodnejšie je použiť štandardnú hodnotu.

Druhým parametrom je číslo, ktorým sa udáva buď tlak v danom mieste alebo nadmorskú výšku v danom mieste. To, či sa jedná o tlak alebo nadmorskú výšku určuje práve tretí parameter typu true alebo false.

V našom prípade sme použili príkaz dps.init(MODE_STANDARD, 18500, true), čím sme zadefinovali meranie o štandardnej kvalite. Bod merania je 185 metrov nad morom, čo je poloha v Novom Meste nad Váhom. Parameter true potvrdzuje, že sa jedná o nadmorskú výšku.

Ak by sme chceli zadať bod merania podľa aktuálneho tlaku v danom bode, tak použijeme príkaz dps.init(MODE_STANDARD, 101850, false), kde 101850 je hodnota tlaku v Pascaloch (t.j. 1018,50 hPa) a parameter false značí, že sa nejedná o nadmorskú výšku, ale o tlak v danom mieste. Aktuálny tlak zistíme na stránkach zaoberajúcich sa meteorológiou, napríklad www.shmu.sk a nadmorskú výšku v danom bode môžeme zistiť na stránke http://www.altitude-maps.com/ .

V sekcii void loop() sa nachádzajú samotné príkazy na prácu s modulom BMP085. Príkaz dps.getPressure(&Tlak) vyčíta z modulu aktuálny tlak a hodnotu uloží do premennej Tlak, príkaz dps.getAltitude(&Vyska) vyčíta a vypočíta nadmorskú výšku, ktorú uloží do premennej Vyska a príkaz dps.getTemperature(&Teplota) vyčíta z modulu teplotu a uloží do premennej Teplota.

Veď som hovoril, že to bude jednoduché! Ďalej nasleduje už nám dobre známy kód HTML stránky. Keďže modul vracia čísla bez desatinnej čiarky, pre správne zobrazenie tlaku a výšky musíme vyčítané hodnoty podeliť číslom 100 a teplotu číslom 10. Všimnime si nové príkazy – tagy <H1> a<H3> jazyka HTML pre zmenu veľkosti písma. Tag <P> vytvorí na stránke nový riadok.

Kód preložíme, nahráme do Arduina a Arduino pripojíme k počítaču pomocou ethernet kábla. Do prehliadača zadáme IP adresu Arduina a na obrazovke uvidíme niečo ako na obrázku č.4.


Nabudúce spojíme meranie teploty s ovládaním LED diód a spínačov na diaľku cez Internet.

 

 

 

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá