Advertisement
Halbheld

e-ink for solar panels, sleeping at night

Feb 1st, 2025
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 9.16 KB | Housing | 0 0
  1. #include <WiFi.h>          // Bibliothek für WLAN-Verbindungen
  2. #include <HTTPClient.h>    // Bibliothek für HTTP-Anfragen
  3. #include <GxEPD2_BW.h>     // Bibliothek für das E-Ink-Display (schwarz/weiß)
  4. #include <SPI.h>           // SPI-Bibliothek für die Kommunikation mit dem Display
  5. #include <Wire.h>          // I2C-Bibliothek (wird hier nicht verwendet, aber oft für Sensoren)
  6. #include "time.h"          // Bibliothek für die Zeitverwaltung
  7.  
  8. // WLAN-Zugangsdaten
  9. const char* ssid = "WLANNAME";            // SSID des WLAN-Netzwerks
  10. const char* password = "DeinWlanPasswort";     // Passwort des WLAN-Netzwerks (leer gelassen)
  11.  
  12. // NTP-Zeitserver (Fritzbox als Zeitquelle)
  13. const char* ntpServer = "192.168.0.1";  // IP-Adresse des NTP-Servers (hier die Fritzbox)
  14. const long gmtOffset_sec = 3600;        // Zeitzone für MEZ (Winterzeit) in Sekunden
  15. const long daylightOffset_sec = 3600;   // Sommerzeit-Korrektur in Sekunden
  16.  
  17. // E-Ink Display Pinbelegung
  18. #define EPD_BUSY 4   // Pin für den Busy-Status des Displays
  19. #define EPD_RST 16   // Pin für den Reset des Displays
  20. #define EPD_DC 17    // Pin für den Daten/Befehl-Modus des Displays
  21. #define EPD_CS 5     // Pin für den Chip-Select des Displays
  22. #define EPD_CLK 18   // Pin für den SPI-Takt
  23. #define EPD_DIN 23   // Pin für die SPI-Datenübertragung
  24.  
  25. // Display initialisieren
  26. GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(
  27.   GxEPD2_290_GDEY029T94(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));  // Initialisierung des Displays mit den angegebenen Pins
  28.  
  29. // URL der Solaranzeige
  30. const char* serverName = "https:/n7.eu/solar/text.php";  // URL, von der die Solardaten abgerufen werden
  31.  
  32. // Sonnenzeiten
  33. int sunrise_hour, sunrise_minute;  // Variablen für die Uhrzeit des Sonnenaufgangs
  34. int sunset_hour, sunset_minute;    // Variablen für die Uhrzeit des Sonnenuntergangs
  35. bool isNightMode = false;          // Flag, um den Nachtmodus zu aktivieren/deaktivieren
  36.  
  37. void setup() {
  38.   Serial.begin(115200);  // Serielle Kommunikation starten (für Debugging)
  39.  
  40.   // Display initialisieren
  41.   display.init(115200);  // Display mit einer Baudrate von 115200 initialisieren
  42.   display.setRotation(1);  // Display um 90 Grad drehen
  43.   display.setFullWindow();  // Vollbildmodus aktivieren
  44.  
  45.   // WLAN verbinden
  46.   Serial.println("Verbinde mit WLAN...");
  47.   WiFi.begin(ssid, password);  // Verbindung zum WLAN herstellen
  48.   while (WiFi.status() != WL_CONNECTED) {  // Warten, bis die Verbindung hergestellt ist
  49.     delay(500);
  50.     Serial.print(".");
  51.   }
  52.   Serial.println("\nMit WLAN verbunden!");  // Bestätigung der WLAN-Verbindung
  53.  
  54.   // NTP-Zeit abrufen
  55.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);  // NTP-Zeit konfigurieren
  56.   struct tm timeinfo;  // Struktur für die Zeitinformationen
  57.   if (!getLocalTime(&timeinfo)) {  // Lokale Zeit abrufen
  58.     Serial.println("Fehler beim Abrufen der Zeit.");
  59.     return;
  60.   }
  61.  
  62.   // Sonnenaufgang/-untergang berechnen
  63.   calculateSunTimes(timeinfo.tm_yday);  // Sonnenaufgang und -untergang basierend auf dem Tag des Jahres berechnen
  64.  
  65.   // Erste Anzeige aktualisieren
  66.   updateDisplay();  // Display mit den aktuellen Daten aktualisieren
  67. }
  68.  
  69. void loop() {
  70.   struct tm timeinfo;  // Struktur für die Zeitinformationen
  71.   if (!getLocalTime(&timeinfo)) {  // Lokale Zeit abrufen
  72.     Serial.println("Fehler beim Abrufen der Zeit.");
  73.     return;
  74.   }
  75.  
  76.   int currentHour = timeinfo.tm_hour;  // Aktuelle Stunde
  77.   int currentMinute = timeinfo.tm_min;  // Aktuelle Minute
  78.  
  79.   // Nachtmodus prüfen
  80.   if ((currentHour > sunset_hour || (currentHour == sunset_hour && currentMinute >= sunset_minute)) ||
  81.       (currentHour < sunrise_hour || (currentHour == sunrise_hour && currentMinute < sunrise_minute))) {
  82.    
  83.     isNightMode = true;  // Nachtmodus aktivieren
  84.     Serial.println("Nachtmodus aktiviert. Gerät schläft.");
  85.     showNightMode();  // Nachtmodus auf dem Display anzeigen
  86.  
  87.     // Gerät in den Deep Sleep versetzen bis zum Sonnenaufgang
  88.     calculateSleepDurationUntilSunrise();
  89.     esp_deep_sleep_start();  // Deep Sleep starten
  90.   } else {
  91.     isNightMode = false;  // Nachtmodus deaktivieren
  92.     //updateDisplay();  // Display aktualisieren -> passierte schon in Setup
  93.  
  94.     // Gerät für 2 Minuten in den Deep Sleep versetzen
  95.     Serial.println("Gerät schläft für 2 Minuten.");
  96.     esp_sleep_enable_timer_wakeup(120000000);  // 2 Minuten in Mikrosekunden
  97.     esp_deep_sleep_start();  // Deep Sleep starten
  98.   }
  99. }
  100.  
  101. void updateDisplay() {
  102.   // WLAN aktivieren
  103.   WiFi.begin(ssid, password);  // WLAN-Verbindung herstellen
  104.   while (WiFi.status() != WL_CONNECTED) {  // Warten, bis die Verbindung hergestellt ist
  105.     delay(500);
  106.   }
  107.   Serial.println("Wifi an");  // Bestätigung der WLAN-Verbindung
  108.  
  109.   // HTTP-Anfrage starten
  110.   HTTPClient http;  // HTTPClient-Objekt erstellen
  111.   http.begin(serverName);  // HTTP-Anfrage an die angegebene URL starten
  112.   int httpCode = http.GET();  // HTTP-GET-Anfrage senden und Antwortcode speichern
  113.  
  114.   if (httpCode > 0) {  // Wenn die Anfrage erfolgreich war
  115.     String payload = http.getString();  // Antwortdaten als String speichern
  116.     Serial.println("Daten empfangen:");
  117.     Serial.println(payload);  // Empfangene Daten im seriellen Monitor ausgeben
  118.  
  119.     // Anzeige aktualisieren
  120.     display.firstPage();  // Erste Seite des Displays vorbereiten
  121.     do {
  122.       display.fillScreen(GxEPD_WHITE);  // Display mit weißem Hintergrund füllen
  123.       display.setCursor(20, 40);  // Cursor an die Position (20, 50) setzen
  124.       display.setTextColor(GxEPD_BLACK);  // Textfarbe auf schwarz setzen
  125.       display.setTextSize(7);  // Textgröße auf 3 setzen
  126.       display.print(payload);  // Empfangene Daten auf dem Display anzeigen
  127.     } while (display.nextPage());  // Nächste Seite des Displays vorbereiten, falls vorhanden
  128.   } else {
  129.     Serial.println("Fehler beim Abrufen der Daten.");  // Fehlermeldung, wenn die Anfrage fehlschlägt
  130.   }
  131.  
  132.   http.end();  // HTTP-Verbindung beenden
  133.  
  134.   // WLAN wieder abschalten
  135.   WiFi.disconnect(true);  // WLAN-Verbindung trennen
  136.   WiFi.mode(WIFI_OFF);  // WLAN-Modus ausschalten
  137.   Serial.println("Wifi aus");  // Bestätigung, dass WLAN ausgeschaltet ist
  138. }
  139.  
  140. void showNightMode() {
  141.   // Nachtmodus auf dem Display anzeigen
  142.   display.firstPage();
  143.   do {
  144.     display.fillScreen(GxEPD_WHITE);  // Display mit weißem Hintergrund füllen
  145.     display.setCursor(20, 40);  // Cursor an die Position (20, 50) setzen
  146.     display.setTextColor(GxEPD_BLACK);  // Textfarbe auf schwarz setzen
  147.     display.setTextSize(4);  // Textgröße auf 3 setzen
  148.     display.print("Nachtmodus\n");  // Text "Nachtmodus" auf dem Display anzeigen
  149.     display.printf("bis %02d:%02d", sunrise_hour, sunrise_minute);  // Endzeit des Nachtmodus anzeigen
  150.   } while (display.nextPage());
  151.  
  152.   // Berechne die verbleibende Zeit bis zum Sonnenaufgang
  153.   calculateSleepDurationUntilSunrise();
  154. }
  155.  
  156. void calculateSleepDurationUntilSunrise() {
  157.   struct tm timeinfo;
  158.   if (!getLocalTime(&timeinfo)) {  // Aktuelle Zeit abrufen
  159.     Serial.println("Fehler beim Abrufen der Zeit.");
  160.     return;
  161.   }
  162.  
  163.   // Aktuelle Zeit in Minuten seit Mitternacht
  164.   int currentMinutes = timeinfo.tm_hour * 60 + timeinfo.tm_min;
  165.   // Sonnenaufgangszeit in Minuten seit Mitternacht
  166.   int sunriseMinutes = sunrise_hour * 60 + sunrise_minute;
  167.  
  168.   // Berechne die Differenz in Minuten
  169.   int sleepDurationMinutes;
  170.   if (sunriseMinutes > currentMinutes) {
  171.     // Sonnenaufgang ist heute
  172.     sleepDurationMinutes = sunriseMinutes - currentMinutes;
  173.   } else {
  174.     // Sonnenaufgang ist morgen (über Mitternacht hinweg)
  175.     sleepDurationMinutes = (24 * 60 - currentMinutes) + sunriseMinutes;
  176.   }
  177.  
  178.   // Umrechnung der Schlafdauer in Mikrosekunden
  179.   uint64_t sleepDurationMicroseconds = sleepDurationMinutes * 60 * 1000000ULL;
  180.  
  181.   // Timer für den Aufweckzeitpunkt setzen
  182.   esp_sleep_enable_timer_wakeup(sleepDurationMicroseconds);
  183.   Serial.printf("Gerät schläft für %d Minuten bis zum Sonnenaufgang.\n", sleepDurationMinutes);
  184. }
  185.  
  186. // Sonnenaufgang/-untergang berechnen (Meeus-Methode vereinfacht)
  187. void calculateSunTimes(int dayOfYear) {
  188.   float lat = 51.1167;  // Wipperfürth Breite
  189.   float lon = 7.4000;   // Wipperfürth Länge
  190.  
  191.   float J = dayOfYear + 0.5 - lon / 360.0;  // Julianischer Tag
  192.   float M = (357.5291 + 0.98560028 * J);  // Sonnenanomalie
  193.   float C = 1.9148 * sin(M * PI / 180) + 0.02 * sin(2 * M * PI / 180);
  194.   float L = (280.4665 + 0.98564736 * J + C);  // Sonnenlänge
  195.   float decl = asin(sin(L * PI / 180) * sin(23.44 * PI / 180)) * 180 / PI;
  196.  
  197.   float eqt = 229.18 * (0.000075 + 0.001868 * cos(M * PI / 180) - 0.032077 * sin(M * PI / 180));
  198.  
  199.   float noon = 12 + ((4 * lon - eqt) / 60);
  200.   float H = acos((sin(-0.83 * PI / 180) - sin(lat * PI / 180) * sin(decl * PI / 180)) /
  201.                  (cos(lat * PI / 180) * cos(decl * PI / 180))) * 180 / PI / 15;
  202.  
  203.   float sunrise = noon - H;
  204.   float sunset = noon + H;
  205.  
  206.   sunrise_hour = (int)sunrise;
  207.   sunrise_minute = (int)((sunrise - sunrise_hour) * 60);
  208.   sunset_hour = (int)sunset;
  209.   sunset_minute = (int)((sunset - sunset_hour) * 60);
  210.  
  211.   Serial.printf("Sonnenaufgang: %02d:%02d\n", sunrise_hour, sunrise_minute);
  212.   Serial.printf("Sonnenuntergang: %02d:%02d\n", sunset_hour, sunset_minute);
  213. }
Tags: solar e-ink
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement