V závěru minulého dílu jsme Vám slíbili, že další ukázka se bude týkat automatického otevírání pojezdové brány či vrat. Při vytváření této ukázky jsme se však v redakci shodli, že pro čtenáře (začátečníka) je problematika zbytečně komplexní, a to jak z pohledu programování, tak z pohledu zapojení. Pokročilé funkce knihovny Adeon si tedy ukážeme na světelném semaforu a automatické otevírání brány Vám přineseme v bonusovém dílu. Jelikož tento článek navazuje na články předchozí, doporučujeme vám malé opakování .

Zadání

Rekapitulaci máme za sebou a nyní se můžeme věnovat tématu. Představte si, že potřebujeme ovládat na dálku semafor, který je připojený k Arduinu a bude mít tyto funkce:

  • Rozsvícení jednotlivých barev semaforu

  • Změna jasu jednotlivých barev

  • Automatické zhasnutí po daném časovém intervalu

  • Restrikce možností ovládání semaforu dle uživatelských práv 

 

Zapojení semaforu

 

Semafor se skládá ze tří LED diod různé barvy. Abychom jednu z LED diod rozsvítili, musíme k ní přivést napájení prostřednictvím digitálního pinu Arduina. Jakmile je stav pinu v log. 1 (5 V DC) dioda se rozsvítí, při log. 0 zhasne. Můžeme také měnit jas pomocí PWM regulace. Pokud nevíte, jak na to, koukněte na tento článek.

Poznámka: Pro větší přehlednost textu zde nevkládáme celý kód, ale pouze jeho úryvky.

Vytvoření uživatelů

Nejprve si, stejně jako v předchozím článku, vytvoříme uživatele (potažmo telefonní čísla), kteří budou oprávněni zasílat SMS pro ovládání semaforu. Pro přehlednost a snadné pochopení problematiky si vytvoříme celkem tři uživatele, přičemž každý uživatel bude mít jiná přístupová práva – admin (pnAdmin), user (pnUser) a host (pnHost). 

Uživatel je definován proměnnou (polem znaků), ve které je uloženo telefonní číslo. Pokud bychom chtěli telefonní číslo napsat přímo do parametru funkce Adeon::addUser, můžeme tak učinit. Nakonec si ještě zavoláme funkci Adeon::printUsers pro výpis uživatelů na sériovou linku, abychom si ověřili, zda přidání proběhlo úspěšně.

void userInit(){
    //add users with ADMIN, USER or HOST rights
    adeon.addUser(pnAdmin, ADEON_ADMIN);
    adeon.addUser(pnUser, ADEON_USER);
    adeon.addUser(pnHost, ADEON_HOST);
    adeon.printUsers();
}

Vytvoření parametrů

Dalším důležitým krokem je samozřejmě vytvoření parametrů, na základě jejichž hodnot bude Arduino semafor ovládat. Jako první si nastavíme parametry pro jednotlivé LED diody – parRed červená, parYellow žlutá a parGreen zelená. Na změnu hodnoty parametru parRed si navážeme „callback” funkci callbackRed, která má za úkol na základě předané hodnoty ovládat červenou LED diodu. Stejným způsobem definujeme i funkce callbackYellow a callbackGreen.

Čtvrtý parametr parAutoOff bude reprezentovat čas v sekundách, po jehož uplynutí celý semafor zhasne. 

Poslední parametr parAccess bude sloužit jako prostředek pro změnu přístupových práv k parametru ovládající LED diody. Samotnou akci obstará navázaná „callback” funkce accessManagement. Díky změně přístupových práv k parametrům LED diod jsme schopni zamezit určitým účastníkům, aby je nastavovali či měnili.  

Nakonec si parametry rovněž vypíšeme zavoláním funkce Adeon::printParams.

 void paramInit(){
   //add parameters
    adeon.addParamWithCallback(callbackRed, parRed, 0);
    adeon.addParamWithCallback(callbackGreen, parGreen, 0);
    adeon.addParamWithCallback(callbackYellow, parYellow, 0);
    adeon.addParam(parAutoOff, 10);
    adeon.addParamWithCallback(accessManagement, parAccess, 0);
    adeon.printParams();
}

Funkce pro ovládání LED

Funkce pro rozsvícení/zhasnutí, která je navázaná na parametr určující stavy LED diod (např. parRed), je naprogramována tak, abychom byli schopni ovládat intenzitu jasu. Tudíž hodnoty parametru tentokrát nebudou nabývat pouze hodnoty 1 a 0 (jako v případě relé z prvního dílu), nýbrž hodnoty 0 až 255 (čím vyšší hodnota, tím jasnější svit LED diody).

Do parametru funkce callbackRed je předána aktuální hodnota parametru, na jejímž základě se pomocí ternárního operátoru (podmínky) určí intenzita svitu LED diody. Hodnota parametru je rovněž vypsána na sériovou linku. 

void callbackRed(uint16_t val){
    //callback function which is called if value of parameter is edited
    Serial.print(F("RED LED VAL: "));
    Serial.println(val);

    (val > 255) ? analogWrite(RED, 255) : analogWrite(RED, val); 
}

Časovač pro automatické rozepínání relé

