Chyba ve smyčce
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, ...)
Chyba ve smyčce
Ahoj všem.
Prosím o pomoc chybou/nechybou.
Následující kód mi funguje podle představ, tedy při stisku tlačítka se zvýší číslo na displeji o 1 hodnotu od 0 do 9 a stále dokola, dokud nedoběhne 10 vteřin a program nepokračuje dál.
S čím si ale nevím rady je chyba, která nastane, pokud tlačítko držím. Pak se na displeji načítá hodnota dál a přes desítku. Po puštění tlačítka se hodnota překračující 9 opět vrátí na nulu, takže výsledek je v cajku, ale rozčiluje mě, že nedokážu přijít na to, jak tomu zabránit.
Pomůžete prosím? Díky moc!
P.S. program je dost dlouhý, takže vypisuji pouze část, které se to týká.
for (byte cas=109; cas>0; cas--){
display.clearDisplay();
display.setCursor(0,0);
display.println("NASTAVIT");
display.println("DESITKY");
display.print(hladina_stovky);
display.print(hladina_desitky);
display.println("Xcm");
display.print(" ");
odpocet = cas/10;
display.println(odpocet);
display.display();
if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}
else if (hladina_desitky >= 10) hladina_desitky = 0;
delay(100);
}
Prosím o pomoc chybou/nechybou.
Následující kód mi funguje podle představ, tedy při stisku tlačítka se zvýší číslo na displeji o 1 hodnotu od 0 do 9 a stále dokola, dokud nedoběhne 10 vteřin a program nepokračuje dál.
S čím si ale nevím rady je chyba, která nastane, pokud tlačítko držím. Pak se na displeji načítá hodnota dál a přes desítku. Po puštění tlačítka se hodnota překračující 9 opět vrátí na nulu, takže výsledek je v cajku, ale rozčiluje mě, že nedokážu přijít na to, jak tomu zabránit.
Pomůžete prosím? Díky moc!
P.S. program je dost dlouhý, takže vypisuji pouze část, které se to týká.
for (byte cas=109; cas>0; cas--){
display.clearDisplay();
display.setCursor(0,0);
display.println("NASTAVIT");
display.println("DESITKY");
display.print(hladina_stovky);
display.print(hladina_desitky);
display.println("Xcm");
display.print(" ");
odpocet = cas/10;
display.println(odpocet);
display.display();
if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}
else if (hladina_desitky >= 10) hladina_desitky = 0;
delay(100);
}
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Chyba ve smyčce
Místo "DigitalRead" si vytvoř funkci na detekci stisknutí a puštění tlačítka (0-1-0), které teprve provede "hladina_desitky++;"
Pokud se s tím nechceš dělat, jsou i knihovny, některé dokonce vracejí i délku stisku tlačítka.
Co více říci ? Asi nic.
Pokud se s tím nechceš dělat, jsou i knihovny, některé dokonce vracejí i délku stisku tlačítka.
Co více říci ? Asi nic.
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: Chyba ve smyčce
Především díky za rychlou odpověď.
Můžeš být s tou funkcí trochu konkrétnější?
Délku stisku tlačítka, ani podobné funkce v podstatě nepotřebuji.
Můžeš být s tou funkcí trochu konkrétnější?
Délku stisku tlačítka, ani podobné funkce v podstatě nepotřebuji.
Re: Chyba ve smyčce
Ahoj, funkce if může mít více podmínek pomocí logických operátorů AND - && nebo OR - ||
Takto si řeším tlačítka já:
Takto si řeším tlačítka já:
Kód: Vybrat vše
int hladina_desitky = 0;
boolean nastaveni = 1; //toto mi pomaha
void setup() {
pinMode(8, INPUT_PULLUP); // tlacitko na pinu 8 spinam ke GND
Serial.begin(9600);
}
void loop() {
if (digitalRead(8) == 0 && hladina_desitky < 10 ){ //cte vstup a cykluje, dokud neuvolnis tlacitko
nastaveni = 1;//toto mi pomaha
delay(30);//proti zakmitu
}
else if (hladina_desitky >= 10) {hladina_desitky = 0;
delay(100);
}
if (digitalRead(8) == 1 && nastaveni == 1 ){ // zde ctu a provadim co chci po uvolneni tlacitka
Serial.println(hladina_desitky); //vypisuje na seriovy port, vyzkousej si to
hladina_desitky++;
nastaveni = 0; //toto mi pomaha preklopenim zpet z 1 na 0, to aby se tato smycka neopakovala
//a bude se cekat na stisk tlacitka, kde se nastavi na log 1
delay(30);//proti zakmitu, pro jistotu podruhe
}
}
Re: Chyba ve smyčce
Ahoj. Soudím,že ideální je pro tvůj účel hlídání hran impulsu. Pěkně to má popsané zdejší přispěvatel petan zde na jeho stránkách.
https://www.mylms.cz/text-kusy-kodu-k-arduinu/
https://www.mylms.cz/text-kusy-kodu-k-arduinu/
Re: Chyba ve smyčce
Díky moc.
Tvůj ukázkový kód mi pomohl k pochopení. Udělal jsem to v tomto duchu s pomocnou proměnnou a už to funguje jak má.
Přiznám se, že by mě dost zajímalo podrobné vysvětlení, proč ten původní způsob nefungoval jak měl, ale spokojím se s tím, že teď už mi to funguje.
Dík!
Tvůj ukázkový kód mi pomohl k pochopení. Udělal jsem to v tomto duchu s pomocnou proměnnou a už to funguje jak má.
Přiznám se, že by mě dost zajímalo podrobné vysvětlení, proč ten původní způsob nefungoval jak měl, ale spokojím se s tím, že teď už mi to funguje.
Dík!
Re: Chyba ve smyčce
Tento kód se v Arduinu stále opakuje ve smyčce...
Neproběhne pouze jednou při stisku tlačítka, ale stále dokola. Pokud držíš tlačítko dostatečně dlouho, tak program projde částí kde má přičíst vícekrát a taky se ti vícekrát změní hodnota. Podmínka která nuluje počítadlo se provádí pouze v případě, že tlačítko není stisknuto (je tam ELSE IF). Kdyby si zkusil kód nahradit kódem níž, tak by to počítalo od 0 do 9 a pak by se to vždy vrátilo na 0.
S tou detekcí hrany by to mohlo být nějak tak:
Kód: Vybrat vše
if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}
else if (hladina_desitky >= 10) hladina_desitky = 0;
Kód: Vybrat vše
if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}
if (hladina_desitky >= 10) {
hladina_desitky = 0;
}
Kód: Vybrat vše
bool input1, lastInput1, edgeInput1; //proměnné na začátku kódu
input1 = digitalRead(tlacitko); //načtení vstupu do proměnné
edgeInput1 = (input1 ^ lastInput1) & input1; //detekce hrany
//logika
if (edgeInput1){
hladina_desitky++;
}
if (hladina_desitky >= 10) {
hladina_desitky = 0;
}
lastInput1 = input1; //uložení pro příští smyčku
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Chyba ve smyčce
Délka stisku tlačítka je jen navíc ...Ale umí to za tebe zpracovat že tlačítko bylo stisknuto/puštěno/stisknuto+puštěno atd.
A můžeš si definovat jak dlouhé stisknutí co znamená ... atd.
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"
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů