Steckbrett-Lagerfeuer

Materialliste

Gegenstand Menge ~Preis [€]
LED: Warmweiß, z.B. Ifwd=30mA, 3lm 5 1,50
LED: Gelb, z.B. Ifwd=35mA, 1lm 2 0,60
LED: Rot, z.B. Ifwd=35mA, 0.4lm 1 0,30
Arduino Nano Atmega328 1 18
Steckbrett klein, z.B. 170 pins 1 0,70
Brückendrähte, pin-pin, z.B. 5cm 10 3,30

Dazu: Ein paar weitere Drähte, Mini USB-Kabel, Powerbank / USB-Ladegerät

Werkzeuge

  • Optional: Heißklebepistole
  • Optional: Lötkolben

Aufbau

Image: fireplace breadboard design detail view

Image: LED closeup
LED aus der Nähe betrachtet [ 1 ]
  1. Die rechte Pin-Seite des Arduino Nano mit der linken Seite des Steckbretts verbinden. Dabei darauf achten, dass alle Pins auf gleicher Höhe sind und möglichst nicht mit den Fingern zu berühren, da die Gefahr einer elektrostatischen Entladung besteht, die zu Beschädigung führen könnte.
  2. Die Anoden (+) der LEDs mit den Ausgängen D2 bis D9 auf dem Steckbrett verbinden. Die Anode ist meistens der Pin der LED, der nicht mit der Lichtquelle belegt ist (im Bild oben wäre das links).
  3. Die Kathoden (-) der LEDs auf der rechten Seite des Steckbretts auf gleicher Höhe einstecken.
  4. Alle Kathoden mit Hilfe von Überbrückungsdrähten verbinden. Alternativ können die Kathoden auch gleich zusammen gelötet oder mittels einer Verteilerbrücke, wie in meinem Beispiel oben verwendet, durchverbunden werden.
  5. Verbinden Sie die “gemeinsame Kathode” mit Hilfe eines Brückendrahtes mit einem der “GND”-Pins der Mikrocontroller-Platine.
  6. Die Anoden der LEDs sollten sich nicht berühren. Das kann man einfach sicherstellen, indem sie mit etwas Heißkleber fixiert werden.

Programmierung

Der Code ist so einfach, dass ich ihn hier in Gänze herunterschreiben kann kann. Kopieren Sie ihn in Ihre Lieblings-IDE, programmieren Sie Ihr Board und schon sind Sie fertig!

Disclaimer: Dieser Code ist “quick’n’dirty” und hat viel Potential für Refactoring. Zum Beispiel sind die Pin-IDs hartkodiert, ich verwende nicht die tollen und einfachen Features von C++11 wie Range-based for loop und der Geschwindigkeitsalgorithmus wird ziemlich oft die untere Grenze erreichen und kein zufälliges Verhalten zeigen. Ich freue mich über Ihre Verbesserungsvorschläge auf meiner Github discussions Seite.

#include <Arduino.h>

#define MAXLONG 0xFFFFFFFF
#define SPEED_HIGHLIMIT 1000 // 500Hz
#define SPEED_LOWLIMIT 0x1FFF // 20Hz

void calcFlicker(uint32_t randomFlicker);
void writeLed(uint8_t columnCode, uint16_t speed);
uint32_t iRNG = 1;

void setup() 
{
    randomSeed(analogRead(0));
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    iRNG = 1;
}

void loop() 
{
    iRNG = (iRNG >> 1) ^ (-(iRNG & 1u) & 0xd0000001u);
    calcFlicker(iRNG);
}

/*
    This function takes a 32bit random value,
    and moves this value along a window of an 8bit 
    flicker output value.
*/
void calcFlicker(uint32_t randomFlicker)
{
    uint8_t currentFlicker = (uint8_t)(randomFlicker & 0xFF);
    uint16_t randomSpeed = min(SPEED_LOWLIMIT, (uint16_t)(randomFlicker & SPEED_HIGHLIMIT));
    for(uint8_t i = 0; i < 24; ++i) // 24 because of 32bit length of random, may not run empty
    {
        writeLed(currentFlicker, randomSpeed);
        randomFlicker = randomFlicker >> 1;
    } 
}

/*
    this function outputs a code to an LED column of 8 LEDs
    connected to arduino's pins with a selectable delay.
*/
void writeLed(uint8_t columnCode, uint16_t speed)
{
    digitalWrite(2, columnCode & 0x01);
    digitalWrite(3, columnCode & 0x02);
    digitalWrite(4, columnCode & 0x04);
    digitalWrite(5, columnCode & 0x08);
    digitalWrite(6, columnCode & 0x10);
    digitalWrite(7, columnCode & 0x20);
    digitalWrite(8, columnCode & 0x40);
    digitalWrite(9, columnCode & 0x80);
    delayMicroseconds(speed);
}

Testen

Sobald Sie das Gerät über USB einschalten, sollte die LED-Flackersequenz beginnen. Es sollte sich ein ruhiges Flackern einstellen. Wenn man im Regal einen leeren Platz findet und ein paar Zweige zur Hand hat, könnte das doch ganz schön aussehen, oder? Mit einer Powerbank kann man dieses Lagerfeuer auf dem Steckbrett sogar überall hin mitnehmen. Das war’s, viel Spaß damit!

Zur Hauptseite des Projektes

Updated: