Programmeerbare led-boom; voorbeeld-led-loopjes
Zie vorig artikel Nano-programmeerbare kerstboom
Als de hardware geïnstalleerd is, kan je spelen met de broncode in de Arduino IDE, gemakkelijkst is om te beginnen van een voorbeeldprogramma waar een element in zit dat je wil verkennen.
Behalve voor het beschreven bord-met-leds geldt veel van de software voor heel wat reeksen van led’s, met als ledstrip-lengte een aan te passen getal (bv #define LEDCOUNT 12)
Om het effect van de drie kleuren te verstaan: zoek op internet naar de afbeelding van een “color wheel for light”.
Om vat te krijgen op de juiste led, maken we eerst een programma dat de leds afloopt in volgorde van de nummering van het bord (begint bij nul).
We laten de rode led op de Nano mee- (of eerder tegen-) knipperen als controle.
Inhoud:
- Eén led loopt rond tussen donkere leds
- Eén led loopt rond in een gekleurde kerstboom
- Een ribbe van de kerstboom heeft verschillende kleuren, draait weg naar de spits toe.
- Bauw zwaailicht
Gemeenschappelijk is altijd het invoegen van de Adafruit NeoPixel bibliotheek:
(nota: de < en > tekens hebben een spatie gekregen die er uit moet)
#include < Adafruit_NeoPixel.h >
#define PIN 9
#define LEDCOUNT 12
En bijna altijd heb je een index of teller nodig:
int i=0;
… (* soms komt hier dan bv een array met led-volgnummers of andere definities)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, PIN, NEO_RGB); // + NEO_KHZ800);
En dan een algemene setup code die de leds initialiseert:
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
strip.begin();
strip.show(); // Initialize alle pixels 'off'
en daarna komt de oneindige programmalus “loop”:
void loop() {
// allerlei code, met een if of select voorwaarde of een andere herhaling
// dikwijls voorzien van een rustpauze van een aantal milliseconden:
delay(1000);
}
Eén led loopt rond tussen donkere leds
De rode led op het Nano bord pinkt om de programmaloop aan te tonen (mag er dus uit)
void loop() { digitalWrite(LED_BUILTIN, HIGH); // led op Nano aan delay(250); // even houden digitalWrite(LED_BUILTIN, LOW); // led op Nano uit delay(250); // even wachten voor // boom // led i kleursterktes (rood, groen, blauw) strip.setPixelColor(i, 10, 10, 200); strip.show(); delay(1000); strip.setPixelColor(i, 0, 0, 0); // led i terug uit i++; // volgend led tot laatste.. if(i > LEDCOUNT) { i=0; // terug naar eerste } }
Conclusie: led 0 staat onderaan op de boom, op de ribbe diagonaal aan de overkant van de aan-uit schakelaar (voor de batterij), waar eigenlijk C/5 het dichstbij staat.
A B C D 2 8 3 9 1 7 4 10 0 6 5 11
Eén led loopt rond in een gekleurde kerstboom
Richting: van 0 naar 11.
void loop() { digitalWrite(LED_BUILTIN, HIGH); // bord led knippert tegen; aan delay(250); // houden.. digitalWrite(LED_BUILTIN, LOW); // uit delay(250); // pauze alvorens led i te wijzigen; strip.setPixelColor(i, 10, 10, 200); // led nummer i blauw strip.show(); delay(1000); geniet strip.fill(strip.Color(0, 32, 0), 0, 12); // Kerstboom terug groen strip.show(); delay(500); // even houden zo i++; // schuif door naar nummer volgende led tot laatste if(i > LEDCOUNT) { i=0; // dan terug naar eerste }
Rond de boom …
Met het volgen van de leds zoals ze intern genummerd zijn, worden de ribben van de boom-piramide gevolgd, van onder naar boven en over de top terug naar onder (zie boven).
Maar wij willen ze zo laten lopen:
A B C D 8 9 10 11 4 5 6 7 0 1 2 3
We laten niet de led-nummer optellen, maar wel de index in een rij van led-nummers.
0 6 5 11 1 7 4 10 2 8 3 9
In de definities boven de setup moeten de volgorde van het aanspreken van de pixels vooraf vastgelegd worden om gemakkelijk te kunnen rondlopen:
int ledPins[] = { 0, 6, 5, 11, 1, 7, 4, 10, 2, 8, 3, 9 };
Pinkende ribben, rond-uitloop naar top
void loop() { digitalWrite(LED_BUILTIN, HIGH); // bord led knippert tegen; aan delay(250); // houden.. digitalWrite(LED_BUILTIN, LOW); // uit delay(250); // pauze alvorens boom te wijzigen; strip.setPixelColor(ledPins[i], 200, 200, 0); // pixel i aan, geel strip.setPixelColor(ledPins[i+4], 40, 40, 255); // pixel op volgende laag boven blauw strip.setPixelColor(ledPins[i+8], 150, 20, 20); // pixel op daaropvolgende laag rood strip.show(); // pixelnummers boven LEDCOUNT geen probleem, worden onzichtbaar delay(1000); pauze voor kleur terug uit; m.a.w. boom volledig kleuren; strip.fill(strip.Color(2, 50, 2), 0, 12); // Kerstboomgroen, bv 2, 50, 2 of 0, 32, 0 strip.show(); delay(100); // wachtebeke i++; // opschuiven tot laatste led, if(i >= LEDCOUNT) { i=0; // dan opnieuw } }
Blauw zwaailicht
digitalWrite(LED_BUILTIN, HIGH); // led op bord aan (voltage hoog) delay(30); // wacht even digitalWrite(LED_BUILTIN, LOW); // led op bord uit (voltage laag) delay(30); // wacht even
speel met deze delays (en die op het einde) voor de snelheid van het ronddraaien…
strip.fill(strip.Color(4, 4, 25), 0, 12); // zwak blauw licht tussendoor
strip.show();
strip.setPixelColor(ledPins[i], 2, 2, 255); // turn pixel on, ? color
strip.setPixelColor(ledPins[i+4], 2, 2, 254); // turn pixel on, ? color
strip.setPixelColor(ledPins[i+8], 2, 2, 253); // turn pixel on, ? color
strip.show();
delay(70); // wait for ..
De +4 en +8 zorgen ervoor dat de boven elkaar liggende leds samen gebruikt worden.
De waarden voor de kleuren zijn een tikje anders gezet, waardoor je boven/onder kan herkennen
i++; if(i >= LEDCOUNT-8) { i=0; }
Dit laatste stuk zorgt ervoor dat het licht, eens helemaal rond, terug bij de eerste ribbe begint. Voor een politie-zwaailicht effect kan je de delay tijden korter zetten.
Veel plezier…