Ich habe mir mal gedanken gemacht, wie man die Batterie bzw Akkuspannung des Tonuino über den Arduino überwachen kann. Die Akkuspannung muss dazu über eine Schaltung, Mosfet oder Relais einem Analogpin des Arduino zugeführt werden. Die Schaltung kann über den ShutDownpin angesteuert werden, der den Tonuino abschaltet. Dazu später mehr. Hier erst mal die Software Lösung. Die Spannung wird in einem Zeitintervall alle 30 sekunden überprüft. Es werden zwei Grenzwerte für die Entladung festgelegt. Wird der erste Wert erreicht, erfolgt alle 30 sekunden eine Ansage, dass die Batterie schwach ist mit der Aufforderung zum Aufladen. Wird die zweite Schwelle erreicht, die der Entladeschlusspannung des Akkus entspricht, wird eine neue Warnung ausgegeben und der Tonuino ausgeschaltet. Das ganze setzt natürlich eine entsprechende Zusatzschaltung zB.Pololu switch voraus damit die Abschaltung auch funktioniert. Für die Ansagen der Warnungen müssen entsprechende mp3 Files sowohl für den advert, als auch den mp3 Ordner generiert werden. So hier der Code
// ------------------------------------------------------------------------------------------------
// Kann nur im 3 Tasten-Modus verwendet werden, da AnalogPin A4 im 5 Tastenmodus belegt ist.
//#define BattControl // Die Akkuspannung wird überwacht und bei Unterschreiten vom 1. festgelegten Wert
// wird eine Warnung ausgegeben und bei Unterschreiten des minWertes wird der Tonuino
// ausgeschaltet
// Hardwareerweiterung erforderlich (Batteriespannung muss bei ausgeschaltetem Tonuino
// vom Eingang des Arduino getrennt sein. (MosFet oder Relais)
// Definitionen der PINS
#ifdef BattControl
#define VControlPin A4 // Kontrollpin für Batterieüberwachung
// (Umdeklarierbar, wenn ein anderer Analogpin bei Nichtnutzung frei wird.)
#endif
// Deklarationen der Variablen (vor static const uint32_t cardCookie = 322417479) einfügen
bool StdBy = false; // StanbyTimer aktiv oder nicht, Voreinstellung Nicht aktiv`
#ifdef BattControl
float Vbatt; // Batteriespannung
const float Vwarning = 3.6; // Voltzahl für Warnung Batteriespannung (kann hier an den Akku angepasst werden)
const float Vshutdown = 3.2; // Voltzahl für Shutdown, Batterie leer (Kann hier an den Akku angepasst werden
unsigned long Now = 0; // millis() im Moment des Auslesens
unsigned long lastTest = 0; // Zeitpunkt letzte Prüfung
unsigned long TestIntervall = 30000; // Prüfintervall, hier 30 sekunden
#endif
// Diese Funktion zusätzlich einfügen
// ************************* Spannungsüberwachung der Batterie *********************************
#ifdef BattControl
void VoltControl()
{
int BattSensor = analogRead (VControlPin); // Sensorwert Batteriespannung
Vbatt = BattSensor * (5.0 / 1023.0); // Umrechnung in Volt
Serial.print(F("Batterie = ")); // Anzeige der Batteriespannung im ser Monitor
Serial.print ( Vbatt);
Serial.println (F( " Volt"));
// Spannung für Shutdown
if (Vbatt <= Vshutdown) // wenn Batterie Entladeschlussspannung erreicht
{
Serial.println(F("Batterie entladen --> ShutDown"));
mp3.playMp3FolderTrack(604);
waitForTrackToFinish();
delay (500);
ShutDown();
}
// Spannung für Warnung // wenn Batterie Schwellwert für Warnung erreicht
if (Vbatt <= Vwarning)
{
Serial.println(F("Batterie schwach --> Bitte aufladen"));
//waitForTrackToFinish();
if (isPlaying())
{
mp3.playAdvertisement(401);
waitForTrackToFinish();
}
else
{
mp3.playMp3FolderTrack(601);
waitForTrackToFinish();
delay (1000);
mp3.pause();
if (StdBy == false)
setstandbyTimer();
}
}
}
#endif
// Die Funktion des StandbyTimers ändern (Ein Teil der Funktion wird eine eigene Funktion ShutDown(),
// damit bei leerer Batterie der Tonuino automatisch abgeschaltet wird)
//**** Funktionen für den Standby Timer (z.B. über Pololu-Switch oder Mosfet) ********************
//*********** Im Schlummermodus wird der StandbyTimer auf 1 Sekunde gesetzt **********************
void setstandbyTimer() // Standbytimer aktivieren
{
Serial.print(F("StdBy Timer ON :"));
Serial.print(mySettings.standbyTimer);
Serial.println(F(" min"));
if (mySettings.standbyTimer != 0) // wenn Wert >0 wird Standbytimer aktiviert
{
sleepAtMillis = millis() + (mySettings.standbyTimer * 60000); // Standbytimer auf vorgewählte min setzen
StdBy = true;
}
else
{
sleepAtMillis = 0; // Wenn Standbytimer nicht gesetzt ,Standbytimer deaktivieren
StdBy = false;
}
if (mySettings.standbyTimer == 1)
sleepAtMillis = millis() + (1000); // Wenn vom Schlummermodus auf 1 gesetzt, Standbytimer auf 1 sek setzen
//Serial.println(sleepAtMillis);
}
void disablestandbyTimer() // Standbytimer deaktivieren
{
Serial.println(F(""));
Serial.println(F("StdBy Timer OFF"));
sleepAtMillis = 0;
StdBy = false;
}
void checkStandbyAtMillis() // Standbytimer Ablauf prüfen
{
if (sleepAtMillis != 0 && millis() > sleepAtMillis) // Standbyzeit erreicht
ShutDown(); // Aufruf der ShutDown Funktion
}
//Ab hier wird ShutDown eine eigene Funktion
void ShutDown() // Ausschalten
{
Serial.println(F("Power OFF!"));
// enter sleep state
digitalWrite(UsbPowerPin, HIGH); // MosFet für USB-Port Aus
delay(500);
digitalWrite(ShutDownPin, LOW); // Ausschalten!, Low Pegel zum Rücksetzen des Einschalt-Flip-Flop
delay(500);
digitalWrite(ShutDownPin, HIGH); // Wiederholung falls Reset des FF nicht erflgreich
delay(500);
digitalWrite(ShutDownPin, LOW); // Ausschalten!, Low Pegel zum Rücksetzen des Einschalt-Flip-Flop
delay(500);
// http://discourse.voss.earth/t/intenso-s10000-powerbank-automatische-abschaltung-software-only/805
// powerdown to 27mA (powerbank switches off after 30-60s)
mfrc522.PCD_AntennaOff();
mfrc522.PCD_SoftPowerDown();
#ifdef LED_SR_Switch
lsrOffByStdby = true; // LED-Animation ausschalten
#endif
//mp3.sleep();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
cli(); // Disable interrupts
sleep_mode();
}
// Im Setup den pinMode für den Analogpin einstellen, der für die Batterieüberwachung genutzt werden soll
#ifdef BattControl
pinMode(VControlPin, INPUT ); // Eingang Batteriespannungskontrolle
#endif
// Im Setup vor dem manuellem Reset einfügen
// ********************* Batteriekontrolle ***Hardwareerweiterung erforderlich *****
#ifdef BattControl
VoltControl();
#endif
// Am Anfang der loop hinter do{ das einfügen
// ********************* Intervallmäßiges Prüfen der Batteriespannung *************************
#ifdef BattControl
// Diese Variablen sind weiter oben schon deklariert
// lastTest = 0; // Zeitpunkt letzte Prüfung
// TestIntervall = 30000; // Prüfintervall, hier 30 sekunden
Now = millis(); // auslesen akt Zeitpunkt
if (Now - lastTest >= TestIntervall)
{
lastTest = Now; // Speichern letzter Testzeitpunkt
VoltControl(); // Batterieprüfung
}
#endif
Die Schaltung für die Zusatzhardware liefere ich noch nach.