Image
6.4.2016 0 Comments

ARDUINO - meranie teploty a ovládanie spínačov Arduina cez Internet /14.č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ť senzor teploty a tlaku. Ukázali sme si, ako z modulu vyčítať žiadané hodnoty, ako pracovať s knižnicou BMP085.h a ako tieto hodnoty po príslušnej úprave zobraziť na webovej stránke pomocou jazyka HTML.  Dnes si ukážeme prácu s novšou knižnicou Adafruit_BMP085.h. A ešte niečo! Pamätáme si ešte na program, ktorým sme ovládali LED diódy cez webové rozhranie? Tak ten dnes zakomponujeme k meraniu teploty do jedného  programu. Vytvoríme si aplikáciu, ktorá bude nielen merať teplotu, tlak a výšku, ktorú následne zobrazí na webovej stránke. Pomocou tejto stránky zároveň dokážeme ovládať dve relé, pripojené k Arduinu. Tieto relé môžu spínať aj zariadenia na 230V, takže napríklad kúrenie, svetlo alebo klimatizáciu. A aby sme to dokázali vykonať na diaľku, ukážeme si, ako náš server pripojiť do Internetu.  

Čo k tomu budeme potrebovať?

Samozrejme naše Arduino s ethernetovým shieldom, teplotný a tlakový senzor BMP. Namiesto LED diód pripojíme reléový modul. Reléový modul obsahuje samotné relé alebo dokonca viac kusov relé a pomocné obvody, aby sme takýto modul mohli veľmi jednoducho pripojiť k Arduinu bez potrebných elektronických znalostí. My použijeme modul s dvomi relátkami, tak ako je na obrázku č.1.


Obr.č.1

Všimnime si, že tento modul obsahuje aj niekoľko LED diód, ktoré signalizujú stav zopnutia jednotlivých relé. Zelená LED dióda signalizuje napájanie modulu, červené LED diódy signalizujú zopnutie jedného alebo druhého relé (je možné, že sa vám podarí zakúpiť iný reléový modul – nevadí, princíp pripojenia a práce je rovnaký). Na pripojenie modulu k Arduinu použijeme štyri vodiče typu zdierka – pin (female-male). Modul relé pripojíme k Arduinu tak, že vývod Vcc modulu pripojíme k pinu 5V na Arduine, vývod GND na GND. Vývod – ovládanie prvého relé In1 pripojíme k pinu D2 a ovládanie druhého relé In2 k pinu D3 Arduina. Na silové kontakty každého relé môžeme pripojiť vhodný spotrebič, napríklad ako podľa obr.č. 2.


Obr.č.2

Ako sme spomenuli vyššie, do dnešného programu spojíme dve skeče, ktoré sme si vyskúšali v predchádzajúcich častiach. Obsah tej dnešnej skeče je na výpise č.1:

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
 
// MAC adresa je vymyslená
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 
// IP adresa - nastaviť podľa seba!
IPAddress ip(192,168,100,191);
// port servera
EthernetServer mojServer(80);
 
Adafruit_BMP085 bmp;
#define RELAY1  2                       
#define RELAY2  3
 
void setup()
{
  // inicializácia siete
  Ethernet.begin(mac, ip);
  // inicializácia servera
  mojServer.begin();
  Wire.begin();
  if (!bmp.begin())
      {
      Serial.println("Senzor BMP nie je pripojený!");
      while (1) {}
      }
  delay(1000);
  // nastavíme piny D2 a D3 ako výstup pre relé
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
}
 
