LED Ring willekeurig knipperend
Op deze pagina behandelen we twee programma's. Het eerste zal iedere keer een willekeurige LED tonen in een van de door ons opgegeven kleuren.
In de code maken we een array (lijst) met verschillende kleurcodes. Deze kleuren zetten we in de lijst. Kleuren op de computer bestaan uit RGB codes. RGB staat voor Rood, Groen Blauw. Voor hexadecimale bedragen staat het hekje teken om aan te geven dat het een hexadecimale waarde is.
Meer over hexadecimale kleuren
In Arduino is een string (een text) een lijstje van karakters, we slaan de plaats waar de tekst start op. Het aantal kleuren rekenen we uit door de gehele lengte van de tekst te delen door de grootte van het eerste woord. Dit geven we aan met het type
char *
Als de gehele lijst dus 12 plaatsen (bytes) groot is en het eerste element in de lijst is 2 plaatsen (bytes) groot. Dan weten we dat er 6 elementen in de lijst zitten. Dit aantal elementen slaan we op in een variable numColors. Dit hoeven we niet in iedere loop te berekenen, daarom doen we dat in de startup.
Willekeur
We gaan eerst kijken naar de willekeurige kleuren en willekeurige posities. Hiervoor gebruiken we de interne functie
random()
. De random functie geeft een willekeurig getal. We moeten wel de bovengrens aangeven. Als de bovengrens 5 is. Dan zal random een willekeurige waarde geven tot aan 5. Dus 0, 1, 2, 3 of 4. Nooit 5 zelf.
Om ervoor te zorgen dat we iedere keer willekeurige nummers krijgen moeten we de
interne dobbelsteen
eerst losschudden (willekeurig maken). Dit doen we door hier een randomSeed() van te maken. Erinmoet een willekeurige waarde en we lezen hiervoor de analoge poort (A0) uit. Dan weten we dat we iedere keer een andere rij willekeurige elementen krijgen.
In NUM_LEDS staat hoeveel LED's te hebben. 8 of 12 waarschijlijk. Dit gebruiken we in de random. We krijgen nu dus een waarde van 0 tot 8 (of tot 12). En dat is eigenlijk wel goed. Want bij het nummeren van de LED's op de ring beginnen we ook met 0 tot (!) het aantal elementen in NUM_LEDS.
int randomPosition = random(NUM_LEDS);
int randomColor = random(numColors);
We krijgen hierboven dus een willekeurige LED positie en een willekeurige kleur. We zetten nu in de leds array de waarde op de willekeurige positie.
leds[randomPosition] = hexToCRGB(colors[randomColor]);
De kleur staat in een tekst
#FF00FF
. De library kan hier niets mee. Wat we moeten doen, is eerst het hekjes (#) eraf halen, en dan de tekst omzetten naar een intern gebruikte CRGB kleur. Dat gaat met de CRGB() functie. Ik gebruik hier een losse zelfgeschreven functie voor hexToCRGB(). Deze krijgt de tekstvoorstelling binnen. Maakt dan een color variable aan, waarbij het hekje niet zal worden meegenomen. Na omzetting naar CRGB waarde, geeft de functie de nieuwe kleurcode terug.
Source code
#include <FastLED.h>
#define NUM_LEDS 12       // Define the number of LEDs in your ring
#define DATA_PIN 2        // Define the data pin where the LED ring is connected
CRGB leds[NUM_LEDS];      // Create an array to hold the LED colors
const char* colors[] = {"#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#FFFF00"};
int numColors;
void setup() {
  FastLED.addLeds<WS2812, DATA_PIN>(leds, NUM_LEDS);     // Initialize the LED ring
  numColors = sizeof(colors) / sizeof(colors[0]);        // Calculate number of elements
  randomSeed(analogRead(A0));                            // This creates a random seed based on noise from the unconnected pin
}
void loop() {
  int randomPosition = random(NUM_LEDS);                 // Random number between 0 and amount
  int randomColor = random(numColors);                   // Random number between 0 and the amount of items in colors
  fill_solid(leds, NUM_LEDS, CRGB::Black);               // Turn off all LEDs
  leds[randomPosition] = hexToCRGB(colors[randomColor]); // Set to the color
  FastLED.show();                                        // Display values
  // fill_solid(leds, NUM_LEDS, hexToCRGB(colors[randomColor]));   // Color all the LEDs
  // FastLED.show();                                               // Display values
  delay(75);
}
// Function to convert hex string to CRGB
CRGB hexToCRGB(const char* hex) {
  long color = strtol(hex + 1, NULL, 16);  // Skip the '#' character and convert the hex to an integer
  return CRGB(color);  // Return the corresponding CRGB color
}
Aandacht trekker
Dit tweede programma is nog erger. Nu gebruiken we de gehele ring in willekleurige kleuren.
Source code
De source code aanpassing is klein. Er hoeven maar twee wijzigingen gedaan te worden. De regel waarin we de individuele LED kleur bepaken kan weg. Ook het bepalen van de random waarde voor de LED is niet meer nodig. Dan hoeven we enkel de regel waarin we eerst alle LED's uitzetten, te vervangen door een regel waarin we alle LED's aanzetten.
fill_solid(leds, NUM_LEDS, hexToCRGB(colors[randomColor]));    // Color all the LEDs
Je vraagt je misschien af waarom ik zo een klein ding opneem. Dat is tweeledig. Hiermee laat ik zien dat door enkele kleine slimme veranderingen, je een geheel ander/nieuw programma krijgt. En door het veranderen van kleine dingen probeer ik te stimuleren dat je zelf ook gaat nadenken, en veranderen. Dat is het leukste wat er is.