Zum Hauptinhalt springen

RTC-Alarm mit einem Interrupt

Was dieses Beispiel zeigt​

Stellen Sie die Uhrzeit und einen Alarm der integrierten Echtzeituhr (RTC) PCF85063A aus Epoch-Werten ein und lassen Sie die RTC den Alarm dann über ihren Interrupt-Pin melden. Der Sketch zeigt die Uhrzeit einmal pro Minute in Rot an und gibt ALARM aus, sobald seine Interrupt-Funktion ausgeführt wurde. Der Alarm wird 60 Sekunden nach der Startzeit gesetzt.

Der Sketch liest den RTC-Interrupt an ESP32-GPIO 2 und setzt diesen Pin daher als Eingang mit aktiviertem Pull-up-Widerstand.

Beispielcode​

Select Board
Inkplate7SPECTRA_RTC_Interrupt_Alarm.ino
#include "Inkplate.h" // Include Inkplate library to the sketch

Inkplate inkplate; // Create an object on Inkplate library and also set library into 1-bit mode (BW)

volatile int _alarmFlag = 0; // Variable to store alarm flag

void IRAM_ATTR alarmISR() // This function will be called when alarm interrupt event happens
{ // NOTE: Function must be above setup() and loop()!
_alarmFlag = 1; // Set alarm flag
}

void setup()
{
pinMode(2, INPUT_PULLUP); // Set RTC INT pin on ESP32 GPIO2 as input with pullup resistor enabled

inkplate.begin(); // Init Inkplate library (you should call this function ONLY ONCE)
inkplate.rtc.reset(); // reset RTC if there is some data in it
inkplate.clearDisplay(); // Clear frame buffer of display
inkplate.display(); // Put clear image on display
inkplate.setTextSize(3); // Set text to be 3 times bigger than classic 5x7 px text

// Set RTC time and date via Epoch
inkplate.rtc.setEpoch(1770032087);
// Set alarm using Epoch
inkplate.rtc.setAlarmEpoch(inkplate.rtc.getEpoch() + 60, RTC_ALARM_MATCH_DHHMMSS);

// inkplate.rtc.setTime(12, 40, 30); // Or you can use other way to set the time and date
// inkplate.rtc.setDate(1, 2, 2, 2026);
// inkplate.rtc.setAlarm(50, 40, 12, 2, 1); // Set alarm 20 seconds from now

attachInterrupt(2, alarmISR, FALLING); // Set interrupt function and interrupt mode
}

void loop()
{
inkplate.clearDisplay(); // Clear frame buffer of display
inkplate.setCursor(60, 100); // Set position of the text
inkplate.setTextColor(INKPLATE_RED, INKPLATE_WHITE); // Set text color and background
inkplate.rtc.getRtcData(); // Get the time and date from RTC

// Print the time on screen
printTime(inkplate.rtc.getHour(), inkplate.rtc.getMinute(), inkplate.rtc.getSecond(), inkplate.rtc.getDay(), inkplate.rtc.getWeekday(), inkplate.rtc.getMonth(), inkplate.rtc.getYear());

if (_alarmFlag) // Check alarm flag
{
// _alarmFlag = 0; // Uncomment if you want to clear this flag
inkplate.rtc.clearAlarmFlag(); // It's recommended to clear alarm flag after alarm has occurred
inkplate.setCursor(200, 200); // Set position of the text
inkplate.print("ALARM"); // Print text
}

inkplate.display(); // Do a full refresh

delay(60000); // Wait one minute
}

void printTime(uint8_t _hour, uint8_t _minutes, uint8_t _seconds, uint8_t _day, uint8_t _weekday, uint8_t _month,
uint16_t _year)
{
// Write time and date info on screen
char *wday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

print2Digits(_hour);
inkplate.print(':');
print2Digits(_minutes);
inkplate.print(':');
print2Digits(_seconds);

inkplate.print(' ');

inkplate.print(wday[_weekday]);
inkplate.print(", ");
print2Digits(_day);
inkplate.print('/');
print2Digits(_month);
inkplate.print('/');
inkplate.print(_year, DEC);
}

void print2Digits(uint8_t _d)
{
if (_d < 10)
inkplate.print('0');
inkplate.print(_d, DEC);
}

Der Sketch lässt die Zeile, die _alarmFlag löscht, auskommentiert. Sobald der Interrupt ausgeführt wurde, gibt jede weitere Aktualisierung ALARM aus, bis Sie das Board zurücksetzen oder diese Zeile einkommentieren.

Dieses Beispiel verwendet außerdem pinMode(), attachInterrupt() und delay(). Diese gehören zum Arduino-Core für den ESP32 und werden mit dem ESP32-Board-Paket (arduino-esp32) geliefert, nicht mit der Inkplate-Bibliothek.

Verwendete Funktionen​

Inkplate()returns None

Erstellt das Inkplate-Objekt. Inkplate 7SPECTRA hat nur einen einzigen Sechs-Farben-Modus, daher benötigt der Konstruktor kein Modus-Argument.

ReturnsKonstruktor; kein Rückgabewert.

inkplate.begin()returns void

Initialisiert die Bibliothek, die Peripherie und den Framebuffer. Rufen Sie sie einmal in setup() auf.

