V závěru posledního dílu našeho seriálu jsme Vám slíbili bonusovou ukázku, jež se bude týkat problematiky automatického otevírání pojezdové brány. Jelikož o knihovně Adeon toho již v minulých dílech padlo hodně, pokusíme se co nejméně opakovat a zaměříme se výhradně na funkce pro řízení brány. Ukázka je naprogramována tak, aby byla v praxi plně funkční. 

Proč vlastně otevírat bránu pomocí SMS a Arduina, když brány obsahují dálková ovládání? Důvodů je celá řada: 

  • Odpadá nutnost nosit/vozit dálkové ovládání

  • Uživatel není omezen počtem dálkových ovládání

  • Bránu/vrata je možno otevřít „odkudkoliv” (nejen na vzdálenost několika metrů)

  • Možnost integrace chytrých funkcí, jako např. správa uživatelů, automatické otevírání a zavírání, podpora částečného otevření atp.

  • Vyšší úroveň zabezpečení komunikace

Zapojení

A jaké je tedy dnešní zadání? Potřebujeme pomocí SMS zprávy otevírat bránu, která je poháněna elektromotorem. Abychom toho byli schopni, musíme řídicí jednotce (ŘJ) pohonu poslat signál, který vyvolá pohyb brány (většina ŘJ pro pojezdové brány takový vstup má). Jako výstup Arduina nám postačí jeden krátký impuls, který ŘJ zpracuje a uvede bránu do chodu. Směr pohybu brány je určen polohou koncového spínače, díky kterému ŘJ pozná, v jakém stavu se brána aktuálně nachází (otevřeno/zavřeno). Signál z koncového spínače přivedeme rovněž do Arduina, které si bude interně ukládat aktuální stav brány. Díky tomu budeme schopni naprogramovat „chytré funkce” jako např. automatické zavírání brány po určitém časovém intervalu. Občas se také může stát, že se brána během pohybu zasekne a zůstane pootevřená. Naprogramujeme si tedy rovněž funkci, která bude pravidelně (po určitém časovém intervalu) kontrolovat stav brány. Pokud bude poloha brány neurčitá (ani otevřeno, ani zavřeno), Arduino vyšle impuls, který bránu uvede znovu do pohybu. Tento proces se bude opakovat tak dlouho, dokud brána opět nesepne koncový spínač.

Program z dnešní ukázky tvoří i funkce, které jsme již použili v minulých dílech. Proto se základními metodami knihovny Adeon dále nebudeme zabývat. Pokud byste si o těchto funkcích chtěli něco přečíst, koukněte na předchozí díly našeho seriálu. Předtím než začneme, doporučujeme Vám otevřít si program, abyste během čtení článku zůstali v obraze.

    pinMode(OUTPUT_SIGNAL, OUTPUT);
    pinMode(INPUT_SIGNAL_OPEN, INPUT);
    pinMode(INPUT_SIGNAL_CLOSE, INPUT);
    attachInterrupt(digitalPinToInterrupt(INPUT_SIGNAL_CLOSE), gateISR, CHANGE);
    attachInterrupt(digitalPinToInterrupt(INPUT_SIGNAL_OPEN), gateISR, CHANGE);  

void gateISR(){
    if(digitalRead(INPUT_SIGNAL_OPEN) == HIGH){
        gatePos = OPEN;
        Serial.println(F("GATE IS OPEN"));
    }
    else if(digitalRead(INPUT_SIGNAL_CLOSE) == HIGH){
        gatePos = CLOSE;
        Serial.println(F("GATE IS CLOSED"));
    }
    else{
        gatePos = UNKNOWN;
        Serial.println(F("UNKNOWN GATE POSITION"));
    }
}

Nastavení vstupů a výstupů

Jak jsme již zmínili v úvodu, stav brány je určen koncovým spínačem. Signály z koncového spínače jsou zpracovávány řídicí jednotkou pohonu. Je-li alespoň jeden signál ve stavu log. 1, znamená to, že je brána otevřená nebo zavřená (podle toho, který ze signálů je v log. 1). Jsou-li oba signály v log. 0, je brána pootevřená. Abychom byli schopni Arduinem sledovat stav brány, musíme si nadefinovat dva vstupy, které fyzicky připojíme k řídicí jednotce či koncovému spínači. Jeden vstup bude sloužit pro detekci otevřené brány a druhý pro detekci zavřené brány. Na dané vstupy navážeme přerušení mikroprocesoru. To znamená, že se v případě změny stavu jednoho z pinů spustí funkce, která do stavové proměnné uloží aktuální polohu brány. 

Dále si nadefinujeme výstupní pin, který bude vysílat impulz do řídicí jednotky brány. V programu je nazván jako OUTPUT_SIGNAL. Naším cílem je, aby Arduino po přijetí SMS zprávy s parametrem GATE = 1 „řeklo” řídicí jednotce, aby uvedla bránu do pohybu. To provedeme tak, že na krátkou dobu přivedeme OUTPUT_SIGNAL do stavu logické 1.

