Hi zusammen,
mit dem ESP32 hab ich das mit dem DeepSleep und Aufwecken jetzt ganz gut raus.
Aber nun wollte ich gestern was Vergleichbares mit einem Arduino Uno (ATMEGA 328P, ATMEGA16U2 Board) machen und stoße auf ein paar Problemchen:
Nr.1: Beim ESP wird doch nach dem Aufwecken die void setup() durchlaufen... beim Arduino (Uno) scheint er direkt im Loop wieder weiterzumachen, korrekt? Oder gibt es auch einen DeepSleep-Mode, der nach dem Aufwecken nochmal die Setup durchläuft? Fand ich eigentlich aus diversen Gründen ganz praktisch.
Nr.2: Ich will unterscheiden, ob er WakeUp per Taste ausgelöst wurde oder per RTC-Alarm.
Wenn ich den unten aufgeführten Code (meinen ersten Versuch sozusagen) ausführe, bekomme ich nach dem Aufwecken per Taster mehrmals die Ausgabe "Aufgeweckt durch Taster" (warum mehrfach - ich vermute wegen des Prellens durch den Taster?) und danach geht er wieder in den DeepSleep wie erwartet.
Wenn der Arduino vom RTC Alarm geweckt wird, bekomme ich in einer Dauersalve "Aufgeweckt durch Alarm", ich vermute, weil das RTC-Modul hier am SQW-Pin dauerfeuert? Einschlafen tut mir der Arduino dann gar nicht mehr.
Lange Rede, kurzer Sinn: Wie schaff ich es, dass jeweils nur einmal eine Meldung kommt und er auch nach dem RTC-Alarm wieder einschläft?
Hier mein Code:
#include <RTClib.h>
#include "LowPower.h"
// Aufwachpin für Taster
#define WAKEUP_PIN 2
// Aufwachpin für RTC-Clock
#define CLOCK_INTERRUPT_PIN 3
unsigned long awake_timer = 10000, lastchange = 0;
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
delay(1000);
Serial.println("Aufgewacht!"); // Wird nur beim ersten Start angezeigt, nicht mehr nach dem Aufwachen...also anders als beim ESP32
lastchange = millis();
pinMode(LED_BUILTIN, OUTPUT);
pinMode(WAKEUP_PIN, INPUT_PULLUP);
pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
// initializing the rtc
if(!rtc.begin()) {
Serial.println("RTC-Modul nicht gefunden!");
Serial.flush();
while (1) delay(10);
}
if(rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.disable32K();
rtc.clearAlarm(1);
rtc.clearAlarm(2);
rtc.writeSqwPinMode(DS3231_OFF);
rtc.disableAlarm(2);
}
void loop() {
// LED kurz blinken lassen als Rückmeldung, dass der Loop durchlaufen wird nach dem Aufwachen
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
if (millis() - lastchange > awake_timer) {
// Neuen Alarm setzen....
rtc.setAlarm1(rtc.now() + TimeSpan(20),DS3231_A1_Second);
attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), onButton, LOW);
attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, LOW);
Serial.println("Einschlafen!");
delay(1000);
lastchange = millis();
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
Serial.println("Dieser Text wäre nach esp_deep_sleep_start() nicht lesbar, warum hier?");
}
}
void onButton() {
// detachInterrupt(WAKEUP_PIN);
lastchange = millis();
Serial.println("Aufgewacht durch Taster");
}
void onAlarm() {
//detachInterrupt(CLOCK_INTERRUPT_PIN);
lastchange = millis();
Serial.println("Aufgewacht durch Alarm");
}
Danke für eure "Entwicklungshilfe" ![]()
LG