Hoi Bart!
Ik heb de vrijheid genomen om de video te comprimeren (geluid ook verwijderd) en in jouw post te zetten en de code wat op te ruimen.
Als nieuweling mag je nog geen aanhangsels in het forum plaatsen (veiligheid dingetje), en soms is het niet altijd even handig hoe code formattering werkt.
Ik hoop dat je dit niet bezwaarlijk vindt. 😉Â
Â
Misschien handig voor referentie in de toekomst:
Ik heb ooit eens een cursus voor Arduino programmeer beginners geschreven, misschien heb je er wat aan om wat bekender te worden met de Arduino-taal 😉Â
Â
Als ik naar de code kijk, dan is het eerste probleem dat een loop van een effect niet altijd correct onderbroken wordt.
Voor wat ik zo 1-2-3 kan zien worden zowel "rainbow()" als "rainbowCycle()" alleen maar onderbroken als toevallig de knop op het juiste moment wordt uitgelezen als LOW.
Dit kan dus plaats vinden, of niet plaats vinden, of te vaak plaats vinden.
In het opvolgende project heb ik daarom een interrupt ingebakken die elke functie meteen afbreekt en een ander effect kiest.
Misschien is het een idee om even naar dat nieuwere project te kijken: Arduino – Alle LEDStrip effecten in èèn (NeoPixel en FastLED).
Wat RF besturing betreft; dat wordt wat lastiger, want met een RF ontvanger kun je geen interrupt triggeren, dus als RF gebruik echt nodig is, dan heb je aan die nieuwe aanpak misschien niet veel - misschien wel een goed idee om het toch even door te kijken.
Â
In een opkomend project heb ik dat opgelost door een ESP8266 te gebruiken (goedkoper, krachtiger, sneller en kleiner dan een Arduino, en WiFi meteen ingebakken), en een van de veel aangeroepen functies aan te passen. Ik kan in dat project via mijn PC, mobiele telefoon of tablet, de effecten wisselen.
In mijn project doe ik dat door elke aanroep van "strip.show()" te vervangen door mijn eigen functie. Iets wat in jouw geval ook zou kunnen werken.
In plaats van "show.strip()" gebruik ik dan bijvoorbeeld "showstrip()" (let op de punt die ik heb weggehaald), waarbij ik zelf een functie "showstrip()" definieer.
Zoiets als dit:
bool showstrip() {
if (digitalRead(BUTTON_PIN) == LOW) {
ResetToBlack();
return false;
} else {
show.strip();
return true;
}
}
Om te weten dat een functie moet worden afgebroken, laat ik deze nieuwe functie een boolean (bool - dus true of false) terug geven.
Als het resultaat TRUE is, dan gaan we verder met het lopende effect. Komt er echter FALSE terug, dan moet het lopende effect worden afgebroken.
Als we dan (als voorbeeld) naar de rainbow functie kijken:
void rainbow(uint8_t wait) {
uint16_t i, j;
delay(ButtonDelay);
while (true) {
for (j = 0; j < 256; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
if (digitalRead(BUTTON_PIN) == LOW) {
ResetToBlack();
return;
}
}
strip.show();
delay(wait);
}
}
}
dan moet deze worden aangepast naar:
void rainbow(uint8_t wait) {
uint16_t i, j;
delay(ButtonDelay);
while (true) {
for (j = 0; j < 256; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
if (!stripshow()) { return; } // let op het uitroepteken voor "stripshow()"
delay(wait);
}
}
}
Een paar voordelen hiervan:
Je hoeft de code voor het testen van de knop maar 1x te schrijven
Daardoor worden de andere functies ook overzichtelijker.
Ook nog een puntje: drukknoppen kunnen een "bounce" effect hebben, waardoor het voor de Arduino lijkt alsof de knop meerdere keren ingedrukt werd.
Uiteraard niet de bedoeling, dus wat men dan vaak doet is het uitlezen van de knop status voorzien van een kleine pauze.
Omdat we de test nu doen na het opzetten van alle kleuren, dus bij strip.show() in plaats van bij strip.setPixelColor, hebben we eigenlijk al een kleine pauze automatisch ingebouwd.
Het KAN zijn dat de pauze dan toch nog te kort is. In dat geval moeten we even naar de verlopen tijd kijken, wanneer de laatste keer de knop was getest.
Daar kijken we dan wel naar mocht dat nodig zijn.
Misschien helpt dit je op weg of maakt dit het verhaal nog verwarrender haha - ik hoop dat het helpt.
Â
Nog een tip: de FastLED bibliotheek is een betere keuze dan de NeoPixel bibliotheek.
FastLED is volwassener, wordt actiever bijgehouden, en is over het algemeen aanzienlijk sneller. 😊Â