void loop()
{
  // keď je klient pripojený, zistíme, či sú odeslané dáta
  // od klienta k nám
   EthernetClient client = mojServer.available();
   String buffer = "";
   if (client){
        boolean prazdnyRiadok = true;
  
   while (client.connected() && client.available()){
            // ak klient odosiela HTTP požiadavku
         char c = client.read(); //čítaj znaky v bajtoch od klienta
         buffer = buffer + c;
         if(c == '\n' && prazdnyRiadok){
            if(buffer.indexOf("rele1=1")>=0)digitalWrite(RELAY1,LOW);
            if(buffer.indexOf("rele1=0")>=0)digitalWrite(RELAY1,HIGH);
            if(buffer.indexOf("rele2=1")>=0)digitalWrite(RELAY2,LOW);
            if(buffer.indexOf("rele2=0")>=0)digitalWrite(RELAY2,HIGH);
           
            // odošle klasickú hlavičku HTML stránky
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println("Refresh: 1");
            client.println();
            client.println("<!DOCTYPE HTML>");
         
            // tu už je klasická html stránka
            client.println("<html>");
            client.println("<head>");
           
            // Názov stránky
            client.println("<title>Arduino Server - ovládač relé</title>");
            // kódovanie - aby sme mohli použiť diakritiku
            client.println("<meta charset='UTF-8'>");
            client.println("</head>");
            client.println("<body>");
                       
            // vypíše text
            client.print("<H1>");
            client.println("Ahoj, ja som Tvoj Arduino teplotný web server :-)");    
            client.print("</H1>");
            client.print("<P>");
         
            client.print("<H3>");
            client.print("Výška: ");
            client.print(bmp.readAltitude());
            client.print(" metrov");
            client.print("<P>");
            client.print("Tlak: ");
            client.print(bmp.readPressure());         
            client.print(" Pa");
            client.print("<P>");  
            client.print("Teplota: ");
            client.print(bmp.readTemperature());              
            client.print(" Celzia");   
            client.print("</H3>");
            client.print("<P>");
        
            // vytvorí formulár pre prvé relé
            if (digitalRead(2)){
                  client.print(" Relé č.1 je <font color='red'>VYPNUTÉ</font>");
                    }else{
                  client.print(" Relé č.1 je <font color='green'>ZAPNUTÉ</font>");
                  }
            client.println("</br>");
         
            // tu upraviť IP adresu podľa potreby! 
            client.print("<FORM action='http://192.168.100.191' method='GET'>");
            client.print("<P> <INPUT type='radio' name='rele1' value='1'>Zapnúť");
            client.print(" <INPUT type='radio' name='rele1' value='0'>Vypnúť");
            client.print("<P> <INPUT type='submit' value='Nastaviť'> </FORM>");
 
            client.println("</br>");
 
            // vytvorí formulár pre druhé relé
            if (digitalRead(3)){
                  client.print(" Relé č.2 je <font color='red'>VYPNUTÉ</font>");
                   }else{
                  client.print(" Relé č.2 je <font color='green'>ZAPNUTÉ</font>");
                  }
            client.println("</br>");
            
            // tu upraviť IP adresu podľa potreby!
            client.print("<FORM action='http://192.168.100.191' method='GET'>");
            client.print("<P> <INPUT type='radio' name='rele2' value='1'>Zapnúť");
            client.print("<INPUT type='radio' name='rele2' value='0'>Vypnúť");
            client.print("<P> <INPUT type='submit' value='Nastaviť'> </FORM>");
               
            client.println("</body>");
            client.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*/
            }
 
         //ukončí prenos
         client.stop();
 
         }
      }
   }
}
 

Obsah výpisu skeče je nám už dobre známy, my si teraz iba vysvetlíme nové príkazy a úpravy. Ako prvé sme vymenili knižnicu BMP085.h za knižnicu Adafruit_BMP085.h. Pre prácu s ňou stačí v deklaračnej časti vytvoriť inštanciu bmp, ktorá je z triedy Adafruit_BMP085. Ak chceme pomocou tejto inštancie vyčítavať teplotu, použijeme príkaz bmp.readTemperature(), ak chceme vyčítavať tlak, použijeme príkaz bmp.readPressure() a pre výšku použijeme príkaz bmp.readAltitude() (tá môže ešte obsahovať parameter tlaku na úrovni mora, aby sme dostali správnu hodnotu výšky, čo si ukážeme nabudúce). Tieto príkazy v podstate nahradili príkazy z knižnice BMP085.h.

Ďalej sú v deklaračnej časti príkazom #define nadefinované nové konštanty Relay1Relay2, ktoré obsahujú čísla digitálnych vývodov Arduina (teda 2 a 3). Potom tieto vývody nastavíme ako výstup jednoduchým príkazom napríklad pinMode(RELAY1, OUTPUT). Na rozdiel od LED diód, relátka sa spínajú tak, že na ich riadiaci vstup privedieme logickú nulu, nie logickú jednotku! Takže ak chceme relé č.1 zopnúť, zadáme príkaz digitalWrite(RELAY1,LOW), ak ho chceme vypnúť, zadáme príkaz digitalWrite(RELAY1,HIGH) (presne naopak ako u diód). Vo formulároch sme nahradili parametre led1led2 parametrami rele1rele2.

