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.
Zunächst wird ein Test-Aufbau mit 5mm-LEDs erstellt, damit die Logik der Simulation erprobt werden kann.
/**
* 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);
}
}
-die fertige Simulation im Glas ist noch im Aufbau-
zurück