Sodele. Schnell noch ein bisschenwas drum herum gebastelt und
Code:
// Spannungswächter Lithium-Biene
// ****** by Rabenauge ******
// Misst die aktuelle Bordspannung und gibt sie auf Zehntel Volt genau auf Display aus
// Diese Messung wird alle zwei Sekunden wiederholt,
// ausserdem wird nach rund einer Minute die Displaybeleuchtung ausgeschaltet, kann aber
// mit dem linken Fühler nach hinten jederzeit wieder für eine Minute eingeschalten werden
// Als Demo blinken die beiden gelben LED`s abwechselnd im Sekundentakt, nur, damit _irgend-
// was_ getan wird.
// Unterschreitet die Akkuspannung einen bestimmten Wert (konkret 6.5V), wird die Display-
// beleuchtung eingeschalten, ein Achtungssignal ausgegeben und die beiden roten LED
// eingeschalten.
// Alles läuft Timergesteuert, über Timer 0, die delay()-Funktion wird nicht benötigt
// HINWEIS: das Programm ist ausgelegt auf NiboBee mit 2s LiPo als Stromversorgung, die
// per Spannungsstabilisierung auf 5V gebracht wird, es wird aber die tatsächliche Akku-
// Spannung gemessen. Da die bei Standard-NiboBee`s gleich der Bordspannung ist, wird die
// Messung dann _so_ nichts bringen, da die 5V als Referenz benutzt werden!
#include <nibobee/iodefs.h>
#include <nibobee/i2cmaster.h>
#include <nibobee/lcdi2c.h>
#include <nibobee/led.h>
#include <nibobee/analog.h>
#include <nibobee/sens.h>
#include <stdio.h>
//------------------------------------------- Variablen & Co ----------------------------
uint16_t volt=0;
uint16_t volt_zehntel=0;
uint16_t volt_mess=0;
int16_t count_backLight=0;
int8_t count=0;
//----------------------------------------- Spannungsüberwachung ------------------------
int Batterie(void)
{
volt_mess=analog_getValue(4); // Analogeingang 4 abfragen
volt= 10*volt_mess/1023; // Ganzevolt=2*5V*737/1023
volt_zehntel= 10*volt_mess/102-10*volt; // Zehntelvolt=2*5V*737/102-10*Ganzevolt
lcd_setCursor(3,1); // Messwert ausgeben
printf(" %1d",volt);
printf(".");
printf("%1d",volt_zehntel);
printf(" Volt");
if (volt==6&&volt_zehntel<5) // Falls Spannung zu niedrig wird (unter 6.5V)
{
lcd_setBacklight(0); // Licht an
lcd_setCursor(7,2); // Alarm schlagen
printf(" ACHTUNG");
led_set(LED_L_RD,1);
led_set(LED_R_RD,1);
count_backLight=0;
}
return 0;
}
//------------------------------------ Beleuchtung aus/Stromsparmode --------------------
int Beleuchtung(void) //Unterprogramm Displaybeleuchtung
{ //schaltet nach ca.1Minute die Display-
if(count_backLight > 60*57) //Beleuchtung ab
{
lcd_setBacklight(1);
}
return 0;
}
//------------------------------------ Hauptprogramm ------------------------------------
int main(void)
{
TCCR0 = (1<<CS02)| (1<<CS00); // Normal Mode, kein OC0-Pin, prescaler /1024
TIMSK |= (1<<TOIE0); // Timer0 Overflow-Interrupt erlauben
i2c_init(); // I2C initialisieren
lcd_init(0x27); // LCD initialisieren, Adresse festlegen
analog_init(); // Analogeingänge initialisieren
led_init(); // LED`s initialisieren
set_output_group(IO_SENS); // Pull-ups aktivieren
enable_interrupts(); // Interrupts einschalten
lcd_setBacklight(0); // Licht an
lcd_setCursor(1,0);
printf(" Bordspannung"); // Programmname
lcd_setCursor(0,2);
printf("<<Licht");
while(1)
{
enable_interrupts();
int8_t status_L = sens_getLeft();
if(status_L < 0) //mit linkem Fühler nach hinten
{ //Licht wieder anmachen
lcd_setBacklight(0);
count_backLight=0;
}
if(count == 57) // nach 1 Sekunde
{
led_set(LED_R_YE,1); // LED an
led_set(LED_L_YE,0); // andere aus
Batterie(); // Akkuspannung messen
}
if(count > 2*57) // nach 2 Sekunden
{
led_set(LED_R_YE,0); // LED aus
led_set(LED_L_YE,1); // andere an
Beleuchtung(); // Licht aus?
count=0; // Sekundentimer zurücksetzen
}
}
return 0;
}
//--------------------------------- Timer-ISR -------------------------------------------
ISR(TIMER0_OVF_vect)
{
count++; // fürs blinken
count_backLight++; // für HG-Licht ausschalten
}
//----------------------------------- ENDE ----------------------------------------------
Das Programm spielt mit den Leuchtdioden, und gibt alle zwei Sekunden die aktuelle Akkuspannung aus.
Ausserdem wird ein "Alarm" ausgelöst, wenn die Akkuspannung unter 6.5V fällt.
Zusätzlich habe ich (jaha, ich _hatte_ grad Langeweile) noch eine kleine Routine eingebaut, die nach einer Minute die Hintergrundbeleuchtung des Displays ausschaltet (man kann sie jederzeit wieder einschalten), und _das_ gibt eine verwirrende Erkenntnis:
Wenn z.B. die Akkuspannung bei 7.6V ist, und das Display AUS, dann habe ich, wenn ich das Display wieder einschalte, mindestens 1/10V _mehr_ auf der Anzeige.
Merkwürdig, bedeutet das, das Display braucht bei eingeschaltener Hintergrund-Beleuchtung WENIGER Strom als ohne sie?
Sowas ähnliches las ich heute doch schon mal an anderer Stelle?
Übrigens wäre es schön, wenn die Profis (bin ich ja weit, weit weg von noch...) sich den Code mal anschauen, und eventuelle Kritikpunkte anmerken, nur so lernt man schliesslich was.
Lesezeichen