Abychom byli schopni řídit program na základě informace o času, musíme k tomu využít funkci časovače. Arduino nabízí hned několik možností, jak s časem pracovat. Jednou z nich je funkce millis, která je součástí Arduino jádra a její návratová hodnota udává čas v milisekundách od spuštění vývojové desky. V našem programu ale bude pracovat přímo s 16bitovým časovačem, který po každém přetečení (časovač přeteče po určené časové periodě udané v Hz) vyvolá přerušení a spustí funkci ISR (interrupt service routine). Program uvnitř těla funkce ISR kontroluje, zda není některá z hodnot parametrů pro rozsvícení LED diod ve stavu log. 0. Zároveň je kontrolováno, zda je hodnota parametru parAutoOff rozdílná od nuly. Pokud je podmínka pravdivá, každou sekundu se inkrementuje proměnná counter (počítadlo). Tento proces periodicky pokračuje, dokud je počítadlo menší než hodnota parametru parAutoOff (v sekundách). Jakmile je proměnná counter rovna hodnotě parametru pro automatické zhasínání, zavolá se metoda Adeon::editParamValue. Daná metoda změní hodnotu např. parametru parRed a zavolá funkci callbackRed, která zhasne červenou LED diodu. 

ISR(TIMER1_COMPA_vect) {
    uint16_t r = adeon.getParamValue(parRed);
    uint16_t g = adeon.getParamValue(parGreen);
    uint16_t y = adeon.getParamValue(parYellow);
    uint16_t autoOffTime = adeon.getParamValue(parAutoOff);

    if((r != 0 || g != 0 || y != 0) & autoOffTime != 0){
        if(autoOffTime > counter){
            counter++;
        }
        else{
            adeon.editParamValue(parRed, 0);
            adeon.editParamValue(parGreen, 0);
            adeon.editParamValue(parYellow, 0);
            adeon.printParams();
        }
    }
    else{
        counter = 0;
    }
}

Poznámka: Pro nastudování problematiky ohledně konfigurace časovačů doporučujeme navštívit tuto stránku. Velmi praktický nástroj je také kalkulačka a generátor kódu pro nastavení časovače.

Funkce pro změnu přístupu k parametru

Zajímavou funkcí knihovny Adeon je možnost určit jednotlivým parametrům přístupová práva pro specifické skupiny uživatelů. Jako výchozí přístupová hodnota každého parametru je stupeň administrátor (ADEON_ADMIN). V případě, že bychom tuto hodnotu chtěli změnit, využijeme metodu Adeon::setParamAccess

V našem programu celý proces zaštiťuje „callback” funkce accessManagement, která je navázaná na parametr parAccess. Na základě nové hodnoty parametru se vypočítá, pro jakou LED diodu je změna určena a jaké je nové přístupové právo. Poté se zavolá metoda Adeon::setParamAccess a přístupové právo se změní. Parametr parAccess je sdílený mezi všemi třemi LED diodami. V komentáři na začátku těla funkce accessManagement je uvedeno, jaké hodnoty můžeme k změně přístupových práv použít.

void accessManagement(uint16_t val){
    /*
    10 - RED ADMIN
    11 - RED USER
    12 - RED HOST 

    20 - GREEN ADMIN
    21 - GREEN USER
    22 - GREEN HOST 

    30 - YELLOW ADMIN
    31 - YELLOW USER
    32 - YELLOW HOST 
    */

    uint8_t colorSelect = val / 10;

    switch(colorSelect){
        case 1:
        changeAccess(val % 10, parRed);
        break;
        case 2:
        changeAccess(val % 10, parGreen);
        break;
        case 3:
        changeAccess(val % 10, parYellow);
        break;
        default:
        Serial.println(F("UNKNOWN PARAM"));
        break;
    }
}

void changeAccess(uint16_t val, const char* param){
    Serial.print(F("PARAM "));
    Serial.print(param);
    Serial.print(F(" SET TO: "));
    switch(val){
        case 0:
        adeon.setParamAccess(param, ADEON_ADMIN);
        Serial.println(getName(ADEON_ADMIN));
        break;
        case 1:
        adeon.setParamAccess(param, ADEON_USER);
        Serial.println(getName(ADEON_USER));
        break;
        case 2:
        adeon.setParamAccess(param, ADEON_HOST);
        Serial.println(getName(ADEON_HOST));
        break;
        default:
        Serial.println(F("NO CHANGE"));
        break;
    }
}

Poznámka: Pokud je přístupové právo k parametru parRed nastaveno na hodnotu uživatel (ADEON_USER), zařízení bude zpracovávat zprávy s daným parametrem pouze od účastníků s právy uživatel (ADEON_USER) nebo administrátor (ADEON_ADMIN). Zpráva účastníka s právy host (ADEON_HOST) bude ignorována, tudíž není takový účastník schopen LED diodu ovládat. Avšak administrátor může zasláním SMS s aktualizovanou hodnotou parametru parAccess přístupová práva změnit.

Závěr

V předchozích odstavcích jsme si popsali funkce, které nám umožnily ovládat nejen semafor s LED diodami, ale ukázali jsme si také, jak využít parametr ve funkci časovače či jak je možné změnit přístupová práva. Pro detailnější popis knihovny Adeon navštivte wiki stránku, kde naleznete informace, které Vám osvětlí případné nejasnosti.  V příloze článku opět naleznete i konfiguraci pro mobilní aplikaci.

FB tw

Další podobné články