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

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 00:00
Bydliště: Brno-venkov

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

#1 Příspěvek 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í :?
Uživatelský avatar
rnbw
Příspěvky: 37419
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#2 Příspěvek od rnbw »

Na to treba procesor? Najjednoduchsie je reagovat len na stlacenie a zazvonit 5 sekund.
Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 00:00
Bydliště: Brno-venkov

#3 Příspěvek 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.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#4 Příspěvek 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í.
Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 00:00
Bydliště: Brno-venkov

#5 Příspěvek 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.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#6 Příspěvek 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ě.
Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 00:00
Bydliště: Brno-venkov

#7 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“