Image
4.6.2016 4 Comments

ARDUINO – programovanie mikrokontrolérov Atmel /15.časť

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

V minulej časti sme k Arduinu pripojili dva reléové spínače a naučili sme sa ich ovládať cez webové rozhranie. A to nielen v lokálnej počítačovej sieti, ale sme si ukázali, ako nastaviť router tak, aby sme to dokázali cez Internet a akéhokoľvek miesta na svete. Zároveň sme si ukázali, ako spojiť dve čiastkové skeče do jedného fungujúceho programu. Jedna časť zobrazovala tlak a teplotu so senzora BMP085 a druhá časť ovládala spínacie relé. To relé mohlo na diaľku zapnúť napríklad kúrenie. Bolo by však veľmi dobré, keby sme dokázali obidve doteraz na sebe nezávislé časti programu medzi sebou logicky previazať. Čo tak vytvoriť program, ktorý nielenže dokáže kúrenie na diaľku zapnúť a vypnúť, ale na základe merania aj udržiavať žiadanú teplotu. V podstate vytvoriť akýsi softvérový termostat. Predstavme si situáciu, že máme niekde rekreačnú chatu, vybavenú elektrickým kúrením, elektrickým bojlerom na ohrev vody a samozrejme internetovým pripojením. My chceme zapnúť kúrenie a ohrev vody na diaľku a skôr, aby keď prídeme, bola chata už pekne vyhriata a voda teplá. A to si dnes ukážeme.

Čo k tomu budeme potrebovať?

V dnešnej časti využijeme taký istý hardvér ako v minulej časti – teda Arduino, ethernet shield, dva reléové spínače a senzor BMP085 (BMP180), z ktorého dnes využijeme iba snímač teploty.. Tým budeme zapínať a vypínať kúrenie. Tým druhým budeme zapínať a vypínať napríklad elektrický bojler na ohrev teplej vody. Pre didaktické účely predpokladajme, že bojler stačí len zapnúť a vypnúť, o zvyšok sa postará v bojleri namontovaný termostat. V prípade kúrenia si predstavme, že máme iba elektrickú špirálu bez termostatu.

Princíp vykurovania

Špirálu kúrenia je potrebné obládať, aby vykurovala tak, aby sa v miestnosti udržiavala určitá – žiadaná teplota, napríklad pohodových 23 stupňov. Niekto povie, že je to jednoduché – program vytvoríme tak, že senzor bude snímať teplotu, a ak bude teplota v miestnosti menšia ako 23 stupňov, tak sa špirála zapne a ak bude teplota vyššia ako 23 stupňov, tak sa špirála vypne. Áno, mohlo by to tak byť, ale... Keby sme to urobili takto, tak sa špirála neustále zapínala a vypínala v okolí nastavenej teploty, stačilo by, keby sa teplota zmenila o 0,1 stupňa. Preto sa v podobných prípadoch – a v kúrení zvlášť ponecháva určitý teplotný interval, pretože šírenie tepla, ohrev aj chladnutie má určitú zotrvačnosť. Tomuto intervalu sa hovorí hysterézia (hysterézna slučka). My to teda urobíme takto: ak je teplota v miestnosti menšia ako 22,5 stupňov, tak sa zapne špirála. Miestnosť sa vyhrieva. Ak teplota v miestnosti dosiahne 23,5 stupňov, tak sa špirála vypne a miestnosť sa bude ochladzovať až do teploty 22,5 stupňov, kedy sa špirála zase zapne. Teplotný interval jeden stupeň je dostatočný na udržanie pohodovej teploty v miestnosti a zároveň nespína špirálu často a tak ju zbytočne neničí. Na podobnom princípe fungujú ak mechanické bimetalové termostaty, ktoré sa nachádzajú v bežných ohrievačoch alebo žehličkách.

Čím viac budeme tento interval zmenšovať (napr. 22,8 až 23,2 stupňov), tým bude hysterézna slučka menšia a špirála bude častejšie spínaná a namáhaná.

Skeč programu

Zdrojový text programu 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);
//IPAddress gateway(192, 168, 100, 1);
// port servera
EthernetServer mojServer(80);
Adafruit_BMP085 bmp;
#define RELAY1  2                       
#define RELAY2  3
boolean kurenie;
boolean bojler;
 
void setup()
{
  // inicializácia siete
  Ethernet.begin(mac, ip);
  // inicializácia servera
  mojServer.begin();
  Wire.begin();
  bmp.begin();
  delay(1000);
  // nastavíme piny D2 a D3 ako výstup pre relé
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  kurenie = false;
  bojler = false;
  Spirala_VYP();
  Bojler_VYP();
  delay(1000);
}
 
