Spannungsüberwachung des Akkus über den Arduino

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.

2 Like