Enkele of dubbele lichtsnoer

Ledsnoer (staat nog uit)
We maken een enkele of dubbele lichtsnoer ("ledsnoer") van 9 of 18 ledlampjes. Meestal moet je hiervoor een aantal IC's gebruiken, maar voor deze lichtsnoer heb je alleen maar ledjes nodig en aansluitdraadjes. Voor de zekerheid kun je eerst even testen met een weerstand van bijvoorbeeld 120 Ω en deze verlagen tot de ledjes mooi licht geven. De meest eenvoudige sketch hiervoor zie je hieronder. Het ledje of de twee ledjes "lopen" van links naar rechts. Als je maar één rij ledjes wilt gebruiken dan kun je alle rode of alle groene ledjes vervangen door weerstanden van ongeveer 330 Ω. Als de ledjes niet genoeg licht geven dan kun je een kleinere weestand nemen.
Let op: als je de verkeerde leds (bijvoorbeeld powerleds) gebruikt kan de Arduino kapot gaan.
Uitleg: we gebruiken alle digitale en analoge pinnen van de Arduino. Elke pin gaat naar de lange poot van een rode led; de korte poot van de rode led is via het breadboard verbonden met de lange poot van een groene led; de korte pin van de groene led gaat naar aarde. Als je minder ledjes hebt dan kun je het getal 18 in de tweede en zesde regel veranderen in een kleiner aantal. Ik testte dit programma met de Arduino nano (deze is links, buiten beeld, op het breadbard geprikt). Met de Uno zal het ook goed werken.
void setup() {
  for ( int i = 1; i <= 18; i++ ) pinMode(i, OUTPUT);
}

void loop() {
  for ( int i = 1; i <= 18; i++ ) {
    digitalWrite(i, HIGH); delay(80); digitalWrite(i, LOW); delay(80);
  }
}

Varianten

Je kunt nu alle soorten lichtsnoeren maken die je maar bedenken kunt. Als je kleine ledjes hebt, dan kunnen ze alle 36 tegelijk aan zijn! Hier zijn een paar voorbeelden. In de code verderop zie je dat steeds een aparte functie gebruikt wordt voor elke variant. Zo blijft de sketch overzichtelijk en kunt je gemakkelijk een effect toevoegen of weghalen. Je kunt de functies niet allemaal tegelijk laten lopen, dus selecteer er slechts één door alleen bij die functie de // weg te halen. Er zijn de volgende functies: Tip: functies die je niet gebruikt kosten ook geen geheugen van je Arduino.
// ledSnoer.ino
// auteur: Th.M. Hupkens

const int Max = 18; // Zet hier jouw aantal gebruikte pinnen (volgorde: D0 t/m D13 en dan A0 t/m A5)
void setup() {
  for ( int i = 1; i <= Max; i++ ) pinMode(i, OUTPUT);
}

void loop() { // haal bij EEN van de functies // weg
  // ketting();
  // heenenweer();
  // willekeurig();
  // aantalAan(3); // Kies niet hoger dan MAX!
  // worm();
  // binaireteller();
}

void ketting() {
  for ( int i = 1; i <= Max; i++ ) {
    digitalWrite(i, HIGH); delay(60); digitalWrite(i, LOW); delay(60);
  }
}

void heenenweer() {
  for ( int i = 1; i <= Max; i++ ) {
    digitalWrite(i, HIGH); delay(60); digitalWrite(i, LOW); delay(60);
  }
  for ( int i = Max - 1; i > 1; i-- ) {
    digitalWrite(i, HIGH); delay(60); digitalWrite(i, LOW); delay(60);
  }
}

void willekeurig() {
  int i = 1 + random(18);
  digitalWrite(i, HIGH); delay(60); digitalWrite(i, LOW); delay(60);
}

void aantalAan(int aantal) {
  int k, leds[Max];
  for ( int i = 0; i < Max; i++ ) leds[i] = 0;
  leds[random(18)] = 1;
  for ( int i = 1; i < aantal; i++ ) {
    do k = random(18);
    while (leds[k] == 1);
    leds[k] = 1;
  }
  for ( int i = 0; i < Max; i++ )
    if (leds[i] == 1) digitalWrite(i + 1, HIGH);
    else digitalWrite(i + 1, LOW);
  delay(100); // Door traagheid oog lijkt het of er meer ledjes branden
  for ( int i = 0; i < Max; i++ ) if (leds[i] == 1) digitalWrite(i + 1, LOW);
}

void worm() {
  for ( int i = 1; i <= Max + 1; i++ )
    for ( int t = 0; t < 200; t++ ) {
        if (i     <= Max) if (t & 11) digitalWrite(i, LOW); else digitalWrite(i, HIGH);
        if (i + 1 <= Max) if (t & 1) digitalWrite(i + 1, LOW); else digitalWrite(i + 1, HIGH);
      if (i + 2 <= Max) digitalWrite(i + 2, HIGH);
        if (i + 3 <= Max) if (t & 1) digitalWrite(i + 3, LOW); else digitalWrite(i + 3, HIGH);
        if (i + 4 <= Max) if (t & 11) digitalWrite(i + 4, LOW); else digitalWrite(i + 4, HIGH);
      delayMicroseconds(650);
      for (int j = i; j < i + 5; j++) if (j <= Max) digitalWrite(j, LOW);
    }
}

void binaireteller() {
  for ( unsigned int i = 0; i < 4095; i++) { // 4095 is meer dan genoeg!
    for ( unsigned int j = 0; j <= 15; j++ ) {
      if ((1 << j & i)) digitalWrite(Max - j, HIGH);
      else digitalWrite(Max - j, LOW); // minst belangrijk bit staat rechts
    }
    delay(300);
  }
  delay(2000);
}