Hallo,
vlt. kennt sich jemand besser mit der RTClib bzw. dem DS3231 aus.
Ich würde gerne die Alarm Parameter Ds3231Alarm1Mode alarm_mode
wie z.B.: DS3231_A1_Second oder DS3231_A1_Minutes, in einer Variable oder etwas was ich im vorhinein definieren kann speichern.
Warum das ganze: um eine Variable am Beginn des Programmcodes zu haben, wo ich den Alarm Mode einstellen kann und nicht immer im Code rumsuchen muss, wo die richtige Zeile ist.
Hätte da jemand eine Idee?
Hab da was mit enum gelesen. bin aber nicht sicher ob das hilft.
Hier der Link zur Libary: https://github.com/adafruit/RTClib
Es geht genau gesagt um das hier in RTC_DS3231.cpp: https://github.com/adafruit/RTClib/blob/master/src/RTC_DS3231.cpp
Zeile:
bool RTC_DS3231::setAlarm1(const DateTime &dt, Ds3231Alarm1Mode alarm_mode)
Danke schon mal für die Hilfe und Antworten!
Noch einen schönen Abend!
Mfg
Hier noch ein Versuch der nicht funktioniert angehängt, da String alarm_param von rtc.setAlarm nicht genommen wird.
#include <RTClib.h>
// #include <Wire.h>
int timespan_day = 0;
int timespan_hour = 0;
int timespan_min = 0;
int timespan_sec = 10;
String alarm_param = "DS3231_A1_Second";
RTC_DS3231 rtc;
// the pin that is connected to SQW
#define CLOCK_INTERRUPT_PIN 33
const int sampleWindow = 1000; // Sample window width in mS (50 mS = 20Hz)
void setup() {
Serial.begin(9600);
delay(500);
pinMode(27, OUTPUT);
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); //1 = High, 0 = Low //Pin 33
//esp_sleep_enable_ext1_wakeup(0x400000000, ESP_EXT1_WAKEUP_ALL_LOW); //Pin 34
// initializing the rtc
if (!rtc.begin()) {
Serial.println("Couldn't find RTC!");
Serial.flush();
abort();
}
if (rtc.lostPower()) {
// this will adjust to the date and time at compilation
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
//we don't need the 32K Pin, so disable it
rtc.disable32K();
// Making it so, that the alarm will trigger an interrupt
pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
// set alarm 1, 2 flag to false (so alarm 1, 2 didn't happen so far)
// if not done, this easily leads to problems, as both register aren't reset on reboot/recompile
rtc.clearAlarm(1);
rtc.clearAlarm(2);
// stop oscillating signals at SQW Pin
// otherwise setAlarm1 will fail
rtc.writeSqwPinMode(DS3231_OFF);
// turn off alarm 2 (in case it isn't off already)
// again, this isn't done at reboot, so a previously set alarm could easily go overlooked
rtc.disableAlarm(2);
// schedule an alarm 10 seconds in the future
if (!rtc.setAlarm1(
rtc.now() + TimeSpan(timespan_day, timespan_hour, timespan_min, timespan_sec), alarm_param // this mode triggers the alarm when the seconds match. See Doxygen for other options
)) {
Serial.println("Error, alarm wasn't set!");
} else {
Serial.println("Alarm will happen in 10 seconds!");
}
}
void loop() {
unsigned long startMillis = millis(); // Start of sample window
while (millis() - startMillis < sampleWindow)
{
// print current time
char date[10] = "hh:mm:ss";
rtc.now().toString(date);
Serial.print(date);
// the value at SQW-Pin (because of pullup 1 means no alarm)
Serial.print(" SQW: ");
Serial.print(digitalRead(CLOCK_INTERRUPT_PIN));
// whether a alarm happened happened
Serial.print(" Alarm1: ");
Serial.print(rtc.alarmFired(1));
// Serial.print(" Alarm2: ");
// Serial.println(rtc.alarmFired(2));
// control register values (see https://datasheets.maximintegrated.com/en/ds/DS3231.pdf page 13)
// Serial.print(" Control: 0b");
// Serial.println(read_i2c_register(DS3231_ADDRESS, DS3231_CONTROL), BIN);
// resetting SQW and alarm 1 flag
// using setAlarm1, the next alarm could now be configurated
digitalWrite(27, HIGH);
}
if (rtc.alarmFired(1)) {
rtc.clearAlarm(1);
Serial.println("Alarm cleared");
}
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
void onAlarm() {
Serial.println("Alarm occured!");
}
/*static uint8_t read_i2c_register(uint8_t addr, uint8_t reg) {
Wire.beginTransmission(addr);
Wire.write((byte)reg);
Wire.endTransmission();
Wire.requestFrom(addr, (byte)1);
return Wire.read();
}*/