Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <WiFi.h> // Bibliothek für WLAN-Verbindungen
- #include <HTTPClient.h> // Bibliothek für HTTP-Anfragen
- #include <GxEPD2_BW.h> // Bibliothek für das E-Ink-Display (schwarz/weiß)
- #include <SPI.h> // SPI-Bibliothek für die Kommunikation mit dem Display
- #include <Wire.h> // I2C-Bibliothek (wird hier nicht verwendet, aber oft für Sensoren)
- #include "time.h" // Bibliothek für die Zeitverwaltung
- // WLAN-Zugangsdaten
- const char* ssid = "WLANNAME"; // SSID des WLAN-Netzwerks
- const char* password = "DeinWlanPasswort"; // Passwort des WLAN-Netzwerks (leer gelassen)
- // NTP-Zeitserver (Fritzbox als Zeitquelle)
- const char* ntpServer = "192.168.0.1"; // IP-Adresse des NTP-Servers (hier die Fritzbox)
- const long gmtOffset_sec = 3600; // Zeitzone für MEZ (Winterzeit) in Sekunden
- const long daylightOffset_sec = 3600; // Sommerzeit-Korrektur in Sekunden
- // E-Ink Display Pinbelegung
- #define EPD_BUSY 4 // Pin für den Busy-Status des Displays
- #define EPD_RST 16 // Pin für den Reset des Displays
- #define EPD_DC 17 // Pin für den Daten/Befehl-Modus des Displays
- #define EPD_CS 5 // Pin für den Chip-Select des Displays
- #define EPD_CLK 18 // Pin für den SPI-Takt
- #define EPD_DIN 23 // Pin für die SPI-Datenübertragung
- // Display initialisieren
- GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(
- GxEPD2_290_GDEY029T94(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY)); // Initialisierung des Displays mit den angegebenen Pins
- // URL der Solaranzeige
- const char* serverName = "https:/n7.eu/solar/text.php"; // URL, von der die Solardaten abgerufen werden
- // Sonnenzeiten
- int sunrise_hour, sunrise_minute; // Variablen für die Uhrzeit des Sonnenaufgangs
- int sunset_hour, sunset_minute; // Variablen für die Uhrzeit des Sonnenuntergangs
- bool isNightMode = false; // Flag, um den Nachtmodus zu aktivieren/deaktivieren
- void setup() {
- Serial.begin(115200); // Serielle Kommunikation starten (für Debugging)
- // Display initialisieren
- display.init(115200); // Display mit einer Baudrate von 115200 initialisieren
- display.setRotation(1); // Display um 90 Grad drehen
- display.setFullWindow(); // Vollbildmodus aktivieren
- // WLAN verbinden
- Serial.println("Verbinde mit WLAN...");
- WiFi.begin(ssid, password); // Verbindung zum WLAN herstellen
- while (WiFi.status() != WL_CONNECTED) { // Warten, bis die Verbindung hergestellt ist
- delay(500);
- Serial.print(".");
- }
- Serial.println("\nMit WLAN verbunden!"); // Bestätigung der WLAN-Verbindung
- // NTP-Zeit abrufen
- configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // NTP-Zeit konfigurieren
- struct tm timeinfo; // Struktur für die Zeitinformationen
- if (!getLocalTime(&timeinfo)) { // Lokale Zeit abrufen
- Serial.println("Fehler beim Abrufen der Zeit.");
- return;
- }
- // Sonnenaufgang/-untergang berechnen
- calculateSunTimes(timeinfo.tm_yday); // Sonnenaufgang und -untergang basierend auf dem Tag des Jahres berechnen
- // Erste Anzeige aktualisieren
- updateDisplay(); // Display mit den aktuellen Daten aktualisieren
- }
- void loop() {
- struct tm timeinfo; // Struktur für die Zeitinformationen
- if (!getLocalTime(&timeinfo)) { // Lokale Zeit abrufen
- Serial.println("Fehler beim Abrufen der Zeit.");
- return;
- }
- int currentHour = timeinfo.tm_hour; // Aktuelle Stunde
- int currentMinute = timeinfo.tm_min; // Aktuelle Minute
- // Nachtmodus prüfen
- if ((currentHour > sunset_hour || (currentHour == sunset_hour && currentMinute >= sunset_minute)) ||
- (currentHour < sunrise_hour || (currentHour == sunrise_hour && currentMinute < sunrise_minute))) {
- isNightMode = true; // Nachtmodus aktivieren
- Serial.println("Nachtmodus aktiviert. Gerät schläft.");
- showNightMode(); // Nachtmodus auf dem Display anzeigen
- // Gerät in den Deep Sleep versetzen bis zum Sonnenaufgang
- calculateSleepDurationUntilSunrise();
- esp_deep_sleep_start(); // Deep Sleep starten
- } else {
- isNightMode = false; // Nachtmodus deaktivieren
- //updateDisplay(); // Display aktualisieren -> passierte schon in Setup
- // Gerät für 2 Minuten in den Deep Sleep versetzen
- Serial.println("Gerät schläft für 2 Minuten.");
- esp_sleep_enable_timer_wakeup(120000000); // 2 Minuten in Mikrosekunden
- esp_deep_sleep_start(); // Deep Sleep starten
- }
- }
- void updateDisplay() {
- // WLAN aktivieren
- WiFi.begin(ssid, password); // WLAN-Verbindung herstellen
- while (WiFi.status() != WL_CONNECTED) { // Warten, bis die Verbindung hergestellt ist
- delay(500);
- }
- Serial.println("Wifi an"); // Bestätigung der WLAN-Verbindung
- // HTTP-Anfrage starten
- HTTPClient http; // HTTPClient-Objekt erstellen
- http.begin(serverName); // HTTP-Anfrage an die angegebene URL starten
- int httpCode = http.GET(); // HTTP-GET-Anfrage senden und Antwortcode speichern
- if (httpCode > 0) { // Wenn die Anfrage erfolgreich war
- String payload = http.getString(); // Antwortdaten als String speichern
- Serial.println("Daten empfangen:");
- Serial.println(payload); // Empfangene Daten im seriellen Monitor ausgeben
- // Anzeige aktualisieren
- display.firstPage(); // Erste Seite des Displays vorbereiten
- do {
- display.fillScreen(GxEPD_WHITE); // Display mit weißem Hintergrund füllen
- display.setCursor(20, 40); // Cursor an die Position (20, 50) setzen
- display.setTextColor(GxEPD_BLACK); // Textfarbe auf schwarz setzen
- display.setTextSize(7); // Textgröße auf 3 setzen
- display.print(payload); // Empfangene Daten auf dem Display anzeigen
- } while (display.nextPage()); // Nächste Seite des Displays vorbereiten, falls vorhanden
- } else {
- Serial.println("Fehler beim Abrufen der Daten."); // Fehlermeldung, wenn die Anfrage fehlschlägt
- }
- http.end(); // HTTP-Verbindung beenden
- // WLAN wieder abschalten
- WiFi.disconnect(true); // WLAN-Verbindung trennen
- WiFi.mode(WIFI_OFF); // WLAN-Modus ausschalten
- Serial.println("Wifi aus"); // Bestätigung, dass WLAN ausgeschaltet ist
- }
- void showNightMode() {
- // Nachtmodus auf dem Display anzeigen
- display.firstPage();
- do {
- display.fillScreen(GxEPD_WHITE); // Display mit weißem Hintergrund füllen
- display.setCursor(20, 40); // Cursor an die Position (20, 50) setzen
- display.setTextColor(GxEPD_BLACK); // Textfarbe auf schwarz setzen
- display.setTextSize(4); // Textgröße auf 3 setzen
- display.print("Nachtmodus\n"); // Text "Nachtmodus" auf dem Display anzeigen
- display.printf("bis %02d:%02d", sunrise_hour, sunrise_minute); // Endzeit des Nachtmodus anzeigen
- } while (display.nextPage());
- // Berechne die verbleibende Zeit bis zum Sonnenaufgang
- calculateSleepDurationUntilSunrise();
- }
- void calculateSleepDurationUntilSunrise() {
- struct tm timeinfo;
- if (!getLocalTime(&timeinfo)) { // Aktuelle Zeit abrufen
- Serial.println("Fehler beim Abrufen der Zeit.");
- return;
- }
- // Aktuelle Zeit in Minuten seit Mitternacht
- int currentMinutes = timeinfo.tm_hour * 60 + timeinfo.tm_min;
- // Sonnenaufgangszeit in Minuten seit Mitternacht
- int sunriseMinutes = sunrise_hour * 60 + sunrise_minute;
- // Berechne die Differenz in Minuten
- int sleepDurationMinutes;
- if (sunriseMinutes > currentMinutes) {
- // Sonnenaufgang ist heute
- sleepDurationMinutes = sunriseMinutes - currentMinutes;
- } else {
- // Sonnenaufgang ist morgen (über Mitternacht hinweg)
- sleepDurationMinutes = (24 * 60 - currentMinutes) + sunriseMinutes;
- }
- // Umrechnung der Schlafdauer in Mikrosekunden
- uint64_t sleepDurationMicroseconds = sleepDurationMinutes * 60 * 1000000ULL;
- // Timer für den Aufweckzeitpunkt setzen
- esp_sleep_enable_timer_wakeup(sleepDurationMicroseconds);
- Serial.printf("Gerät schläft für %d Minuten bis zum Sonnenaufgang.\n", sleepDurationMinutes);
- }
- // Sonnenaufgang/-untergang berechnen (Meeus-Methode vereinfacht)
- void calculateSunTimes(int dayOfYear) {
- float lat = 51.1167; // Wipperfürth Breite
- float lon = 7.4000; // Wipperfürth Länge
- float J = dayOfYear + 0.5 - lon / 360.0; // Julianischer Tag
- float M = (357.5291 + 0.98560028 * J); // Sonnenanomalie
- float C = 1.9148 * sin(M * PI / 180) + 0.02 * sin(2 * M * PI / 180);
- float L = (280.4665 + 0.98564736 * J + C); // Sonnenlänge
- float decl = asin(sin(L * PI / 180) * sin(23.44 * PI / 180)) * 180 / PI;
- float eqt = 229.18 * (0.000075 + 0.001868 * cos(M * PI / 180) - 0.032077 * sin(M * PI / 180));
- float noon = 12 + ((4 * lon - eqt) / 60);
- float H = acos((sin(-0.83 * PI / 180) - sin(lat * PI / 180) * sin(decl * PI / 180)) /
- (cos(lat * PI / 180) * cos(decl * PI / 180))) * 180 / PI / 15;
- float sunrise = noon - H;
- float sunset = noon + H;
- sunrise_hour = (int)sunrise;
- sunrise_minute = (int)((sunrise - sunrise_hour) * 60);
- sunset_hour = (int)sunset;
- sunset_minute = (int)((sunset - sunset_hour) * 60);
- Serial.printf("Sonnenaufgang: %02d:%02d\n", sunrise_hour, sunrise_minute);
- Serial.printf("Sonnenuntergang: %02d:%02d\n", sunset_hour, sunset_minute);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement