Zum Hauptinhalt springen

RTC-Timer

Was dieses Beispiel zeigt​

Das Beispiel stellt die Uhrzeit und einen 30-Sekunden-Countdown-Timer auf der integrierten Echtzeituhr (RTC) PCF85063A ein, zeigt die Uhrzeit einmal pro Minute auf dem Bildschirm an und gibt Timer! in Rot aus, sobald der Timer abgelaufen ist. Der Timer wird nur einmal verwendet: Der Sketch schaltet ihn ab, nachdem er ausgelöst hat.

Der Sketch setzt ESP32 GPIO 2, den Interrupt-Pin der RTC, als Eingang mit aktiviertem Pull-up-Widerstand.

Beispielcode​

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

Inkplate inkplate; // Create an object on Inkplate library

// Set clock
uint8_t hour = 12;
uint8_t minutes = 50;
uint8_t seconds = 30;

// Set date and weekday (NOTE: In weekdays 0 means Sunday, 1 means Monday, ...)
uint8_t weekday = 1;
uint8_t day = 20;
uint8_t month = 7;
uint8_t year = 26;

// Set up a 30 seconds timer
int countdown_time = 30;

void setup()
{
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(4); // Set text to be 4 times bigger than classic 5x7 px text

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

inkplate.rtc.setTime(hour, minutes, seconds); // Send time to RTC
inkplate.rtc.setDate(weekday, day, month, year); // Send date to RTC

// Set up a timer
/* source_clock
* RTC::TIMER_CLOCK_4096HZ -> clk = 4096Hz -> min timer = 244uS -> MAX timer = 62.256mS
* RTC::TIMER_CLOCK_64HZ -> clk = 64Hz -> min timer = 15.625mS -> MAX timer = 3.984s
* RTC::TIMER_CLOCK_1HZ -> clk = 1Hz -> min timer = 1s -> MAX timer = 255s
* RTC::TIMER_CLOCK_1PER60HZ -> clk = 1/60Hz -> min timer = 60s -> MAX timer = 4h15min
* value
* coundowntime in seconds
* int_enable
* true = enable interrupt; false = disable interrupt
* int_pulse
* true = interrupt generate a pulse; false = interrupt follows timer flag
*/
inkplate.rtc.timerSet(RTC::TIMER_CLOCK_1HZ, countdown_time, true, false);
}

void loop()
{
inkplate.rtc.getRtcData(); // Get the time and date from RTC
seconds = inkplate.rtc.getSecond(); // Store senconds in a variable
minutes = inkplate.rtc.getMinute(); // Store minutes in a variable
hour = inkplate.rtc.getHour(); // Store hours in a variable
day = inkplate.rtc.getDay(); // Store day of month in a variable
weekday = inkplate.rtc.getWeekday(); // Store day of week in a variable
month = inkplate.rtc.getMonth(); // Store month in a variable
year = inkplate.rtc.getYear(); // Store year in a variable

inkplate.clearDisplay(); // Clear content in frame buffer
inkplate.setCursor(60, 300); // Set position of the text
inkplate.setTextColor(INKPLATE_BLACK, INKPLATE_WHITE); // Set text color and background
printTime(hour, minutes, seconds, day, weekday, month, year); // Print the time on screen

if (inkplate.rtc.checkTimerFlag()) // Check if timer event has occurred
{
inkplate.rtc.clearTimerFlag(); // It's recommended to clear timer flag after timer has occurred
inkplate.rtc.disableTimer(); // Disable timer if you want to make it one time only. Is you want to be repeatable, comment this line
inkplate.setCursor(400, 400); // Set new position for cursor
inkplate.setTextColor(INKPLATE_RED, INKPLATE_WHITE); // Set text color and background
inkplate.print("Timer!");
}

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

delay(60000); // Delay between refreshes.
}

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 speichert das Jahr als 26, aber rtc.setDate() erwartet das vollständige Jahr und zieht davon 2000 ab, und rtc.getYear() gibt das vollständige Jahr zurück. Das Jahr auf dem Bildschirm zeigt daher nicht 2026 an. Um das richtige Jahr zu erhalten, übergeben Sie das vollständige Jahr (zum Beispiel 2026) in einer uint16_t-Variablen an setDate().

Dieses Beispiel verwendet außerdem pinMode() 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 erwartet 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 so 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 4.

ReturnsNichts.

inkplate.rtc.setTime(uint8_t hour, uint8_t minute, uint8_t sec, bool isPM = false)returns void

Schreibt die Uhrzeit in die RTC. isPM wird nur im 12-Stunden-Modus verwendet.

ReturnsNichts.

inkplate.rtc.setDate(uint8_t weekday, uint8_t day, uint8_t month, uint16_t yr)returns void

Schreibt das Datum in die RTC und markiert es als gesetzt. Wochentag 0 ist Sonntag. yr ist das vollständige Jahr; die Funktion zieht 2000 ab, bevor sie es schreibt.

ReturnsNichts.

inkplate.rtc.timerSet(rtcCountdownSrcClock source_clock, uint8_t value, bool int_enable, bool int_pulse)returns void

Startet den Countdown-Timer. source_clock ist der Takt des Timers: RTC::TIMER_CLOCK_4096HZ, RTC::TIMER_CLOCK_64HZ, RTC::TIMER_CLOCK_1HZ (1 s bis 255 s) oder RTC::TIMER_CLOCK_1PER60HZ (60 s bis 4 h 15 min). value ist der Countdown in Einheiten dieses Takts, bei TIMER_CLOCK_1HZ also Sekunden. Ist int_enable true, kann der Timer den RTC-Interrupt auslösen. Ist int_pulse true, wird der Interrupt ein Impuls; bei false folgt er dem Timer-Flag. Der Sketch übergibt TIMER_CLOCK_1HZ, 30, true, false.

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.getSecond()returns uint8_t

Gibt die Sekunden zurück.

ReturnsSekunden.

inkplate.rtc.getMinute()returns uint8_t

Gibt die Minuten zurück.

ReturnsMinuten.

inkplate.rtc.getHour()returns uint8_t

Gibt die Stunden zurück.

ReturnsStunden.

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.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: Schwarz auf Weiß für die Uhrzeit, Rot auf Weiß für die Timer-Meldung.

ReturnsNichts.

inkplate.rtc.checkTimerFlag()returns bool

Meldet, ob der Timer abgelaufen ist. Das Flag wird dabei nicht gelöscht.

Returnstrue, sobald das Timer-Flag gesetzt ist.

inkplate.rtc.clearTimerFlag()returns void

Löscht das Timer-Flag, damit das nächste Timer-Ereignis erkannt werden kann.

ReturnsNichts.

inkplate.rtc.disableTimer()returns void

Stoppt den Timer, sodass er nur einmal auslöst. Entfernen Sie diese Zeile aus dem Sketch, wenn der Timer sich wiederholen soll.

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 Interrupt-Pin der RTC, auf INPUT_PULLUP.

ReturnsNichts.

delay(unsigned long ms)returns void

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

ReturnsNichts.

Was Sie erwartet​

Der erste Bildschirm zeigt Uhrzeit und Datum in Schwarz in der Form HH:MM:SS Weekday, DD/MM/, gefolgt vom Jahr. Beim Refresh eine Minute später, nachdem der 30-Sekunden-Timer abgelaufen ist, erscheint Timer! in Rot weiter unten auf dem Bildschirm neben der neuen Uhrzeit. Der Sketch gibt nichts im Serial Monitor aus.

🔗Das vollständige Beispiel öffnen

examples/Inkplate7SPECTRA/Advanced/RTC/Inkplate7SPECTRA_RTC_Timer

→