Arduino Projekt: LED Weihnachtsbaum

In diesem Beitrag möchte ich ein kleines Arduino Projekt zum Weihnachtsfest präsentieren.

Arduino Projekt "Weihnachtsbaum"

Das Layout des PCB habe ich selber erstellt und bereits im Tutorial Eigene PCBs mit Seeedstudio erstellen erläutert.

PCBs von Seeedstudio.com
PCBs von Seeedstudio.com

Benötige Bauelemente & Werkzeuge

Für das Zusammenbauen verwende ich folgende Werkzeuge:

  • Lötkolben,
    • inkl.  Lötzinn ∅ 0,5 mm
    • Ständer
    • hitzebeständige Unterlage
  • Seitenschneider
  • Pinzette

Für das PCB Layout benötige ich des Weiteren:

Für den Betrieb des PCBs wird benötigt:

Den Arduino Nano gibt es als „China clone“ für schon knapp 4 € zu kaufen, wenn man jedoch den Originalen erwerben möchte, muss man schon deutlich tiefer in die Tasche greifen. Beim Kaufen eines „China clones“ muss man darauf achten welcher Chip montiert ist. Hier gibt es einige Unterschiede, obwohl alle die Bezeichnung „Arduino Nano v3.0“ tragen.

Für den Arduino Workshop habe ich den Arduino Nano v3.0 mit dem ATmega168  Chip und dem für diese Typen üblichen CH340G Chip verwendet. Dieser musste in der Arduino IDE „nur“ unter Bootloader eingestellt werden und dann lief auch dieser zuverlässig.

Testen der LEDs

Bevor mit dem zusammenbauen begonnen wird, empfehle ich hier die LEDs auf die korrekte Funktion zu testen. Dieses kann mit einer Knopfzelle schnell erledigt werden. Oder aber man hat ein Messinstrument, mit welchem man Dioden Testen kann hier wird eine geringe Spannung ausgegeben und die LED leuchtet auf.
Auf ebay.de gibt es auch spezielle Geräte zum Testen von Leuchtdioden für schon knapp 3 Euro inkl. Versandkosten.

Hinweis zum Aufbau

Auf der Platine ist für jede LED ein kleines Symbol eingezeichnet, wo man erkennen kann wie herum diese eingesteckt wird.
In meinem Fall ist es nun das genau dieses Symbol um 180° verdreht ist, somit wird die Kathode (der Minuspol) nach oben und die Anode (der Pluspol) nach unten eingesteckt.

Schritt 1 – Auflöten der LEDs

Als Erstes wollen wir die LEDs einlöten.

Lötaugen für die LEDs, Kathode - Anode
Lötaugen für die LEDs, Kathode – Anode

Ich wähle hier 5 mm LEDs in den Farben rot und gelb.

Die LEDs werden mit der Kathode (kurzes Beinchen bzw. abgeflachte Seite) nach oben in die Löcher gesteckt und die Beinchen auf der Rückseite umgebogen.

Aufbau einer LED
Aufbau einer LED

Dieses hat den Vorteil das die LEDs nicht wieder rausrutschen können.

Weihnachtsbaum einlöten der LEDsWeihnachtsbaum einlöten der LEDs
Weihnachtsbaum einlöten der LEDs

Schritt 2 – Piezo Buzzer einlöten

Auf dem Piezo Buzzer ist ein kleines (+) Zeichen abgebildet, dieses spielt beim Einlöten keine Rolle.

Piezo Buzzer
Piezo Buzzer

Für den Piezo Buzzer sind zwei kleine Lötaugen auf der Platine welche mit „Buzzer“ markiert sind, diese führen zu zwei Stifte, welche im nächsten Schritt eingelötet werden.

Schritt 3 – Einlöten der Stiftleiste(n)

Die 12 Stiftleisten müssen in

  • 1x 9er Stiftleiste (für die LEDs)
  • 1x 2er Stiftleiste (für den Buzzer)
  • 1x 1er Stift (für GND)

mit einem Seitenschneider getrennt werden.

Hier empfehle ich den Erwerb von Stiftleisten mit einer definierten Kerbe.

Stiftleiste 2,54mm
Stiftleiste 2,54 mm

Es gibt die Stiftleisten auch mit einer glatten Kante, jedoch habe ich hier festgestellt das diese sich nur mit aller Vorsicht und einer feinen Säge vernünftig teilen lassen. Daher greife ich immer gerne auf die Abgebildeten Stiftleisten zurück.

Die Stiftleisten lassen sich nicht umbiegen und daher hat man etwas „Fummelarbeit“ vor sich. Ich stapel mir immer etwas auf so das die Platine und die Stifte im rechten Winkel stehen, danach wird ein Stift angelötet.

Platine mit Lötstiften
Platine mit Lötstiften

Hat man dieses getan, so kann man die restlichen Stifte bequem mit einer 3. Hand festlöten.

Schritt 4 – Einlöten der Widerstände

Die 9 Widerstände werden in die markierten (R1..R9) Löcher gesteckt und eingelötet.

eingelötete, 220 Ohm Widerstände auf der Platine
eingelötete, 220 Ohm Widerstände auf der Platine

Bei einem Widerstand ist es egal wie herum dieser eingelötet wird, es ist jedoch ansehnlicher für den Betrachter, wenn alle Widerstände in die gleiche Richtung eingelötet wurden.

220 Ohm Widerstand
220 Ohm Widerstand

