Zdravím, učím se programovat Arduino a chtěl jsem vyzkoušet udělat něco jako traťový souhlas pro modelovou železnici. Měl by fungovat následovně:
Pokud zmáčknu zelené tlačítko 1, rozbliká se led dioda, pokud následně zmáčknu červené tlačítko, led dioda bude svítit. Pokud následně podruhé zmáčknu červené tlačítko, led dioda zhasne. Pokud bych ale po zmáčknutí zeleného tlačítka 1 zmáčkl zelené tlačítko 2 místo toho červeného, led dioda okamžitě zhasne.
Zkoušel jsem to různě naprogramovat, ale vždy docílím jen toho, že po zmáčknutí zeleného tlačítka 1 se dioda rozbliká, ale po zmáčknutí červeného se již nic neděje. Nedokázal by mi někdo poradit? Zatím kód vypadá takto a zkouším to v tinkercadu:
// digitální piny
const int zeleneTlac1 = 2;
const int cerveneTlac = 3;
const int zeleneTlac2 = 4;
const int led = 13;
Založen: Dec 12, 2005 Příspěvky: 2382 Bydliště: SR, Poprad
Zaslal: st říjen 04 2023, 20:53 Předmět:
Ako prve, daj si tlacidla na gnd. teda po stlaceni bude stav LOW, to iste led, rozsvecuj ju tak, ze pin das do log. 0
tlacidla nadefinuj ako INPUT_PULLUP. Tym docielis toho, ze nezapojene tlacidlo nebude vo vzduchu (nedefinovany stav), ale bude vzdy log. 1
Dalsia dost casta vec zaciatocnikov je delay. Zabudni nan. Program sa vykonava po instrukciach, a ty si zastavil program na:
kód:
while (stavLed) {
digitalWrite(led, HIGH);
delay(250);
digitalWrite(led, LOW);
delay(250);
}
nikdy sa odtialto nedostane dalej. tu tvoj program konci.
Je viac moznosti, ako to riesit. dat tlacidla na prerusenia a v preruseni nastavit nejaku premennu, ze tlacidlo bolo stlacene a v loop len cez if kontrolovat, ci ta premenna je nastavena, alebo to robit v loope, ako to mas teraz, ale ten while nahradit if-om.
Blikanie sa robi napr. cez kontrolu na millis, na internete je na to kopec navodou, nechce sa mi to teraz hladat.
kód:
unsigned long actualMillis;
unsigned long refreshMillis = 0;
bool ledstate = false;
LOOP
pisem to z hlavy, tak mozno tam budu nejake chyby, ale pre predstavu by to mohlo stacit. To je samotne blikanie. K tomu if mozes este pridat podmienku na to, ci ma blikat, alebo nie. _________________ No vidis, a tak si sa bal
Naposledy upravil pocitujlasku dne st říjen 04 2023, 21:00, celkově upraveno 1 krát.
Já bych to vzal podle té tvojí definice jako jednoduchý stavový automat
kód:
// tvoje definice a setup() zustavaji, pridavam
int Stav=0;
unsigned long prevMillis;
unsigned int interval=250UL; // doba sviceni/zhasnuti
bool cerveneTlacPodruhe = false; // = cekame na DRUHE stisknuti tlacitka
void loop() {
////////////////////
// LED
////////////////////
if (Stav == 0) { // tma
digitalWrite(led, LOW);
} else if (Stav == 1) { //blikani
if ((millis() - prevMillis) > interval) {
digitalWrite(led, ! digitalRead(led)); // prepnem LED na jeji opak
prevMillis = millis();
};
} else if (Stav == 2) { // sviceni
digitalWrite(led, HIGH);
} else { // sem by se to nemelo NIKDY dostat
Stav = 0; // zachranime situaci
};
////////////////////
// logika, tlacitka
////////////////////
if (Stav == 0) { // tma
if (digitalRead(zeleneTlac1) == HIGH) {
Stav = 1;
digitalWrite(led, HIGH);
};
} else if (Stav == 1) { //blikani
if (digitalRead(cerveneTlac) == HIGH) {
Stav = 2;
digitalWrite(led, HIGH);
prevMillis = millis();
cerveneTlacPodruhe = false;
};
if (digitalRead(zeleneTlac2) == HIGH) { // prebije pripadne soucasne cervene tlacitko
Stav = 0;
digitalWrite(led, LOW);
};
} else if (Stav == 2) { // sviceni
if (digitalRead(cerveneTlac) == LOW) { // pusteni po prvnim zmacknuti
cerveneTlacPodruhe = true;
if ( cerveneTlacPodruhe && digitalRead(cerveneTlac) == HIGH) { // druhe zmacknuti misto pouheho drzeni
Stav = 0;
digitalWrite(led, LOW);
};
} else { // sem by se to nemelo NIKDY dostat
Stav = 0; // zachranime situaci
};
} // konec loop
Predpokladam, ze to mas zapojene tak, ze led se rozsvěcí pomocí HIGH (myslím, že vestavěná se naopak rozsvěcí pomocí LOW, pak by se to muselo prohodit)
A že tlačítka máš proti +5V (a pin pripojený přez odpor k zemi)
(Jinak bych dal jednoduše tlačítko na pin proti zemi, v setupu použil INPUT_PULLUP a vyhodnocoval to opačně - tak to dělám normálně já)
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.