Image
2.7.2016 4 Comments

Seriál: ARDUINO/Atmel – Nabíjanie akumulátorov a ovládanie svetla

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

V minulej časti sme k Arduinu pripojili dva reléové spínače, teplotný snímač a naučili sme sa ich ovládať cez webové rozhranie. Vytvorili sme jednoduchý diaľkovo ovládaný vykurovací systém s určitou inteligenciou, ktorý sám udržiava žiadanú teplotu na chate. Predstavme si situáciu, že na tejto chate máme na streche umiestnené solárne panely, ktoré vyrábajú elektrickú energiu. K týmto panelom budeme mať pripojené akumulátory, kde sa bude zo slnka vytvorená energia uskladňovať, aby sme ju využili práve v noci na osvetlenie chaty a jej okolia, keď už slnko nesvieti. Musíme si uvedomiť, že akumulátor nie je bezodný, takže v prípade, že by sme do neho uložili viac energie ako je schopný prijať, došlo by k jeho deštrukcii. A keďže akumulátory obsahujú chemické látky, poškodenie akumulátora môže spôsobiť výbuch s následným požiarom alebo poleptaním osôb a okolia. A tak musíme po nabití akumulátora zabezpečiť jeho odpojenie od solárnych panelov. Dostatočným znakom nabitia akumulátora je jeho napätie. Preto sa dnes naučíme Arduinom snímať napätie, porovnávať ho so žiadanou hodnotou a na základe získaných hodnôt ovládať spínače. Samozrejme – toto všetko na diaľku cez Internet.

Čo k tomu budeme potrebovať?

Okrem samotného Arduina s ethernet shieldom použijeme naše dobre známe dva reléové spínače. Na snímanie napätia využijeme v Arduine vstavané analóg-digitálne prevodníky.

Čo je To AD-prevodník?

AD prevodník (anglicky ADC – Analog to Digital Converter = Analógovo-digitálny prevodník) je elektronické zariadenia na prevod analógového signálu (veličiny) na digitálny signál. Analógovým signálom býva najčastejšie napätie. Analógový signál sa privedie na vstup AD prevodníka, ktorý vykoná prevod. Výsledkom prevodu je číslo, ktoré zodpovedá veľkosti vstupného analógového signálu. Práve AD prevodníky sa najčastejšie používajú v prístrojoch a zariadeniach, ktoré merajú analógové veličiny, ako sú rôzne multimetre, ale aj digitálne teplomery, tlakomery, výškomery a podobne.

AD prevodník v Arduine je 10 bitový, takže môže nadobúdať hodnoty 210 , čo je 1024 hodnôt (od nuly po 1023). Takže snímané napätie napríklad 5V môže rozdeliť na 1024 dielikov, čo znamená, že presnosť je 5:1024 = 0,0048 Voltu na dielik. Táto presnosť päť stotín Voltu je naozaj viac ako dostatočná! Arduino Uno má takýchto prevodníkov až šesť (Arduino Mini a Nano až osem a Arduino Mega dokonca šestnásť)! Tomu príslúchajú vývody A0 až A5, ktoré sa volajú analógové vstupy. To znamená, že môžeme na jednom Ardunine snímať šesť analógových signálov. Aj keď sa tieto analógové vstupy používajú na pripojenie analógových senzorov, môžeme ich použiť ako klasické digitálne vstupy a výstupy.

Na vyčítanie hodnoty z analógového vstupu použijeme príkaz analogRead(pin). Takže príkazom

int hodnota = analogRead(A0)

 
vykonáme prevod napätia na analógovom vstupe A0 na číslo, ktoré sa uloží do premennej s názvom hodnota.
Zapojenie

Aby sme si mohli odskúšať náš program, ktorý sme si predstavili vyššie, budeme simulovať meniace sa napätie na akumulátore pomocou potenciometra. Ten pripojíme podľa obrázku č.1. Jeden koniec pripojíme do pinu 5V, druhý do pinu GND a (stredný) vývod bežca potenciometra do pinu A0. Otáčaním potenciometra sa bude na analógovom vstupe A0 meniť napätie, predstavujúce napätie akumulátora. Ak bude napätie malé (pod 500 dielikov), znamená, že akumulátor je vybitý, a treba ho pripnúť k solárnemu panelu. Ak bude napätie väčšie ako 900 dielikov, tak je akumulátor nabitý a treba ho od solárneho panelu odpojiť. Všimnime si, že aj tu sme vytvorili akúsi hysteréznu slučku. Akumulátor miluje cykly nabíjanie – vybíjanie a preto je dostatočne široká hysterézna slučka žiadúca!

