LEDs sind eine gute Alternative zu echten Kerzen. Hier habe ich 4 Kerzen für einen Adventkranz mit orangenen 10mm LEDs gebaut. Das flackern der Kerzen ist über eine Zufallszeit (random) von den PWM Ausgängen und der Wartezeit realisiert. Über einen Taster werden die 4 LEDs bzw. Kerzen nacheinander eingeschaltet und über einen LDR wird der Adventskranz eingeschaltet.
Schaltplan der Adventskranz Kerzen mit Arduino und 4 LEDs
Die 4 mal 10mm LEDs werden an die PWM PINs angeschlossen, es ist nur wichtig darauf zu achten dass der PWM nicht höher eingestellt ist als die Spannung, die die LEDs abkönnen ohne kaputt zu gehen. Der Taster an PIN D2 schaltete den GND durch, da der interne Pullup Widerstand verwendet wird. Der LDR an PIN A0 bracht natürlich einen 1,5 K.Ohm Widerstand.
PIN OUT: 5,6,9,10 (PIN2 auf HIGH)
PIN IN: D2 Taster, A0 LDR mit Pull Down auf GND (1 k.Ohm bis 10 K.Ohm)
Kerzenfallensimulation mit Ardublock (Arduino)
Das Programm ist recht einfach. Da ich der Einfachheit wegen Delay Schleifen werde habe ich mich entschieden zum wechseln der Tage einen Interrupt PIN (2) zu verwenden. Da dieser in Ardublock nicht entprellt werden kann (zum Beispiel über 1000 ms), setze ich eine digitale Variable auf "true" und setze diese im Programm dann erst nach 1000ms auf "false". Über den falls/sonst Block schalte ich die LEDs ein wenn der LDR einen Wert misst der für "dunkel" eingestellt ist. Ist dies nicht der Fall werden die LEDs über die Variable Tage eingeschaltet.
Die Simulation der Flamme realisiere ich wie oben geschrieben aus "Faulheit" einfach über zwei Zufallszahlen von 50 (nicht ganz aus) und 200 (LED geht nicht kaputt) am PWM PIN und von 0 (keine Zeit) bis 100 (1/10 Sekunde) am Delay Block. So Flackert die Kerze zufällig in der Helligkeit und in der Zeit.
Hier noch mal das ganze Programm im Überblick.
Arduino Code von Ardublock erzeugt:
int tage = 0;
long ZeitVariable = 0L;
bool umschalten = false;
int ldr = 0;
void Unterprogramm();
void ledaus();
void interrupt();
void setup() {
pinMode(2, OUTPUT);
Serial.begin(9600);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
attachInterrupt(0, interrupt, CHANGE);
tage = 0;
digitalWrite( 2 , HIGH );
ledaus();
}
void loop() {
ZeitVariable = millis();
while(ZeitVariable + 1000L >= millis()) {
if (( ldr < 200 )) {
Unterprogramm();
if (( tage == 5 )) {
tage = 0;
ledaus();
}
}
else {
ledaus();
}
if (( umschalten == true )) {
tage = ( tage + 1 );
Serial.print("tage ");
Serial.print(tage );
Serial.println();
Serial.print("Nachricht ");
Serial.println();
delay( 1000 );
umschalten = false;
}
}
ldr = analogRead(0);
Serial.print("LDR---- ");
Serial.print(ldr );
Serial.println();
}
//Sonntage
void Unterprogramm() {
if (( tage == 1 )) {
analogWrite(5 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
}
if (( tage == 2 )) {
analogWrite(5 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(6 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
}
if (( tage == 3 )) {
analogWrite(5 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(6 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(9 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
}
if (( tage == 4 )) {
analogWrite(5 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(6 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(9 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
analogWrite(10 , random( 50 , 200 ));
delay( random( 0 , 100 ) );
}
}
//ausschalten
void ledaus() {
digitalWrite( 5 , LOW );
digitalWrite( 6 , LOW );
digitalWrite( 9 , LOW );
digitalWrite( 10 , LOW );
umschalten = false;
}
void interrupt() {
umschalten = true;
}