Hallo,
ich möchte meinen ESP32 wroom mit einem RTC DS3231 aus einen deep sleep
nach 17 Stunden wieder aufwecken (SQW ist auf GPIO 4).
Da der ESP32 später mit einer Batterie betrieben wird, ist Deep sleep echt wichtig ![]()
Pinbelegung:
DS3231 -> ESP32
GND -> GND
VCC -> 3.3v
SDA -> GPIO 21
SQW -> GPIO 4
32K (nicht angeschlossen)
Wenn der Deep Sleep funktioniert, wird der Sketch noch erweitert, um einen Optokoppler (ist mit einem Widerstand an GND und GPIO 15 angeschlossen) zu schalten.
Habe im Vorfeld schon mehrere Sketche getestet, um etwas dazu zu lernen und aus Spaß
: Zeige mir die Datum in Serialmonitor alle x sec. Aufwachen mit touch…. Alles ohne Probleme.
Ich hatte ein Sketch getestet, die bei einem bestimmten Datum und Uhrzeit wecken sollten.. die hatten aber immer wieder Fehlalarme zwischendurch. Habe nicht verstanden wo die Fehlalarme herkommen sind, aber ich wollte ja auch kein bestimmtes Datum oder Wochentag, sondern “nur” 17 Stunden Schlaf und aufwachen… mach deinen Job und schlaf wieder.
Ich habe zum testen den Alarm auf 2 min reduziert, bevor ich auf 17 Stunden gehe. Aber er wird nicht aufgeweckt. Die Batterie vom DS3221 ist getestet und OK.
Hier mal der momentane Sketch:
#include <Wire.h>
#include <RTClib.h>
#include <esp_sleep.h>
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200);
if (!rtc.begin()) {
Serial.println("Konnte RTC nicht finden!");
while (1);
}
// Überprüfe, ob die RTC die aktuelle Zeit hat, andernfalls setze sie auf die Systemzeit
if (!rtc.lostPower()) {
DateTime now = rtc.now();
Serial.println(now.timestamp(DateTime::TIMESTAMP_FULL));
Serial.println("RTC hat die Zeit verloren! Setze die Zeit auf die Systemzeit.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
/*
DateTime now = rtc.now();
DateTime alarmTime = now + TimeSpan(17, 0, 0, 0); // SOLL -17 Stunden in der Zukunft
rtc.setAlarm1(alarmTime, DS3231_A1_Hour); // Alarm im Stundentakt
*/
// 2Min zum testen
DateTime now = rtc.now();
DateTime alarmTime = now + TimeSpan(0, 0, 2, 0); // zum testen nur 2 Minuten in der Zukunft
rtc.setAlarm1(alarmTime, DS3231_A1_Minute); // Alarm im min.takt
// Aktiviere den Alarm und konfiguriere den SQW-Ausgang als Weck-Pin (GPIO 4)
rtc.disableAlarm(1);
rtc.clearAlarm(1);
rtc.writeSqwPinMode(DS3231_OFF);
// Deep Sleep konfigurieren
esp_sleep_enable_ext0_wakeup(GPIO_NUM_4, 0); // Weck-Pin: GPIO 4, low aktiviert den Weckvorgang
}
void loop() {
Serial.println("Gehe in den Deep Sleep-Modus...");
esp_deep_sleep_start();
}
Ausgabe SerialMonitor:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
E (97) psram: PSRAM ID read error: 0xffffffff
2024-02-04T10:00:32
RTC hat die Zeit verloren! Setze die Zeit auf die Systemzeit.
Gehe in den Deep Sleep-Modus...
Hoffe Ihr könnt mir helfen.
