Sodele. Schnell noch ein bisschenwas drum herum gebastelt und
Das Programm spielt mit den Leuchtdioden, und gibt alle zwei Sekunden die aktuelle Akkuspannung aus.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 ----------------------------------------------
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.







Zitieren

Lesezeichen