void loop()
{
  float teplota = bmp.readTemperature();
   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)kurenie = true;
            if(buffer.indexOf("rele1=0")>=0)kurenie = false;
            if (kurenie == true && teplota < 22.50) {Spirala_ZAP();}
            if (kurenie == true && teplota > 23.50) {Spirala_VYP();}
            if (kurenie == false) {Spirala_VYP();}
                        
            if(buffer.indexOf("rele2=1")>=0)bojler = true;
            if(buffer.indexOf("rele2=0")>=0)bojler = false;
            if (bojler == true){Bojler_ZAP();}
             else
              {Bojler_VYP();}
           
            // 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</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("Ovládač kúrenia a bojlera");    
            client.print("</H1>");
            client.print("<P>");
            client.print("<H3>");                    
            client.print("Teplota: ");
            client.print(teplota);
            client.print(" Celzia");   
            client.print("</H3>");
            client.print("<P>");
        
            // vytvorí formulár pre relé kúrenia
            if (kurenie == false){
                  client.print(" Kúrenie je <font color='red'>VYPNUTÉ</font>");
                    }else{
                  client.print(" Kúrenie je <font color='green'>ZAPNUTÉ</font>");
                  }
            client.println("</br>");
           
            if (digitalRead(2)){
                  client.print(" Špirála <font color='red'>nekúri</font>");
                    }else{
                  client.print(" Špirála <font color='green'>kúri</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 relé bojlera
            if (digitalRead(3)){
                  client.print(" Bojler je <font color='red'>VYPNUTÝ</font>");
                   }else{
                  client.print("Bojler 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();
 
         }
      }
   }
}
 
void Spirala_ZAP() {
  digitalWrite(RELAY1,LOW);
}
 
void Spirala_VYP() {
  digitalWrite(RELAY1,HIGH);
}
 
void Bojler_ZAP() {
  digitalWrite(RELAY2,LOW);
}
 
void Bojler_VYP() {
  digitalWrite(RELAY2,HIGH);
}

V deklaračnej časti pribudli dve nové premenné kureniebojler, obe typu boolean. To znamená, že dosahujú iba dve hodnoty, a to pravda (true) a nepravda (false).

V sekcii setup() tieto dve premenné prednastavíme na hodnotu false. Tomuto hovorievame „vynulovanie“ premenných. Ďalej v tejto sekcii pribudli dve nové funkcie Spirala_VYP()Bojler_VYP(). Kód týchto funkcií je nadefinovaný na samom konci skeče. Obsahujú iba jeden príkaz, ktorý už poznáme z minulej časti – zaslaním logickej jednotky alebo nuly na príslušný port vypíname alebo zapíname vybrané relé. Nasleduje jednosekundová pauza na ustabilizovanie systému.

V sekcii loop() došlo k jednoduchej zmene. Pribudla nová premenná teplota typu float. Do tejto premennej sa bude ukladať hodnota získaná zo senzora BMP. Ak chceme kúrenie zapnúť, webová stránka zašle parameter rele1=1. Ak chceme kúrenie vypnúť, webová stránka zašle parameter rele1=0. Arduino príjme danú sekvenciu a podľa toho nastaví boolovskú premennú kurenie na hodnotu true alebo false. Musíme si uvedomiť, že týmto len aktivujeme kúrenie. Či sa bude naozaj kúriť, teda či špirála bude zapnutá alebo vypnutá, rozhodne teplota v miestnosti.

Takže príkazom if (kurenie == true && teplota < 22.50) kontrolujeme, či je kúrenie aktivované a zároveň (znak &&) je teplota nižšia ako 22,5 stupňa. Ak je celý výraz pravdivý (true), tak sa vykoná príkaz Spirala_ZAP().

V príkaze if (kurenie == true && teplota > 23.50) kontrolujeme, či je kúrenie aktivované a zároveň (znak &&) je teplota vyššia ako 23,5 stupňa. Ak je celý výraz pravdivý (true), tak sa vykoná príkaz Spirala_VYP().

Príkaz if (kurenie == false){Spirala_VYP();} zaistí, že ak kúrenie nie je aktivované, tak sa špirála vypne, bez ohľadu na teplotu v miestnosti.

Podobne je to u premennej bojler. Na základe parametra odoslaného webovou stránkou nastavujeme premennú bojler na hodnotu true alebo false. V ďalšom kroku podľa nastavenia premennej voláme funkcie Bojler_ZAP() pre zapnutie alebo Bojler_VYP() pre vypnutie bojlera. Všimnime si, že tu teplotu nekontrolujeme, nie je dôležitá.

