Programmierung
Zur Programmierung des ESP32 kann der folgende Programmcode verwendet werden.
//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 Pixeln
// 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
// 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)
}
Last modified: Friday, 22 July 2022, 10:52 AM