Poznámka:

Pre naše didaktické účely si predstavujeme, že máme 5-voltový akumulátor. V skutočnosti sú akumulátory na vyššie napätie, napríklad  na 12V alebo 24V. A keďže vstup Arduina môže merať iba napätie do 5V (niektoré typy miniatúrnych verzií Arduina len do 3,3V!), museli by sme použiť odporový delič (obr.č.2).

Náš program

Na výpise je obsah skeče nášho programu. Mnohé časti sú nám už dobre známe, preto si popíšeme iba nové príkazy:

#include <SPI.h>
#include <Ethernet.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);
 
#define RELAY1  2                       
#define RELAY2  3
boolean nabijanie;
boolean osvetlenie;
 
void setup()
{
  // inicializácia siete
  Ethernet.begin(mac, ip);
  // inicializácia servera
  mojServer.begin();
 
  delay(1000);
  // nastavíme piny D2 a D3 ako výstup pre relé
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  nabijanie = false;
  osvetlenie = false;
  Odpoj_Baterku();
  Svetlo_VYP();
  delay(1000);
}
 
void loop()
{
   int sensorValue = analogRead(A0);
   float voltage = sensorValue * (5.0 / 1023.0);
     
  // 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 clienta
         buffer = buffer + c;
         if(c == '\n' && prazdnyRiadok){
           
            if(buffer.indexOf("rele1=1")>=0)nabijanie = true;
            if(buffer.indexOf("rele1=0")>=0)nabijanie = false;
           
            if (nabijanie == true && sensorValue < 500)
              {Pripoj_Baterku();}
            if (nabijanie == true && sensorValue > 900)
              {Odpoj_Baterku();}
            if (nabijanie == false)
              {Odpoj_Baterku();}
                      
            if(buffer.indexOf("rele2=1")>=0)osvetlenie = true;
            if(buffer.indexOf("rele2=0")>=0)osvetlenie = false;
            if (osvetlenie == true)
              {Svetlo_ZAP();}
             else
              {Svetlo_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č nabíjača a svetla");    
            client.print("</H1>");
            client.print("<P>");
            client.print("<H3>");                    
            client.print("Napätie: ");
            client.print(voltage);   
            client.print(" Voltov");   
            client.print("</H3>");
            client.print("<P>");
 
            client.print("<H3>");                    
            client.print("Analógový vstup: ");
            client.print(sensorValue);   
            client.print(" dielikov");   
            client.print("</H3>");
            client.print("<P>");
         
            // vytvorí formulár pre nabíjač
            if (nabijanie == false){
                  client.print(" Nabíjač je <font color='red'>ODPOJENÝ</font>");
                    }else{
                  client.print(" Nabíjač je <font color='green'>PRIPOJENÝ</font>");
                  }
            client.println("</br>");
           
            if (digitalRead(2)){
                  client.print(" Nabíjač <font color='red'>nenabíja</font>");
                    }else{
                  client.print(" Nabíjač <font color='green'>nabíja</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 osvetlenie
            if (digitalRead(3)){
                  client.print("Svetlo je <font color='red'>VYPNUTÉ</font>");
                   }else{
                  client.print("Svetlo 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 Pripoj_Baterku() {
  digitalWrite(RELAY1,LOW);
}
 
void Odpoj_Baterku() {
  digitalWrite(RELAY1,HIGH);
}
 
void Svetlo_ZAP() {
  digitalWrite(RELAY2,LOW);
}
 
void Svetlo_VYP() {
  digitalWrite(RELAY2,HIGH);
}
 

V definičnej časti sú nové premenné nabijanieosvetlenie typu boolean.

V časti setup() okrem inicializácie siete nastavíme tieto premenné na hodnotu false. To preto, aby sa po pripojení Arduina na napájanie obe relé vypli.

V slučke loop() hneď na začiatku definujeme premennú sensorValue typu int a do nej uložíme hodnotu získanú z AD prevodníka na pine A0. Tú vyčítame príkazom analogRead(A0).  Obsahom premennej sensorValue bude číslo od nuly (keď na bežci potenciometra nebude žiadne napätie) až po 1023 (keď na bežci bude napätie 5 Voltov).

Zároveň definujeme a použijeme premennú voltage typu float (desatinné číslo), kde uložíme matematickým prevodom dieliky na Volty, teda v rozsahu od 0 po 5 Voltov. To pre zrorumiteľnejšie zobrazovanie napätia na webovej stránke.

Nasleduje príjem dát z webovej stránky a vyhodnocovanie, tak ako ho poznáme z minulých častí. Budeme porovnávať premennú nabijanie a hodnotu premennej sensorValue. Ak je táto hodnota menšia ako 500 dielikov (baterka vybitá!) a nabíjanie je aktivované, tak vykonaj príkaz Pripoj_Baterku(). Ak je hodota väčšia ako 900 dielikov (baterka nabitá!) a nabíjanie je aktivované, tak vykonaj príkaz Odpoj_Baterku(). V prípade, že nabíjanie nie je aktivované (nabijanie ==false), tak vykonaj príkaz Odpoj_Baterku() bez ohľadu na dieliky. Ďalšie príkazy sú nám už známe.

Na konci skeče sa nachádza definícia príkazov Pripoj_Baterku, Odpoj_Baterku, Svetlo_ZapSvetlo_Vyp, ktoré ovládajú reléové spínače. Samozrejme, pomenili sme aj texty v príkazoch jazyka HTML, aby sa na obrazovke počítača v prehliadači zobrazovali logicky správne.

Skeč vytvoríme, preložíme a Arduino spustíme. Do prehliadača zadáme správnu IP adresu a na obrazovke sa zobrazí obrázok č.3. Vidíme, že baterka je nabitá a nepripojená. Keď na baterke klesne napätie, pripojíme baterku k panelom (obr.č.4). Keď sa baterka nabije (prekročí 900 dielikov), relé baterku odpojí, ale systém nabíjania je stále aktivovaný (obr.č.5). Ak po čase napätie na baterke klesne (pod 500 dielikov), relé automaticky baterku znovu pripojí k panelom (obr.č.6). Samozrejme, môžeme na diaľku zapínať a vypínať osvetlenie okolia chaty (obr.č.7).

Možno niekoho napadlo, že by bolo efektné vytvoriť webovú stránku aj s obrázkami, klikacími mapami a podobne. Lenže do pamäte Arduina sa obrázky nahrávať nedajú a ani obsiahle texty  HTML jazyka. Ale môžeme tieto veci uložiť na SD kartu a z nej ich vyčítať a odoslať klientovi! A ako sa s SD kartou pracuje si nabudúce ukážeme.

V prípade otázok a pripomienok píšte 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ť

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

4 Comments

  1. meranie napatia baterie reakcia na: Seriál: ARDUINO/Atmel - Nabíjanie akumulátorov a ovládanie svetla
    20.7.2016 12:07
    len mala poznamka: ako dokazem odmerat napatie baterie ked je k nej pripojena nabijacka? (vo faze nabijania)
    Reagovať
  2. kod reakcia na: Seriál: ARDUINO/Atmel - Nabíjanie akumulátorov a ovládanie svetla
    4.7.2016 14:07
    Už by to malo byť lepšie. L. Prípadne si pozrite ďalšie časti tu: http://www.pcrevue.sk/a/ARDUINO-3 PCR
    Reagovať
    • RE: kod reakcia na: kod
      2.9.2016 22:09
      Aj som sa to pokusil otvorit a pise, ze stranka neexistuje
      Reagovať
  3. Formatovanie reakcia na: Seriál: ARDUINO/Atmel - Nabíjanie akumulátorov a ovládanie svetla
    6.6.2016 13:06
    Zobrazovanie zdrojoveho kodu tu na stranke je velmi neprehladne.
    Reagovať

Vyhľadávanie

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

Najnovšie videá