Hoi Stefan.
Onder elk van mijn postings hier, heb ik een aantal algemene tips staan die bijna altijd geldig zijn.
De eerste is hier heel erg van toepassing.
Je gebruikt namelijk ernstig gebruik van blokkerende code.
Als er op een toets gedrukt word, doe je een hele seconde (!) helemaal niets.
Das hele dikke zonde van de tijd.
Vervolgens ga je aan de slag met een while.
Je zegt dat zolang (while) je daarnet gezien hebt dat er op een toets werd gedrukt, dat er dan geknipperd moet worden, 2 en een halve keer per seconde.
Een van de fouten die hier in zitten, is dat je voor eeuwig in de while blijft hangen.
Want tijdens die while zal buttonstate nooit veranderen, ook niet de volgende keer als dat gecontroleerd word.
Je hebt buttonstate gebruikt, maar daarin zit een waarde die vroeger ooit eens geldig was (inmiddels al bijna 1.5 seconden geleden).
buttonstate zal nooit veranderen tenzij je nog eens die digitalRead doet en het resultaat in buttonstate stopt.
Je gaat wel naar state 2, want de voorwaarde die daaraan gekoppeld is, is altijd waar (buttonstate was al 1 en dus altijd HIGH).
Je hebt dus je LED 1 keer kort zien flitsen, en dan blijft ie ruim 5 seconden uit.
De while loop is heel gevaarlijk, want je kunt erin verstrikt raken om er nooit meer uit te komen, Daarom moet je die zo veel mogelijk vermijden.
Je weet dat void.loop oneindig loopt, toch ?
Daar moet je gebruik van maken.
Je moet bijhouden wat je aan het doen bent (wel; of niet knipperen, dat doe je al met state).
Maar ook of de LED nou juist aan of uit is, want dat bepaalt wat de volgende stap zal worden.
En je moet bijhouden of er al voldoende tijd verstreken is om die volgende stap te zetten.
Die laatste 2 dingen houd je nu niet bij.
Dit is wat je leert als je de blink without delay sketch bestudeert.
Als je dat snapt, en dan ook echt begrijpt, zul je nooit meer die delay gebruiken, en ook die deathtrap van een while zul je niet meer gaan gebruiken, zeker weten.
Heb ik nog wat tips voor je waar je niet om gevraagd had.
Als je variabelen gebruikt en die een mooie naam geeft, maak dan consequent gebruik van hoofdletters.
Das een klein dingetje dat het lezen va de code ineens veel gemakkelijker maakt.
Elk nieuw woord krijgt dan een hoofdletter.
Of hoofdLetter dan dus, maar ook buttonState.
Je zult zien dat je dat overal zo tegen komt.
Andere tip,
Als je vraagt zoals daarstraks wat er mis gaat, is het wel een goed idee als je niet alleen vertelt wat je hebt, maar ook als je vertelt wat je verwachtte te zien, en wat je in plaats daarvan kreeg te zien.
Want dan word het beantwoorden van je vragen een stuk gemakkelijker, en eenvoudiger gericht te antwoorden.
Nu eerst maar eens aan de slag met Blink without delay, en zien dat je begrijpt wat daar gebeurt.
Dat kun je dan later toepassen op deze sketch en op het geheel voor je brandweer wagen.