Text skeče napíšeme (alebo prekopírujeme) do vývojového prostredia IDE, preložíme a nahráme do Arduina. Ale čo to? Pri preklade sa v dolnom okne prostredia zobrazí hlásenie Low memory available, stability problems may occur (Málo dostupnej pamäte, môžu sa objaviť problémy so stabilitou.) . Toto upozornenie netreba vysvetľovať, my si nabudúce povieme, ako riešiť tento problém.

Po pripojení ethernetového shieldu, senzora BMP085 (alebo BMP180) a modulu relé (obr.č.3) pripojíme Arduino k našej počítačovej sieti alebo k počítaču. Do prehliadača nastavíme IP adresu, akú sme zadali aj v skeči a na obrazovke uvidíme niečo ako na obrázku č.4. Jednoduchým klikaním takto môžeme zapínať a vypínať jednotlivé relé.


Obr.č.3


Obr.č.4

Zatiaľ sme naše aplikácie používali v lokálnej sieti. Čo urobiť, aby sme mohli ovládať kúrenie či klimatizáciu aj vzdialene cez Internet? Ako prvé si musíme cestou svojho poskytovateľa internetového pripojenia zabezpečiť verejnú IP adresu. Ten nám ju za určitý poplatok pridelí. Verejná IP adresa je  viditeľná a jedinečná v celom Internete, pre náš príklad nech to je 87.103.23.35 (táto adresa je vymyslená!). Potom pripojíme Arduino k routru, ktorý nám zabezpečuje pripojenie do Internetu. Keďže router ochraňuje našu malú lokálnu či domácu sieť od pred zásahom z Internetu, zatiaľ nebude náš arduinovský server zvonku prístupný. Preto musíme nastaviť náš router tak, aby  umožňoval vstup požiadaviek z Internetu, ale iba na konkrétnu lokálnu IP adresu a port, ktorý bude obsluhovať práve Arduino. V tomto prípade sme Arduinovému serveru pridelili lokálnu IP adresu 192.168.100.191 a port 80. Pripojíme sa k routru a vyhľadáme položku v sekcii NAT na presmerovanie požiadaviek. Na routroch od firmy SMC je to položka Virtual server (pre routre od iných výrobcov to môže byť inak – pozrite do dokumentácie routra!). Tu nastavíme presmerovanie, ako je uvedené na obrázku č.5.


Obr.č.5

Odteraz keď niekto zadá do prehliadača našu verejnú adresu, požiadavka bude presmerovaná na Arduino a tá odošle webovú stránku do Internetu. Nesmieme však zabudnúť na jednu dôležitú vec – a to upraviť kód skeče! Vo formulároch v tagu FORM musíme zadať verejnú IP adresu, napr. <FORM action='http:// 87.103.23.35' method='GET'>, inak to nebude fungovať!

A odteraz môžeme z ľubovoľného miesta na svete, kde je prístupný Internet, zapínať a vypínať kúrenie, svetlo alebo klimatizáciu.

Prípadné otázky, námety a postrehy môžete zasielať na adresu arduino@cevaro.sk.

 

                                          

 

             

 

 

 

 

 

 

Zobrazit Galériu

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

Mohlo by Vás zaujímať

Ako na to

Ako funguje GPU v grafickej karte

08.12.2016 10:39

Nie všetky počítače dramaticky závisia od GPU alebo grafickej karty, ale v PC na hranie hier je to prakticky najdôležitejší komponent. A v mnohých ohľadoch aj najkomplikovanejší. Zatiaľ čo hlavný pro ...

Ako na to

Čo robiť keď firme chýba IT expert?

08.12.2016 10:36

IT projekty majú z hľadiska nárokov na kapacity špecialistov premenlivý charakter a v určitých fázach často treba posilniť kapacity IT oddelení externými odborníkmi. Riešením je IT ousourcing, ako fo ...

Ako na to

Ako funguje sandbox?

08.12.2016 15:36

Každá aplikácia môže pre operačný systém počítača či mobilného zariadenia predstavovať potenciálnu hrozbu, a to aj v prípade, ak neobsahuje žiadne bloky škodlivého kódu. Murphyho zákony neúprosne defi ...

Žiadne komentáre

Vyhľadávanie

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

Najnovšie videá