arduino loop 1 keer laten afspelen met button

Lucky Luke

Golden Member

Op 24 juni 2018 21:05:23 schreef flipflop:
@Lucky: als jij zulke code schrijft ben je een oelewapper :-)

Werkt dat ook andersom? Dan hoop ik dat het de enige voorwaarde is :P

----

Trouwens @bas65, als je wil dat 'ie sneller op de schakelaar reageert is het helemaal niet erg om sneller te pollen, en dus

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
delay(500); //dan kan de delay op einde van je speelAf komen te vervallen
}
}
[/code]
te doen.

Al vind ik het dan duidelijker de delay die bij speelAf hoort ook daar neer te zetten, zodat het

[code=C]
void loop() {
if (digitalRead(button)) speelAf();
}
[/code]

wordt.

Met het verhaal van die schakelaar die ingedrukt blijft erbij, begrijp ik dat het niet de bedoeling is. Maar als de bedoeling was dat de loop maar 1 keer zo lo(o)pen als de schakelaar wordt ingedrukt, en pas weer mag starten als 'ie wordt losgelaten en opnieuw ingedrukt, zou je het ook zo kunnen doen:

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
while(digitalRead(button)) delay(150); // wait until button release w. debounce
}
}
[/code]
waarbij de delay wél belangrijk is, omdat als je een knop indrukt of loslaat deze niet direct een 1 of een 0 geeft, maar nog een tijdje blijft "twijfelen" en een reeks enen en nullen geeft (op de grens van wel/geen contact maken), door contactdender. Als die delay er niet stond, zou zo gauw de button is losgelaten die "if (digitalRead(button))" weer worder uitgevoerd, en als de knop dan nog aan het stuiteren is, is die if waar, en heb je dus dat speelAf nogmaals wordt uitgevoerd ondanks dat je de knop nu juist net losliet.

150ms is trouwens behoorlijk lang voor debouncing, een goede schakelaar is veel sneller uitgedenderd.

Oh, hehehehe >:), en als je sowiso een keer die debounce delay wilt, ook als je de knop allang hebt losgelaten tijdens speelAf, dan kan

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
do delay(150) while(digitalRead(button)); // wait until button release w. at least one debounce period
}
}
[/code]
ook nog, en dan komt die oelewappercode nog van pas ook.

(Maar flipflop heeft gelijk. Het voorbeeld wat ik gaf van "deze loop wordt maar 1 keer uitgevoerd" is absurd. Als het echt maar 1 keer hoeft, zet je er natuurlijk geen do-while loop omheen.)

@KGE: die do-while constructie vind ik ongeacht de voorwaarde een loop-constructie, maar in dit simpele scenario zou 'ie weggeoptimaliseerd kunnen worden. Als de voorwaarde zou kunnen veranderen kan dat niet, en dan kan die voorwaarde alsnog af-en-toe false zijn... Maar het is natuurlijk een flauw voorbeeldje.

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

debouncing is hier niet echt nodig omdat de code opzich ook al genoeg delays had.
debouncing heb je nodig als je bij het indrukken bv een getal met 1 verhoogd. dan zou je per druk veeeel verhogen bij een korte loop.

of als je met interupts werkt, dan kan je niet anders (delays werken niet dan. tip: delayMicroseconds(150000) wel :-) )

ik hou van werken ..., ik kan er uren naar kijken

ja, en? daar slijt hij niet van hoor ;) en moe wordt ie ook niet :)