Bei den Widerständen ist es wichtig, dass die Beinchen auf der Rückseite umgebogen werden, denn diese verrutschen sehr schnell.

Schritt 4 – anschließen der Breadboardkabel

Im vierten Schritt werden die Breadboardkabel angeschlossen ich verwende 20 cm lange,  mit Stecker und Buchse.

Weihnachtsbaum mit Breadboardkabel
Weihnachtsbaum mit Breadboardkabel

Schritt 5 – Programmieren

Die Melodie habe ich aus dem Sketch von AbhishekGhosh entnommen, dieser hat auf dem GitHub Repository https://github.com/AbhishekGhosh/Arduino-Buzzer-Tone-Codes/blob/master/Jingle-bells.ino  ein entsprechendes Arduino Sketch bereitgestellt. 

Somit konnte ich dieses fast 1:1 übernehmen. Ich habe da nur ein paar Variablennamen, die Funktion zum Abspielen der Melodie sowie ein paar modifier angepasst.

Es werden keine zusätzlichen Bibliotheken benötigt!

Quellcode

//LEDs an den digitalen Pins 2 bis 10 angeschlossen
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
//Array mit den LEDs sowie dem Status der LED
int leds[9][2] = {{LED1,LOW}, {LED2,LOW}, {LED3,LOW}, {LED4,LOW}, {LED5,LOW}, {LED6,LOW}, {LED7,LOW}, {LED8,LOW}, {LED9,LOW}};
//Intervall zum ändern eines Status der LED
//Wenn die LEDs öffters / schneller blinken sollen muss diese Variable kleiner werden ansonsten größer.
const int LED_ACTION_INTERVALL = 750;
//Variable zum speichern der letzten Ausführung.
long lastLedAction =0;

//Piezo Buzzer am digitalen PWM Pin 11 angeschlossen
#define BUZZER 11

//Definieren der Töne
#define  C     2100
#define  D     1870 
#define  E     1670
#define  f     1580
#define  G     1400 
#define  R     0 //reset

//Melodie von Jingle Bells
const int jingleBellsMelody[] = {E, E, E,R, E, E, E,R, E, G, C, D, E, R, f, f, f,f, f, E, E,E, E, D ,D,E, D, R, G ,R, E, E, E,R, E, E, E,R, E, G, C, D, E, R, f, f, f,f, f, E, E, E,  G,G, f, D, C,R };
//Berechnen der Anzahl der Töne in der Melodie
const int MAX_COUNT = sizeof(jingleBellsMelody) / 2;
const int beat = 50;
const long tempo = 10000;
int rest_count = 100;
int pause = 1000;

void setup(){
  //Initialisieren der LEDs als Ausgänge und mit dem Status LOW (AUS)
   for(int i=0;i<9;i++){
    digitalWrite(leds[i][0], leds[i][1]); 
  }

  //Setzen des Buzzer Pins als Ausgang
  pinMode(BUZZER, OUTPUT);  
}

/**
 * Spielt die Melodie ab.
 */
void playTone(int tone_, long duration) {
   long elapsed_time = 0;
   //Wenn der Ton kein Reset ist dann...
   if (tone_ > 0) {
     //Prüfen ob die Zeit vom letzten ausführen eines LED blinkens kleiner als 
     //die aktuelle Zeit + dem Intervall ist.
     if(lastLedAction < (millis()+LED_ACTION_INTERVALL)){
        //speichern der aktuellen Zeit
        lastLedAction = millis();
        //erzeugen einer Zufallszahl von 0 bis 8
        int randomValue = random(8);
        //lesen des Status aus dem Array mit den LEDs 
        int status = leds[randomValue][1];
        //Wenn der Status LOW / AUS ist dann soll er auf HIGH gewechselt werden.
        if(status == LOW){
          leds[randomValue][1] = HIGH;
        } else {
          //Wenn der Status HIGH / AN ist dann soll auf LOW gewehcselt werden.
          leds[randomValue][1] = LOW;
        }
        //neues Auslesen des Status aus dem Array
        status = leds[randomValue][1];

        //Setzen der LED mit dem neuen Status
        digitalWrite(leds[randomValue][0], status); 
     }

     //Abspielen der Melodie
     while (elapsed_time < duration) {
       //Buzzer an
       digitalWrite(BUZZER,HIGH);
       //Pause von der länge des Tones durch 2
       delayMicroseconds(tone_ / 2);
       // DOWN
       //Buzzer aus
       digitalWrite(BUZZER, LOW);
       //Pause von der länge des Tones durch 2
       delayMicroseconds(tone_ / 2);
       //Speichern wielange der Ton dauerte
       elapsed_time += (tone_);
     }
   }
   else { // Reset 
     for (int j = 0; j < rest_count; j++) {
       delayMicroseconds(duration); 
     } 
   }                                
 }

void loop(){
  long duration = beat * tempo; // Set up timing
  //Für jede Note aus der Melodie....
  for (int i=0; i<MAX_COUNT; i++) {
    //lesen der Note i aus dem Array der Melodie    
    playTone(jingleBellsMelody[i], duration);
    //Wenn die Melodie schneller abgespielt werden soll dann muss 
    //die Variable für den beat sowie die pause angepasst werden.
    delayMicroseconds(pause);  // eine kleine Pause zwischen den Noten....
  }
    
  delay(500);
}

2 Kommentare

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert