Stránka 1 z 1

Arduino, ošetření tlačítka proti trvalému sepnutí

Napsal: 30 zář 2013, 10:19
od Honza_dy
Nazdar, v jednom projektu budu mít tlačítko zvonku a chci udělat funkci, která zamezí trvalému zvonění při zablokování tlačítka, tzv. AntiSirka. Představu jak by to mělo fungovat mám, ale jsem samouk tzn. že nad tím určitě strávím alespoň hodinku laborování.
Zapojení bude jednoduché tlačítko pouští +5V na vstuní pin a MCU ovládá relé zvonku přes pin výstupní. Pokud bude tlačítko sepnuto déle jak 5 vteřin, odpojí se výstup až do odblokování tlačítka, potom se zase čeká na stisk.

Asi se budu snažit to udělat přes smyčku while, s následným testováním vstupu po 100ms a inkrementací proměnné.

Neřešil někdo něco podobného? V Cčku zatím tápu, pořád se mi tam pletou postupy zažité z basicu, takže většinou je výsledek složitá struktura plná GOTO a návěští :?

Napsal: 30 zář 2013, 10:29
od rnbw
Na to treba procesor? Najjednoduchsie je reagovat len na stlacenie a zazvonit 5 sekund.

Napsal: 30 zář 2013, 10:39
od Honza_dy
Je to jen součást většího projektu (RFID přístupový systém). Tlačítko musím stejně do MCU zavést protože bude ovládat více funkcí tak to nebudu řešit nějakým monostabilem vedle.

Napsal: 30 zář 2013, 15:40
od mtajovsky
Honza_dy píše:...
Honza_dy píše:Asi se budu snažit to udělat přes smyčku while, s následným testováním vstupu po 100ms a inkrementací proměnné? ...Je to jen součást většího projektu (RFID přístupový systém). Tlačítko musím stejně do MCU zavést protože bude ovládat více funkcí ...

Pokud je to součástí většího projektu tak zařaďte testování stavu do hlavní smyčky programu a testuje změnu (pseodokód):

Kód: Vybrat vše

bool staryStavTlacitka = false;
bool zvoneniZapnuto = false;

HlavniSmycka()
{
...
    bool novyStavTlacitka = CtiStavTlacitka(cisTlacitka);
    if(novyStavTlacitka ^ staryStavTlacitka)
    {
        ZpracovaniStavuTlacitka(cisTlacitka, novyStavTlacitka);
        staryStavTlacitka = novyStavTlacitka;
    }
...
}

void ZpracovaniStavuTlacitka(int cisTlacitka, bool stavTlacitka)
{
...

    if(cisTlacitka == TLACITKO_PRO_ZVONENI &&
       stavTlacitka && !zvoneniZapnuto)
    {
        NastavSignalZvonku(true);
        zvoneniZapnuto = true;
        NahodCasovac5s();
    }

...
}


nebo tak nějak.

Pokud je cisTlacitka rovno číslu pro zvonek a novyStavTlacitka je true a není nahozen časovač pro zvonění, tak se nahodí signál pro zvonění a zároveň HW nebo SW časovač na 5 sekund. Po jeho ukončení se shodí signál pro zvonek. Ještě je třeba napsat rutinu časovače, která shodí signál zvonku a příznak zvonění.

Napsal: 30 zář 2013, 21:48
od Honza_dy
mtajovsky:
Moc díky za kopanec! :)
Sice jsem z Tvého taháku pochopil asi polovinu, ale stačilo. Vypotil jsem následující kód, který funguje více než uspokojivě:

Kód: Vybrat vše

#define bellPin 8 
#define doorPin 13
int cnt = 0;
boolean block = false;


void setup()
{
 pinMode(bellPin, INPUT);
 pinMode(doorPin, OUTPUT);
 digitalWrite(doorPin, LOW);
 
 }

void loop()
{
 if (digitalRead(bellPin)==HIGH && !block){
   blockProtect(doorPin);
}
else if (digitalRead(bellPin)==LOW && block){
  block = false;
  digitalWrite(doorPin, LOW);
}
  else
  digitalWrite(doorPin, LOW);
}



void blockProtect(int pin)
{
while (digitalRead(bellPin) == HIGH)
  {
    digitalWrite(doorPin, HIGH);
   delay(100);
   if (cnt > 50){
    digitalWrite(pin, LOW);
    cnt = 0;
    block = true;
    break;
    }
  cnt++ ;
  }
}


Ještě to zkusím srazit do nějaké úhlednější funkce, kterou budu v hlavní smyčce volat podmínkou, ale i tak jsem spokojen.

Napsal: 01 říj 2013, 13:44
od mtajovsky
Ten kód má jeden zásadní architekturní problém. Ve funkci blockProtect() setrvá procesor do té doby, než digitalRead(bellPin) != HIGH nebo neuplyne 5 sekund. Ale co když po tu dobu bude potřeba reagovat na nějaké jiné události? Psal jste, že je to součást většího projektu. Většinou není možno blokovat procesor na 5 sekund na jednom místě.

Napsal: 01 říj 2013, 19:34
od Honza_dy
Vidím, že pojem "větší projekt" má u mně jiný význam než u Vás. :) Ta chyba mi ani nevadí. Koneckonců pokud bych uměl procesor přinutit ke zpracování více úloh najednou, určitě bych zde neotravoval dotazy na takovou kravinu s tlačítkem.