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
----
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.