Funkce pro vyslání impulzu

Funkce, která po dobu 200 ms vyšle signál do řídicí jednotky pohonu, je navázaná na parametr parGate. Do parametru funkce je předána aktuální hodnota parametru, na jejímž základě se pomocí podmínky určí stav výstupního pinu OUTPUT_SIGNAL. Pokud je tedy hodnota parametru větší než 0, vyšle se impulz. Hodnota parametru parGate je rovněž vypsána na sériovou linku. 

Stav brány monitorujeme pomocí výčtového typu (enum) gatePos, který obsahuje informaci o aktuálním stavu brány. Pokud tedy vyšleme impulz, předpokládejme, že se brána začne zavírat či otevírat. Proto po zaslání signálu nastavíme aktuální stav brány na hodnotu UNKNOWN, tedy neznámý stav. Tento stav využijeme pro kontrolu uvíznutí brány.

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

    if(val > 0){
        digitalWrite(OUTPUT_SIGNAL, HIGH);
        delay(200);
        Serial.println(F("GATE IMPULSE"));
        digitalWrite(OUTPUT_SIGNAL, LOW);
        gatePos = UNKNOWN;
    }
}

Časovač pro automatické vysílání impulzu

Časovač jsme si již představili v minulém díle našeho seriálu. Teorii tedy nechme stranou a pojďme si vysvětlit k čemu časovač použijeme tentokrát. Naším cílem je, abychom byli schopni bránu automaticky zavřít po uplynutí doby, která je nastavená parametrem parClose. Hodnota tohoto parametru udává čas v sekundách. 

Automatické řízení brány obstarává funkce ISR (interrupt service routine), která je zavolána vždy po přetečení časovače. V případě, že je brána ve stavu OPEN po dobu, která je rovna hodnotě parametru parClose, Arduino vyšle do řídicí jednotky impulz. Na základě impulzu uvede jednotka bránu do pohybu za účelem jejího zavření.

Funkci ISR použijeme rovněž k eliminaci případného zaseknutí brány. Pokud je brána v neznámém stavu po dobu, která je nastavena konstantou CHECK_PERIOD (výchozí hodnota 60 sekund), Arduino vyšle opět impulz do řídicí jednotky. Tento cyklus probíhá tak dlouho, dokud se brána nedostane do stavu OPEN nebo CLOSE.

 ISR(TIMER1_COMPA_vect) {
   if(gatePos == OPEN){
        if(adeon.getParamValue(parClose) > counterAutoClose){
            counterAutoClose++;
        }
        else{
            callbackGateImpulse(1);
        }
    }
    else{
        counterAutoClose = 0;
    }
    
    if(gatePos == UNKNOWN){
        if(CHECK_PERIOD > counterCheckState){
            counterCheckState++;
        }
        else{
            callbackGateImpulse(1);
            counterCheckState = 0;
        }
    }
    else{
        counterCheckState = 0;
    }
}

Funkce pro změnu přístupu k parametru

Stejně jako v minulém díle si do programu přidáme možnost nastavení přístupových práv, tentokrát k parametru parGate. Díky hodnotě tohoto parametru můžeme určit, která skupina uživatelů bude mít k danému parametru přístup.

V programu změnu přístupových práv provádí „callback” funkce accessManagement, která je navázaná na parametr parAccess. Pokud se tedy hodnota parAccess změní, zavolá se daná funkce. Na začátku podprogramu si uložíme návratovou hodnotu metody Adeon::getParamValue(parAccess). Tím získáme aktuální přístupová práva. Na základě dané hodnoty je následně vyhodnoceno, jaká jsou nová přístupová práva k parametru parGate

Přístup k parametru parAccess má samozřejmě pouze uživatel, který patří do skupiny ADEON_ADMIN

void accessManagement(){
    Serial.print(parGate);
    Serial.print(" SET TO ");
    uint16_t val = adeon.getParamValue(parAccess);
    if(val == 0){
        adeon.setParamAccess(parGate, ADEON_ADMIN);
        Serial.println(getName(ADEON_ADMIN));
    }
    else if(val == 1){
        adeon.setParamAccess(parGate, ADEON_USER);
        Serial.println(getName(ADEON_USER));
    }
    else{
        adeon.setParamAccess(parGate, ADEON_HOST);
        Serial.println(getName(ADEON_HOST));
    }
}

Závěr

Pokud jste doposud přemýšleli, jak ovládat Vaší příjezdovou bránu na dálku, jsme si jistí, že nyní si již budete vědět rady. Tímto bychom chtěli uzavřít náš seriál o SW platformě Adeon. Děkujeme Vám za Váš zájem a věříme, že díky spojení Adeonu a Vaší kreativity vznikne mnoho zajímavých projektů, které Vám a lidem ve Vašem okolí usnadní každodenní život. Přejeme Vám hodně zábavy!  

FB gp tw

Další podobné články