Glühwürmchen

Diese kleine LED-Simulation soll leuchtende Glühwürmchen in der Nacht nachahmen. Die Idee ist, sehr kleine SMD-LEDs zusammen mit entsprechender Schaltlogik in einem Einmachglas zu installieren, damit der Eindruck entsteht, es wären einige Glühwürmchen darin gefangen und würden in unregelmäßigen Abständen aufleuchten.

Test-Aufbau

Zunächst wird ein Test-Aufbau mit 5mm-LEDs erstellt, damit die Logik der Simulation erprobt werden kann.

Verwendete Bauteile

Aufbau der Schaltung

Aufbau der Schaltung auf dem Breadboard

Sketch

/**
 * Firefly simulation with 6 LEDs.
 * All the used Arduino pins have to be PWM-capable
 *(currently used pins: 3, 5, 6, 9, 10, 11)
 */

#define PHASE_WAIT    0
#define PHASE_FADEIN  1
#define PHASE_FADEOUT 2
#define PHASE_ON      3

#define MIN_WAIT_TIME  5000   // in milliseconds
#define MAX_WAIT_TIME 35000   // in milliseconds

#define MIN_ON_TIME  150      // in milliseconds
#define MAX_ON_TIME 5000      // in milliseconds

#define MIN_FADE_SPEED  5     // in milliseconds
#define MAX_FADE_SPEED 15     // in milliseconds

#define MAX_BRIGHTNESS 100    // in percent (default = 100)

struct FireFly {
    byte pin;
    byte lightValue;
    byte fadeSpeed;          // in milliseconds
    byte phase;
    unsigned long nextValue; // in milliseconds
    unsigned long nextWake;  // in milliseconds
    unsigned long nextFade;  // in milliseconds
};

// Used pins have to be PWMable!
FireFly flies[] = {
    { 3, 0, 5, PHASE_WAIT, 0, 0, 0},
    { 5, 0, 5, PHASE_WAIT, 0, 0, 0},
    { 6, 0, 5, PHASE_WAIT, 0, 0, 0},
    { 9, 0, 5, PHASE_WAIT, 0, 0, 0},
    {10, 0, 5, PHASE_WAIT, 0, 0, 0},
    {11, 0, 5, PHASE_WAIT, 0, 0, 0}
};

#define FIREFLY_AMOUNT sizeof(flies)/sizeof(FireFly)

void setup()
{
    randomSeed(analogRead(0));
    for(byte i=0; i<FIREFLY_AMOUNT; i++) {
        pinMode(flies[i].pin, OUTPUT);
        digitalWrite(flies[i].pin, LOW);
    }
}

void loop()
{
    for(byte i=0; i<FIREFLY_AMOUNT; i++) {
        switch (flies[i].phase) {
            case PHASE_ON:
                if (millis() >= flies[i].nextFade) {
                    flies[i].phase = PHASE_FADEOUT;
                }
                break;
            case PHASE_WAIT:
                if (millis() >= flies[i].nextWake) {
                    flies[i].phase = PHASE_FADEIN;
                }
                break;
            case PHASE_FADEIN:
                if (millis() - flies[i].nextValue < flies[i].fadeSpeed) {
                    continue;
                }
                flies[i].nextValue = millis();
                flies[i].lightValue++;
                if (flies[i].lightValue >= 255) {
                    flies[i].phase = PHASE_ON;
                }
                break;
            case PHASE_FADEOUT:
                if (millis() - flies[i].nextValue < flies[i].fadeSpeed) {
                    continue;
                }
                flies[i].nextValue = millis();
                flies[i].lightValue--;
                if (flies[i].lightValue <= 0) {
                    flies[i].phase = PHASE_WAIT;
                    flies[i].nextWake = millis() + random(MIN_WAIT_TIME, MAX_WAIT_TIME);
                    flies[i].nextFade = millis() + random(MIN_ON_TIME, MAX_ON_TIME);
                    flies[i].fadeSpeed = random(MIN_FADE_SPEED, MAX_FADE_SPEED);
                }
                break;
        }
        analogWrite(flies[i].pin, flies[i].lightValue*MAX_BRIGHTNESS/100);
    }
}

Demo

Video: Demo der Leuchtkäfer-Simulation auf dem Breadboard.

Leuchtkäfer im Glas

-die fertige Simulation im Glas ist noch im Aufbau-

zurück