ReturnsNichts.

inkplate.rtc.reset()returns void

Schreibt den Standardwert in das erste Steuerregister der RTC und löscht damit Einstellungen, die von einem früheren Sketch übrig geblieben sind.

ReturnsNichts.

inkplate.clearDisplay()returns void

Füllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.

ReturnsNichts.

inkplate.display(bool _leaveOn = 0)returns void

Sendet den gesamten Framebuffer an das Panel und aktualisiert es.

ReturnsNichts.

inkplate.setTextSize(uint8_t s)returns void

Legt die Textvergrößerung fest, hier 3.

ReturnsNichts.

inkplate.rtc.setEpoch(uint32_t _epoch)returns void

Stellt Uhrzeit und Datum der RTC aus einem Epoch-Wert ein (Sekunden seit dem 1. Januar 1970), hier 1770032087.

ReturnsNichts.

inkplate.rtc.getEpoch()returns uint32_t

Liest die RTC und gibt Uhrzeit und Datum als Epoch-Wert zurück. Der Sketch addiert 60 dazu, um die Alarmzeit zu erhalten.

ReturnsDie RTC-Zeit als Epoch-Wert.

inkplate.rtc.setAlarmEpoch(uint32_t _epoch, uint8_t _match)returns void

Setzt den Alarm auf die als Epoch-Wert angegebene Zeit und aktiviert den Alarm-Interrupt. _match ist einer der RTC_ALARM_MATCH_*-Werte der Bibliothek; der Sketch übergibt RTC_ALARM_MATCH_DHHMMSS (Tag, Stunden, Minuten und Sekunden). Die anderen Werte sind RTC_ALARM_MATCH_SS, RTC_ALARM_MATCH_MMSS, RTC_ALARM_MATCH_HHMMSS und RTC_ALARM_MATCH_WHHMMSS.

ReturnsNichts.

inkplate.setCursor(int16_t x, int16_t y)returns void

Legt fest, wo der nächste ausgegebene Text beginnt.

ReturnsNichts.

inkplate.setTextColor(uint16_t c, uint16_t bg)returns void

Legt die Textfarbe und die hinter jedem Zeichen gezeichnete Hintergrundfarbe fest, hier Rot auf Weiß.

ReturnsNichts.

inkplate.rtc.getRtcData()returns void

Liest Uhrzeit und Datum aus der RTC; die folgenden get-Funktionen geben die gelesenen Werte zurück.

ReturnsNichts.

inkplate.rtc.getHour()returns uint8_t

Gibt die Stunden zurück.

ReturnsStunden.

inkplate.rtc.getMinute()returns uint8_t

Gibt die Minuten zurück.

ReturnsMinuten.

inkplate.rtc.getSecond()returns uint8_t

Gibt die Sekunden zurück.

ReturnsSekunden.

inkplate.rtc.getDay()returns uint8_t

Gibt den Tag des Monats zurück.

ReturnsTag des Monats.

inkplate.rtc.getWeekday()returns uint8_t

Gibt den Wochentag zurück, 0 (Sonntag) bis 6.

ReturnsWochentag.

inkplate.rtc.getMonth()returns uint8_t

Gibt den Monat zurück.

ReturnsMonat, 1 bis 12.

inkplate.rtc.getYear()returns uint16_t

Gibt das Jahr zurück: den in der RTC gespeicherten Wert plus 2000.

ReturnsVollständiges Jahr.

inkplate.rtc.clearAlarmFlag()returns void

Löscht das Alarm-Flag in der RTC, damit der nächste Alarm erkannt werden kann.

ReturnsNichts.

inkplate.print(value, format)returns size_t

Gibt Text, ein Zeichen oder eine Zahl in den Framebuffer aus, wie Serial.print(). DEC gibt eine Zahl dezimal aus.

ReturnsAnzahl der ausgegebenen Bytes.

pinMode(uint8_t pin, uint8_t mode)returns void

Legt den Modus eines GPIO-Pins fest. Der Sketch setzt GPIO 2, den RTC-Interrupt-Pin, auf INPUT_PULLUP.

ReturnsNichts.

attachInterrupt(uint8_t pin, void (*function)(void), int mode)returns void

Führt eine Funktion aus, wenn sich der Pegel am Pin ändert. Der Sketch führt alarmISR() aus, wenn GPIO 2 fällt (FALLING); dadurch wird _alarmFlag gesetzt.

ReturnsNichts.

delay(unsigned long ms)returns void

Wartet die angegebene Anzahl Millisekunden, hier 60000 (eine Minute).

ReturnsNichts.

Was Sie erwarten können​

Der Bildschirm zeigt Uhrzeit und Datum in Rot in der Form HH:MM:SS Weekday, DD/MM/ gefolgt vom Jahr. Etwa eine Minute später wird der Bildschirm mit der aktuellen Uhrzeit aktualisiert, und sobald der Alarm-Interrupt ausgelöst wurde, erscheint darunter ALARM. Der Sketch gibt nichts im Serial Monitor aus.

🔗Vollständiges Beispiel öffnen

examples/Inkplate7SPECTRA/Advanced/RTC/Inkplate7SPECTRA_RTC_Interrupt_Alarm

→