Taky přidávám jedno řešení.
V principu to bude asi podobné, jako má Gilhad, akorát já nepoužívám millis().
Program mi běží v docela rychlé hlavní smyčce (100x za sekundu).
To už bez problémů stačí na testování tlačítek, aniž by byl uživatel nějak omezován tím, že musí tlačítko držet nějakou delší dobu.
Program pak už jen při stisku nějakého tlačítka sepne výstupy a aktivuje příslušné čítače smyček.
Zároveň právě použité tlačítko zablokuje do doby, než se stiskne tlačítko opačné.
Když některý z čítačů smyček doběhne do požadovaného času, odpovídající výstup se vypne.
Mimochodem, zadání není úplně přesné, takže se nám programy chovají trochu odlišně (jde o to, kdy se mají tlačítka odblokovat)
Kód: Vybrat vše
// prirazeni pinu
#define pin_tlacitko1 5 // pin pro 1. tlacitko
#define pin_tlacitko2 6 // pin pro 2. tlacitko
#define pin_vystup1 8 // vystup, ktery sepne 1. tlacitkem na 5 sekund
#define pin_vystup2 9 // vystup, ktery sepne 1. tlacitkem na 10 sekund
#define pin_vystup3 10 // vystup, ktery sepne 2. tlacitkem na 15 sekund
#define pin_vystup4 11 // vystup, ktery sepne 2. tlacitkem na 20 sekund
// globalni promenne
byte posledni_stisknute = 0; // znacka, ktere tlacitko bylo stisknute jako posledni, aby samo sebe mohlo zablokovat (na zacatku jsou obe tlacitka odblokovana)
boolean aktivni_1 = false; // znacka, jesli prave bezi casovac, ktery se startuje 1. tlacitkem
unsigned int citac_1; // pocitadlo smycek po stisku prvniho tlacitka (kazda smycka trva 0,01s)
boolean aktivni_2 = false; // znacka, jesli prave bezi casovac, ktery se startuje 2. tlacitkem
unsigned int citac_2; // pocitadlo smycek po stisku druheho tlacitka (kazda smycka trva 0,01s)
void setup(void)
{
pinMode(pin_tlacitko1, INPUT_PULLUP); // u tlacitek predpokladam, ze spinaji proti GND
pinMode(pin_tlacitko2, INPUT_PULLUP);
pinMode(pin_vystup1, OUTPUT);
pinMode(pin_vystup2, OUTPUT);
pinMode(pin_vystup3, OUTPUT);
pinMode(pin_vystup4, OUTPUT);
}
void loop(void)
{
// --------------- obsluha 1. tlacitka ----------------------------
if (digitalRead(pin_tlacitko1) == LOW and posledni_stisknute != 1) // bylo stisknute prvni tlacitko
{ // prvni tlacitko muze byt stisknute jen v pripade, ze nebylo stisknute jako posledni
posledni_stisknute = 1; // prvni tlacitko bude od ted zablokovane (druhe se odblokuje)
aktivni_1 = true; // nastaveni znacky, ze probiha odpocet 1. casovace
citac_1 = 0; // po stisku tlacitka se vynuluje 1. citac
digitalWrite(pin_vystup1, HIGH); // a sepnou se prvni dva vystupy
digitalWrite(pin_vystup2, HIGH);
}
if (aktivni_1 == true) // kdyz je aktivni 1. casovac
{
citac_1 ++; // zacnou se pocitat smycky
if (citac_1 == 500) // po 5 sekundach se vypne 1. vystup
{
digitalWrite(pin_vystup1, LOW);
}
if (citac_1 == 1000) // po 10 sekundach se vypne druhy vystup
{
digitalWrite(pin_vystup2, LOW);
aktivni_1 = false; // a prvni casovac se deaktivuje
}
}
// -----------------------------------------------------------------
// --------------- obsluha 2. tlacitka ----------------------------
if (digitalRead(pin_tlacitko2) == LOW and posledni_stisknute != 2) // prave bylo stisknute druhe tlacitko
{ // druhe tlacitko muze byt stisknute jen v pripade, ze nebylo stisknute jako posledni
posledni_stisknute = 2; // druhe tlacitko bude od ted zablokovane (prvni se odblokuje)
aktivni_2 = true; // nastaveni znacky, ze probiha odpocet 2. casovace
citac_2 = 0; // po stisku tlacitka se vynuluje 2. citac
digitalWrite(pin_vystup3, HIGH); // a sepnou se druhe dva vystupy
digitalWrite(pin_vystup4, HIGH);
}
if (aktivni_2 == true) // kdyz je aktivni 2. casovac
{
citac_2 ++; // zacnou se pocitat smycky
if (citac_2 == 1500) // po 15 sekundach se vypne 3. vystup
{
digitalWrite(pin_vystup3, LOW);
}
if (citac_2 == 2000) // po 20 sekundach se vypne 4. vystup
{
digitalWrite(pin_vystup4, LOW);
aktivni_2 = false; // a druhy casovac se deaktivuje
}
}
// -----------------------------------------------------------------
delay(10); // kazda smycka trva 10ms (tech par predchozich prikazu ma v tomto pripade zanedbatelny vliv na rychlost)
}