Hodiny s modulem DS3231 a OLED displejem
V tomto projektu si ukážeme, jak si postavit jednoduché hodiny se zobrazením času, datem a dne v týdnu. Pro stavbu tohoto zapojení kromě modulu ESP32 použijeme modul reálných hodin RTC DS3231 a 0,96″ I2C OLED displej (SSD1306 I2C). Alternativním obvodem k DS3231 může být kupříkladu modul DS1307. Výhoda RTC modulu DS3231 je to, že má vestavěnou funkce budíku a také teplotní senzor. Pokud tedy použijeme tento modul, můžeme jednoduchým způsobem rozšířit své hodiny o další zajímavé funkce.
Modul DS3231 RTC
Modul DS3231 je levný, extrémně přesný modul I²C hodin reálného času (RTC) s integrovaným teplotně kompenzovaným krystalovým oscilátorem. Modul je doplněn baterií, která zabezpečuje chod hodin, i když je přerušeno hlavní napájení.
Modul RTC uchovává informace o sekundách, minutách, hodinách, dnu, datu, měsíci a roce. Datum respektuje počet dní v daném měsíci, včetně oprav pro přestupný rok. Hodiny pracují v 24hodinovém nebo 12hodinovém formátu s aktivním indikátorem AM/PM. K dispozici jsou dva programovatelné alarmy denní doby a programovatelný výstup obdélníkových vln.
Přesný teplotně kompenzovaný referenční a komparační obvod monitoruje stav Vcc, aby detekoval výpadky napájení, poskytl resetovací výstup a v případě potřeby automaticky přepnul na záložní zdroj.
Modul pracuje na napětí 3,3 V a komunikuje sběrnicí I²C. To usnadňuje připojení k modulu ESP32.
0,96palcový OLED displej
OLED displej, který v tomto případě použijeme, je model SSD1306. Jedná se o jednobarevný 0,96″ displej s rozlišením 128×64 pixelů. OLED displej nevyžaduje podsvícení, což má za následek velmi pěkný kontrast v tmavém prostředí. Navíc jeho pixely spotřebovávají energii, pouze když jsou zapnuté, takže OLED displej spotřebovává méně energie než ostatní displeje.
Model, který používáme, má čtyři piny a komunikuje s libovolným mikrokontrolérem pomocí komunikačního protokolu I²C. Pozor, existují i modely, které komunikují prostřednictvím protokolu SPI.
Sestavení obvod: hodiny s ESP32 a DS3231
Následující obrázek ukazuje schéma propojení modulu DS3231 s ESP32 a OLED. Díky použití komunikační sběrnice I²C, je zapojení poměrně jednoduché.
Pro komunikaci potřebujeme jen 2 piny. U obou modulů, jak displeje, tak modulu reálných hodin, připojíme pin sériových dat (SDA
) ke kolíku GPIO21
modulu ESP32 a kolík sériových hodiny (SCL
) ke kolíku GPIO22
modulu ESP32. Napájení 3,3 V opět u obou modulů (OLED a RTC) spojíme s pinem 3,3 V modulu ESP32. Některé prameny i uvádějí, že můžeme též použít napájení 5 V (pro DS3231 i OLED modul). V tomto případě je ale na pováženou, zda je tato informace správná! Je třeba si uvědomit, že modul ESP32 komunikuje na 3,3V logice a pokud jsou I²C vodiče na straně OLED nebo RTC připojeny zdvihacími rezistory k napájecímu napětí, dochází při 5V napájení k přetěžování vstupů modulu ESP32.
Obvod můžete sestavit poměrně rychle na nepájivém poli.
Zdrojový kód modulu ESP32 je uveden níže. Kód můžete zkopírovat a nahrát přímo na desku ESP32. Ale předtím budete potřebovat naistalovat do prostředí Arduino IDE několik knihoven.
Nejprve si buď pomocí správce knihoven prostředí Arduino IDE stáhněte a přidejte následující knihovny (od vývojáře Adafruit)
Adafruit_SSD1306:
Adafruit_GFX:
RTClib:
Kód programu pro prostředí Arduino IDE
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Nedele", "Pondeli", "Utery", "Streda", "Ctvrtek", "Patek", "Sobota"};
#define SCREEN_WIDTH 128 // OLED displej – sirka (v pixlech)
#define SCREEN_HEIGHT 64 // OLED displej - vyska (v pixlech)
#define OLED_RESET -1 // Reset pin # (nebo -1 pokud modul nema svuj RESET pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup(){
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println("Nelze najit RTC");
while (1); // STOP, smycka je nekonecna
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 spojeni se nezdarilo");
while (1); // STOP, smycka je nekonecna
}
rtc.adjust(DateTime(__DATE__, __TIME__));
display.display();
delay(2);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print(" Clock ");
display.display();
delay(3000);
}
void loop() {
DateTime now = rtc.now();
display.clearDisplay();
display.setTextSize(2);
display.setCursor(75,0);
display.println(now.second(), DEC);
display.setTextSize(2);
display.setCursor(25,0);
display.println(":");
display.setTextSize(2);
display.setCursor(65,0);
display.println(":");
display.setTextSize(2);
display.setCursor(40,0);
display.println(now.minute(), DEC);
display.setTextSize(2);
display.setCursor(0,0);
display.println(now.hour(), DEC);
display.setTextSize(2);
display.setCursor(0,20);
display.println(now.day(), DEC);
display.setTextSize(2);
display.setCursor(25,20);
display.println("-");
display.setTextSize(2);
display.setCursor(40,20);
display.println(now.month(), DEC);
display.setTextSize(2);
display.setCursor(55,20);
display.println("-");
display.setTextSize(2);
display.setCursor(70,20);
display.println(now.year(), DEC);
display.setTextSize(2);
display.setCursor(0,40);
display.print(daysOfTheWeek[now.dayOfTheWeek()]);
display.display();
}
Pokud jsme aspoň trochu seznámili s předchozími články, ve kterých sme si vysvětlovali připojení RTC modulu k modulu ESP, popř. s I²C displejem (i když v trochu jiným typem), měli bychom se v kódu po chvíli zorientovat.
Za zmínku stojí výchozí nastavení času. Jistě nás napadne, jak je možné, že naše hodiny po přeložení kódy vědí přesný čas a datum. V případě, že by se modul ESP32 připojoval k internetu, bychom si mohli myslet, že získal tuto informaci například z některého z NTP serverů, ale nyní se modul nikam nepřipojuje.
Tajemství nastavení času se skrývá v následující řádce:
rtc.adjust(DateTime(__DATE__, __TIME__));
Výrazy __DATE__
a __TIME__
jsou informace pro překladač, aby do programu vložil aktuální čas. K nastavení hodin tedy došlo z našeho PC při překladu a zápisu programu do modulu ESP32. A jelikož tuto informaci okamžitě přebere modul RTC, je tato informace dále v zapojení našich hodin udržována. Jen pozor resetování hodin. Pak opět proběhne funkce setup a nastaví se do hodin čas posledního kódu překladu!
Dokončili jsme další provedení hodin s modulem ESP32. Jak jsme zmínili v úvodu, modul DS3231 disponuje dalšími funkcemi – dvojicí budíků a hlavně teplotním čidlem. Určitě by bylo dobré tyto informace získat a zobrazit na připojeném displeji. Určitě by nás mohli zajímat funkce jako je getAlarm1Mode()
nebo getTemperature()
a podobně. Jako inspiraci pro další možný rozvoj tohoto zapojení přikládáme odkaz na referenční list knihovny RTClib (pro třídu RTC_DS3231)