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
- 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.
- Die Anoden (
+
) der LEDs mit den AusgängenD2 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). - Die Kathoden (
-
) der LEDs auf der rechten Seite des Steckbretts auf gleicher Höhe einstecken. - 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.
- Verbinden Sie die “gemeinsame Kathode” mit Hilfe eines Brückendrahtes mit einem der “GND”-Pins der Mikrocontroller-Platine.
- 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!