Ďalšie časti v tejto sekcii sú nám už známe, pribudlo iba zobrazovanie stavu aktivácie kúrenia. Nasleduje tvorba stránky v jazyku HTML, tak ako to už poznáme.

Program napíšeme, skompilujeme a nahráme do Arduina. V prehliadači zadáme IP adresu a na obrazovke uvidíme základnú obrazovku systému (obr. č. 1. ). Predstavme si, že chceme ísť na chatu a tak zapneme kúrenie (obr.č.2). Vidíme, že kúrenie je zapnuté a keďže je teplota 22 stupňov, špirála kúri. Chata sa ohrieva a až teplota prekročí 23,5 stupňov, špirála prestane hriať (obr.č.3). Všimnime si, že aj keď špirála nehreje, kúrenie je zapnuté (aktivované). Teplota v miestnosti postupne klesá až k hodnote 22,5 stupňa (obr.č.4). Akonáhle prekročí túto hodnotu, špirála sa znova zapne a začne hriať (obr.č.5). Zároveň môžeme nezávisle na teplote zapnúť ohrev teplej vody bojlerom (obr.č.6).

Nabudúce budeme snímať analógové hodnoty a tie budeme spracovávať.

 


 

 

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 zbaviť fotky hmly

08.12.2016 11:59

Hmla alebo dym sú často veľmi kreatívne nástroje. No všetkého veľa škodí. Fotka potom stráca kontrast a v podstate na nej nič nevidieť. Hmlu môžete neraz následnými úpravami odstrániť alebo zredukovať ...

Ako na to

Užitočné SW nástroje

08.12.2016 11:53

AllDup v4.0.3 Určenie: program na vyhľadávanie a odstraňovanie duplicitných súborov Vlastnosti: duplicitné súbory sa vyhľadávajú len na zvolených diskových jednotkách alebo len v rámci vybraných ...

Ako na to

Fotografovanie s bleskom

08.12.2016 11:47

Ak máte moderný fotoaparát so vstavaným alebo externým bleskom, zdá sa vám téma článku triviálna. Jednoducho nastavíte vhodný režim, vyberiete najlepšiu kompozíciu záberu, exponujete a o zvyšok sa už ...

4 Comments

  1. cim dalej tym horsie? reakcia na: Seriál: ARDUINO – programovanie mikrokontrolérov Atmel.
    27.6.2016 07:06
    Práve kvôli chybám ako opisujú predchádzajúci diskutujúci podobné články ďalej ani nečítam (chýbajuce odkazy, nutnosť používať vyhľadávač, akoby autori neboli schopní pridať odkazy na ostatne diely (keď to už nerobí redakčný systém automaticky), formátovanie zdroj. kódu....) . akoby sa IT vracala kamsi do počítačového praveku - a to nielen na Slovensku... Reakcia redakcie ma dorazila - to, čo je inde samozrejmosťou, je pre nich vraj výborný nápad... A tak ani nemôžem poďakovať za článok, pretože neviem o čom je. Ešteže tu máme možnosť čítať v iných jazykoch. Zablúdil som sem náhodou a sľubujem, že nasledujúcich niekoľko rokov budem odkazy na pcrevue opäť ignorovať tak, ako som to robil doteraz. S pozdravom "pcrevue ani zadarmo!" Fero
    Reagovať
  2. Zdrojove kody reakcia na: Seriál: ARDUINO – programovanie mikrokontrolérov Atmel.
    5.6.2016 09:06
    Myzlim ze by bolo vhodnejsie graficky oddelit zdrojove kody. Takto to nieje moc citatelne :)
    Reagovať
  3. help me reakcia na: Seriál: ARDUINO – programovanie mikrokontrolérov Atmel.
    24.5.2016 16:05
    poprosil by som Vas, ak by to bolo mozne (a HTML to umoznuje), vlozit prepojenie na serial (kde sa to nachadza?) a jednotlive casti (napr. do 'V minulej časti sme k Arduinu pripojili ...'), pripadne clanky autora (napr. do ' Autor: Miroslav Oravec '), atd. Dakujem, Vas citatel
    Reagovať
    • RE: help me reakcia na: help me
      Autor: Lea
      6.6.2016 16:06
      Dobrý deň, ďakujeme za výborný nápad, už sme sa o tom v redakcii rozprávali a pripravíme zaujímavé seriály, kde nájdete všetky časti, ktoré Vás zaujímavú.
      Reagovať

Vyhľadávanie

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

Najnovšie videá