Stránka 1 z 1

Chyba ve smyčce

Napsal: 19 úno 2019, 23:54
od KidBV
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);
}

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 06:51
od pavel1tu
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.

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 16:58
od KidBV
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.

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 18:30
od RomanB
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
    
  }

}

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 19:02
od rejze69
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/

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 19:05
od KidBV
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!

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 20:25
od petan
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
 

Re: Chyba ve smyčce

Napsal: 20 úno 2019, 21:24
od pavel1tu
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.