Für die Erweiterung mit der externen Spannungsversorgung kann der folgende Programmcode verwendet werden.  
Das Relais schaltet sich, wenn die Spannung kleiner als 3,6 V ist. Somit wird die externe 5V Spannungsversorgung durchgeschaltet und der ESP32 wird nicht mehr über den Akku betrieben.


//Einbinden der Bibliotheken
#include <Wire.h>             // Bibliothek für I2C Kommunikation
#include <Adafruit_INA219.h>  // Bibliothek vom Stromsensor INA219
#include <SPI.h>
#include <Adafruit_GFX.h>     // Biblithek für Graphik Funktionen des OLED Displays
#include <Adafruit_SSD1306.h> // Biblithek für OLED Display



Adafruit_INA219 ina219;
#define SCREEN_WIDTH 128      // OLED Display Breite, in Pixeln
#define SCREEN_HEIGHT 64      // OLED Display Höhe, in PixelnS

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1     // Reset pin
#define SCREEN_ADDRESS 0x3C   // Adresse des OLED Displays

#define pinRelais 13          // Definition des Pin GPIO 13  als als Pin für die Steuerung des Relais


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);    // Initalisierung des OLED Displays

// Deklaration Variablen
float current_mA = 0;       //Strom (vom Stromsensor gemessen)
float power_mW = 0;         //Leistung (vom Stromsensor gemessen)
float voltage = 0;          //Batteriespannung
//int   TIME_TO_SLEEP = 30;   //Deep Sleep Zeit in Sekunden


void setup(void)
{
  Serial.begin(115200);                                  // Starten des seriellen Monitors
  uint32_t currentFrequency;
  ina219.begin();                                        // Starten des Sensors INA219
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);   // Starten des Displays
  display.setTextSize(2);                                // Schriftgröße auf 2
  display.setTextColor(WHITE);                           // Schriftfarbe auf weiß
  pinMode(pinRelais , OUTPUT);                           // pin Relais auf 

}


void displayAnzeige()
{
  voltage = (float)analogRead(34)/4096 * 3.3 * 126000 / 99500;  // Spannungsmessunng über den Spannungsteiler

  // Anzeige der Akkuspannung und des Akkusymbols
  display.clearDisplay();                                       // vorhandener Text wird gelöscht
  display.setCursor(0,0);                                       // Cursor auf oben links
  display.setTextSize(1);                                       // Textgröße auf 1
  display.print("Spannung: ");                                  // schreibt den auf's Display
  display.setCursor(0,10);                                      // setzt den Cursor eine Zeile tiefer
  display.setTextSize(2);                                       // Textgröße auf 2
  display.print(voltage);                                       // Ausgabe der Spannung
  display.print(" V");
  display.drawRect(10,30,80,30,SSD1306_WHITE);                 // zeichnet Rechteck für Darstellung des Akkuymbols
  display.drawRect(90,37,10,15,SSD1306_WHITE);                 // zeichnet weiteres Rechteck für das Akkusymbol

  if(voltage>4.0) // wenn Akkuspannung über 4 Volt ist wird ein voller Akku angezeigt (vier Balken)
  { 
    display.fillRect(70,32,18,26,SSD1306_WHITE);
  }

  if(voltage>3.85) // wenn Akkuspannung über 3,85 V ist werden 3 Balken angezeigt
  {
    display.fillRect(50,32,19,26,SSD1306_WHITE);
  }

  if(voltage>3.75) // wenn Akkuspannung über 3,75 V ist werden 2 Balken angezeigt
  {
    display.fillRect(30,32,19,26,SSD1306_WHITE);
  }

  if(voltage>3.65) // wenn Akkuspannung über 3,65 V ist wird 1 Balken angezeigt
  {
    display.fillRect(12,32,17,26,SSD1306_WHITE);
  }

  display.display();
  delay(5000);              //  5 Sekunde Display an
  display.clearDisplay();

  // gemessene Werte des INA219 werdern in den Variablen gespeichert 
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
 
  //Anzeige des Stroms und der Leistung vom Solarmodul
  display.setCursor(0,0);
  display.setTextSize(1);
  display.print("Strom: ");
  display.setCursor(0,10);
  display.setTextSize(2);
  display.print(current_mA);
  display.print(" mA");
  display.setTextSize(1);
  display.setCursor(0,30);
  display.print("Leistung: ");
  display.setTextSize(2);
  display.setCursor(0,40);
  display.print(power_mW);
  display.print(" mW"); 
  display.display();
  delay(5000);              //  5 Sekunde Display an


  // Ein- / Ausschalten des Relais:
  if (voltage < 3.6)
  {   
      digitalWrite(pinRelais , HIGH);    // Notstrom aktiv 
  }
  else
  {
      digitalWrite(pinRelais , LOW);     // Versorgung über Akku
  }

  // Display ausschalten:
  display.clearDisplay();
  display.display();
  delay(20000);             //  20 Sekunde Display aus

  //Deep-Sleep als alternative Variante für Display ausschalten, dort ist allerdings die Ansteuerung des Relais nicht möglich
  //esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * 1000000);  // Zeit bis ESP32 wieder aufwacht ( *1000000 für Umrechnung in Sekunden)
  //esp_deep_sleep_start();                                  //Deep Sleep wird gestartet
 
}

void loop(void) 
{
  displayAnzeige();     // Aufruf der Funktion  (Dauerschleife)
}
Zuletzt geändert: Freitag, 22. Juli 2022, 10:53