Jasný,
tohle řeším na kroužku každý den ....
každý píše jiným stylem, někdo čistě, jiný co nejvíce knihoven, někdo v kuse, jiný milion funkcí - a já v tom hledám chyby.
Potřeboval bych aby program šel nějakým debugerem krokovat ...
jednoduchý kód
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: jednoduchý kód
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: jednoduchý kód
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)
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)
}
Re: jednoduchý kód
Ano, u tebe například lze rychlým střídavým klikáním udržet všechny diody svítící naráz neomezeně dlouho
(A samozřejmě je většinu doby MCU zablokované, což zde nevadí, ale při rozšiřování se ti jednak začne rozcházet čas, jednak kratší pulzy mohou být náhodně ignorovány. )
(A samozřejmě je většinu doby MCU zablokované, což zde nevadí, ale při rozšiřování se ti jednak začne rozcházet čas, jednak kratší pulzy mohou být náhodně ignorovány. )
Re: jednoduchý kód
Milis() má výhodu že to je jednoduchý příkaz čtoucí čas z hlavního timeru arduina. Měl by čítat asi do 50dni než se překlopí.
Re: jednoduchý kód
A pokud se to pouzije vyse zminenym zpusobem, tak ani to preklopeni nevadi, jen neni mozno (takto primitivne) merit intervaly delsi nez tech asi 50 dni
Ale spustit to 49. den s intervalem na 3 dny neni problem, i kdyz to mezitim pretece.
Ale spustit to 49. den s intervalem na 3 dny neni problem, i kdyz to mezitim pretece.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů