{{ :elektronik:stromsparendes_blinklicht:header.png?nolink&3000 |}}
====== Stromsparendes Blinklicht ======
Vor einigen Jahren habe ich eine Programm erstellt, dass regelmäßig eine LED blinken lässt. Die Schaltung hängt am Garagenfenster und läuft seitdem mit dem ersten Satz an Batterien (schon ca. 4Jahre). Der Stromverbrauch ist also nur minimal – vermutlich leicht über der Selbstentladung der Batterien.
Das ganze läuft mit einem Attiny13. Software- & Hardwareseitig wurden diverse Tricks zum Energiesparen umgesetzt. Z.B.:
* Attiny schläft die meiste Zeit und wird durch den Watchdog-Timer regelmäßig geweckt
* Takt des Attinys minimiert
* Tagsüber blinkt die Schaltung nicht (wird über LDR erkannt)
* LDR wird nur kurz bestromt
* Keine Kondensatoren (wegen Leckströmen) – Spannung von den Batterien ist stabil genug
* Blink-LED nur kurz an
===== Code =====
#define F_CPU 128000
#define DEBUG 0
#define LED_PULS 90 //ms
#define LED_PAUSE 10 //s
#define ADC_THRESHOLD 757 //3,7V
#define ADC_INTERVAL 60*30 //s
#define ADC_PIN_PREENABLE_TIME 1 //s
#define ADC_CALIBRATE_TIME 15000L //ms
#include
#include
#include
#include
#include
//Fuses:
// High: 0xFF
// Low: 0x73
//Ggf. ISP-Takt runtersetzen -> 25kHz bwz. falls versehentlich CHKDIV8 aktiv -> 2kHz
//PB0 => PIN5 => LED
//PB1 => PIN6 => Spannungsteiler Enabled
//PB2 => PIN7 => Spannungsteiler
unsigned int adc_measure(int ch) {
//ADC aktivieren
ADCSRA |= (1 << ADEN);
//ADC Channel wählen
ADMUX = ch;
//Messung starten
ADCSRA |= (1 << ADSC);
//Warten bis Messung fertig
while(!(ADCSRA & (1<ADC_THRESHOLD) {
PORTB |= (1 << 0);
} else {
PORTB &= ~(1 << 0);
}
j++;
_delay_ms(1);
}
PORTB &= ~(1 << 1);
//Watchdog Interval Timer
WDTCR |= (1<ADC_THRESHOLD) {
blink_enabled=1;
} else {
blink_enabled=0;
}
i2=0;
}
}
Der Prozessor läuft bei mit 128khz. Deswegen muss man beim Programmieren die ISP-Frequenz heruntersetzen. Nach dem Programmstart werden erstmal alle I/Os und der ADC initialisiert. Dann folgt ein Zeitfenster, bei dem man den Poti auf eine richtige Position einstellen kann, damit die Schaltung Tag & Nacht korrekt unterscheiden kann. Anschließend wird der Watchdog und der Sleepmode konfiguriert und der AVR schlafen gelegt.
Aufgeweckt wird der AVR sekündlich. Es wird geprüft, ob eine Aktion folgen muss, sonst legt der AVR sich gleich wieder schlafen. Wenn die definierte Zeit verstrichen ist, dann blinkt die LED kurz auf (sofern es dunkel ist). Der Code für das Überprüfen der Helligkeit wird auch regelmäßig aufgerufen (bei mir halbstündlich). Bevor der ADC die Helligkeit misst, wird der Spannungsteiler eingeschaltet, damit der genug Zeit hat, einen korrekten Wert auszugeben.
Die LED ist bei mir alle 10s für 90ms an. Das reicht, um dies als deutliches Aufblitzen zu erkennen. Habe allerdings auch eine klare, rote 5mm High-Power-LED. Bei schwächeren/low Current-LEDs kann das anders sein.
===== Schaltung =====
{{pdfjs 500px>:elektronik:stromsparendes_blinklicht:low_current_flash_light.pdf}}
Ich hatte ursprünglich leider keine Zeichnung angefertigt, weshalb ich diese eben noch per Kopf nachgebaut habe. Die Werte der Widerstände/des Potis weiß ich nicht mehr genau, aber das dürfte ja kein Problem sein…
Versorgt wird das ganze mit 3x AA-Batterien, also mit 4,5V bei vollen Batterien.
===== Bilder =====
{{:elektronik:stromsparendes_blinklicht:blinklicht1.jpg?direct&300|}}
\\ Blinklicht
{{:elektronik:stromsparendes_blinklicht:blinklicht2.jpg?direct&300|}}
\\ geöffnetes Gehäuse
{{:elektronik:stromsparendes_blinklicht:blinklicht3.jpg?direct&300|}}
\\ Schaltung
{{tag>[attiny attiny13 avr blinken led lowpower watchdog]}}
\\ ~~DISQUS~~