Chyba ve smyčce

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
KidBV
Příspěvky: 3
Registrován: 06 srp 2017, 18:22
Reputation: 0

Chyba ve smyčce

Příspěvek od KidBV » 19 úno 2019, 23:54

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);
}

Uživatelský avatar
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

Příspěvek od pavel1tu » 20 úno 2019, 06:51

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.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

KidBV
Příspěvky: 3
Registrován: 06 srp 2017, 18:22
Reputation: 0

Re: Chyba ve smyčce

Příspěvek od KidBV » 20 úno 2019, 16:58

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.

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Chyba ve smyčce

Příspěvek od RomanB » 20 úno 2019, 18:30

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á:

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
    
  }

}

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: Chyba ve smyčce

Příspěvek od rejze69 » 20 úno 2019, 19:02

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/

KidBV
Příspěvky: 3
Registrován: 06 srp 2017, 18:22
Reputation: 0

Re: Chyba ve smyčce

Příspěvek od KidBV » 20 úno 2019, 19:05

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!

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Chyba ve smyčce

Příspěvek od petan » 20 úno 2019, 20:25

Tento kód se v Arduinu stále opakuje ve smyčce...

Kód: Vybrat vše

if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}
else if (hladina_desitky >= 10) hladina_desitky = 0;
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.

Kód: Vybrat vše

if (digitalRead(tlacitko) > 0){
hladina_desitky++;
}


if (hladina_desitky >= 10) {
hladina_desitky = 0;
}
S tou detekcí hrany by to mohlo být nějak tak:

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
 

Uživatelský avatar
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

Příspěvek od pavel1tu » 20 úno 2019, 21:24

KidBV píše:
20 úno 2019, 16:58
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.
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"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 18 hostů