Integration eines akkubetriebenen LED-Strahlers in HomeMatic
Verfasst: 20.05.2019, 22:29
Ich habe mir vor einiger Zeit einen LED-Strahler aus Fernost bestellt, weil es mir gefiel, ihn sowohl mit NiMH-Akkus als auch mit LiIOn-Zellen betreiben zu können. Leider ist der Betrieb mit 3 NiMh nicht zu empfehlen, da der Strahler damit nicht richtig hell leuchtet. Zwei 18650 hingegen lassen ihn schon ziemlich hell erstrahlen.
Weil ich neugierig war, habe ich mir die Elektronik näher angeschaut. Sie ist relativ überschaubar, weshalb ich auf die Idee kam, die Treiber für die großen LEDs (es gibt auch noch eine seitliche kleine Lampe) per HomeMatic anzusteuern. Da ein batterieoptimierter Sketch kein PWM-Signal ausgeben kann, habe ich mich dazu entschlossen, eine kleine Zusatzplatine zu entwerfen. Auf ihr werkelt ein Tiny13. Für die Anbindung an die HomeMatic habe ich meine Platine "Modular" mit LDO verwendet. Die beiden genutzten Ausgänge der Modular sind direkt auf zwei Eingänge des Tiny13 gelegt. Sofern diese beiden Eingänge auf LOW liegen, befindet sich der Tiny13 im Tiefschlaf. Er erwacht sehr kurz, wenn ein Pegelwechsel auf einem der Eingänge stattfindet und schaltet den Ausgang dann entsprechend. Programmiert habe ich die Helligkeit auf 100% und auf etwa 50%. Schaltet man beide Ausgänge gleichzeitig ein, dann blitzt die Lampe mit knapp 1 Hz.
Dadurch, dass ich den Treiber direkt ansteuere, ist die ursprüngliche Funktionalität der Lampe weiterhin gegeben. Die Nutzung mit der HomeMatic ist nur optional. Damit ich auch künftig problemlos Zugriff auf den Konfigurationstaster habe, habe ich diesen extern in das Batteriefach verlegt und in Schrumpfschlauch verpackt.
Der Stromverbrauch der beiden Platinen liegt in etwa bei 180 - 200µA und fällt damit kaum ins Gewicht.
Mein Dank gilt mal wieder Jérôme, der Softwarelegasthenikern wie mir bereitwillig hilfreich zur Seite steht!
viewtopic.php?f=76&t=50740
edit 02.06.2019:
Da ich darum gebeten wurde, hier noch weitere Infos zu dem Projekt.
Die beiden Ausgänge meiner Modular gehen auf D1 und D3 des Tiny13. Es kann auch jeder andere AVR verwendet werden, aber da der Sketch so klein ist, reicht ein Tiny13 aus. Der Ausgang D4 des Tiny geht über einen 10K Widerstand auf einen NPN. In diesem Fall ein BC817-40, der widerum auf den Eingang des LED-Treibers auf der Platine der Lampe geht. Wenn ich es richtig in Erinnerung habe, waren dort zwei Fets parallel geschaltet. Insofern ist es egal, an welchem der beiden Fets man das Kabel anlötet. Den Sketch für die Modular (oder auch einen ProMini, etc.) habe ich oben schon verlinkt, aber trotzdem noch mal angehangen. Einfach die zweite Endung (ZIP) löschen.
Die Blinkfrequenz, die über den Tiny13 vorgegeben wird, kann je nach Geschmack abgeändert oder auch ganz weg gelassen werden. Der Hardwareaufwand ist in Summe sehr überschaubar.
Geflasht habe ich den Tiny über die Arduino IDE per ISP.
Weil ich neugierig war, habe ich mir die Elektronik näher angeschaut. Sie ist relativ überschaubar, weshalb ich auf die Idee kam, die Treiber für die großen LEDs (es gibt auch noch eine seitliche kleine Lampe) per HomeMatic anzusteuern. Da ein batterieoptimierter Sketch kein PWM-Signal ausgeben kann, habe ich mich dazu entschlossen, eine kleine Zusatzplatine zu entwerfen. Auf ihr werkelt ein Tiny13. Für die Anbindung an die HomeMatic habe ich meine Platine "Modular" mit LDO verwendet. Die beiden genutzten Ausgänge der Modular sind direkt auf zwei Eingänge des Tiny13 gelegt. Sofern diese beiden Eingänge auf LOW liegen, befindet sich der Tiny13 im Tiefschlaf. Er erwacht sehr kurz, wenn ein Pegelwechsel auf einem der Eingänge stattfindet und schaltet den Ausgang dann entsprechend. Programmiert habe ich die Helligkeit auf 100% und auf etwa 50%. Schaltet man beide Ausgänge gleichzeitig ein, dann blitzt die Lampe mit knapp 1 Hz.
Dadurch, dass ich den Treiber direkt ansteuere, ist die ursprüngliche Funktionalität der Lampe weiterhin gegeben. Die Nutzung mit der HomeMatic ist nur optional. Damit ich auch künftig problemlos Zugriff auf den Konfigurationstaster habe, habe ich diesen extern in das Batteriefach verlegt und in Schrumpfschlauch verpackt.
Der Stromverbrauch der beiden Platinen liegt in etwa bei 180 - 200µA und fällt damit kaum ins Gewicht.
Mein Dank gilt mal wieder Jérôme, der Softwarelegasthenikern wie mir bereitwillig hilfreich zur Seite steht!
viewtopic.php?f=76&t=50740
edit 02.06.2019:
Da ich darum gebeten wurde, hier noch weitere Infos zu dem Projekt.
Die beiden Ausgänge meiner Modular gehen auf D1 und D3 des Tiny13. Es kann auch jeder andere AVR verwendet werden, aber da der Sketch so klein ist, reicht ein Tiny13 aus. Der Ausgang D4 des Tiny geht über einen 10K Widerstand auf einen NPN. In diesem Fall ein BC817-40, der widerum auf den Eingang des LED-Treibers auf der Platine der Lampe geht. Wenn ich es richtig in Erinnerung habe, waren dort zwei Fets parallel geschaltet. Insofern ist es egal, an welchem der beiden Fets man das Kabel anlötet. Den Sketch für die Modular (oder auch einen ProMini, etc.) habe ich oben schon verlinkt, aber trotzdem noch mal angehangen. Einfach die zweite Endung (ZIP) löschen.
Die Blinkfrequenz, die über den Tiny13 vorgegeben wird, kann je nach Geschmack abgeändert oder auch ganz weg gelassen werden. Der Hardwareaufwand ist in Summe sehr überschaubar.
Code: Alles auswählen
#include <avr/sleep.h>
#include <avr/interrupt.h>
#define IN0 3
#define IN1 1
#define OUT1 4
byte Zustand_IN0;
byte Zustand_IN1;
int Frequenz1 = 100; // ms
int Frequenz2 = 3000;
int Frequenz3 = 100;
void setup() {
pinMode(IN0, INPUT);
pinMode(IN1, INPUT);
pinMode(OUT1, OUTPUT);
}
void sleep()
{
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT3); // Use PB3 as interrupt pin
PCMSK |= _BV(PCINT1); // Use PB1 as interrupt pin
ADCSRA &= ~(1<<ADEN); // Testweise ADC off Befehl von anderer Webseite
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // replaces above statement
sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sei(); // Enable interrupts
sleep_cpu(); // sleep
cli(); // Disable interrupts
PCMSK &= ~_BV(PCINT3); // Turn off PB3 as interrupt pin
PCMSK &= ~_BV(PCINT1); // Turn off PB1 as interrupt pin
sleep_disable(); // Clear SE bit
ADCSRA |= (1 << ADSC); // Testweise ADC off Befehl von anderer Webseite
sei(); // Enable interrupts
}
ISR(PCINT0_vect)
{
}
void loop() {
Zustand_IN0 = digitalRead(IN0);
Zustand_IN1 = digitalRead(IN1);
if ((Zustand_IN0 == HIGH) && (Zustand_IN1 == LOW)) {digitalWrite (OUT1, HIGH);}
if ((Zustand_IN0 == LOW) && (Zustand_IN1 == LOW)) {digitalWrite (OUT1, LOW); sleep();}
if ((Zustand_IN0 == LOW) && (Zustand_IN1 == HIGH)) {
digitalWrite (OUT1, HIGH);
delay (Frequenz1);
digitalWrite (OUT1, LOW);
delay (Frequenz1);
}
if ((Zustand_IN0 == HIGH) && (Zustand_IN1 == HIGH)) {
digitalWrite (OUT1, HIGH);
delay (Frequenz3);
digitalWrite (OUT1, LOW);
delay (Frequenz2);
}
}