Bouw een compact NTP-klokje met een TM1637 7-segment display — automatische zomer-/wintertijd, geen hard gecodeerd WiFi-wachtwoord, en amper 18 regels code.
Verbindingen:
ESP8266 -> TM1637
=================
GND --------> GND
3V3 --------> VCC
D2 --------> DIO
D1 --------> CLK
Sketch voor een eenvoudig klokje:
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager/
#include <TM1637Display.h> // https://github.com/avishorp/TM1637/
struct tm tInfo; // https://cplusplus.com/reference/ctime/tm/
WiFiManager myWiFi;
TM1637Display ledSeg(5, 4); // scl (clk) -> GPIO5 (D1) / sda (dio) -> GPIO4 (D2).
void setup() {
Serial.begin(115200); // watch serial monitor in case of new WiFi-connection
myWiFi.autoConnect("TM1637_ESP"); // connect ESP to new wifi via GSM or PC in that case
ledSeg.setBrightness(2); // 0 .. 7
configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", "be.pool.ntp.org"); // https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
}
void loop() {
getLocalTime(&tInfo); // sntp sync at startup & every hour from then on
ledSeg.showNumberDecEx(tInfo.tm_hour * 100 + tInfo.tm_min, 0x40 * (millis() % 1000 < 500), 1); // 0x40 = ":", 1 = leading zeros
}
#include <WiFiManager.h> — bibliotheek om de ESP met de WiFi te verbinden, inclusief webserver als de WiFi-gegevens niet eerder ingebracht waren. De verbinding kan overal. Als de verbinding niet lukt, dan zie je op de seriële monitor:
configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", "be.pool.ntp.org"); — dit is de lijn die er voor zorgt dat de juiste tijdzone gebruikt wordt, het klokje zich automatisch aanpast aan zomer- of wintertijd, en vervolgens aangeeft met welke NTP-servers je wenst te synchroniseren.ledSeg.showNumberDecEx(ti.tm_hour * 100 + ti.tm_min, 0x40 * (millis() % 1000 < 500), 1); — de tijd wordt op het display weergegeven met een dubbelpunt dat elke halve seconde verborgen of getoond wordt, en met vooroplopende nullen.getLocalTime(&timeinfo); vraagt de tijd uit de ESP8266 op, aangepast volgens tijdzone en zomertijd/wintertijd. De eerste keer wordt er gesynchroniseerd met de NTP-server, de volgende keren gebeurt de synchronisatie om het uur (werd uitgebreid getest met callbackfuncties). Om het uur betekent niet "telkens wanneer het uur verspringt", wel telkens een uur na de vorige synchronisatie.Volgende code voor ons "minimumklokje" is aangepast voor zowel de ESP8266 als de ESP32. Het standaard interval voor de tijdsynchronisatie voor de ESP32 is 3 uur, voor de ESP8266 is dat 1 uur. De enige aanpassingen zijn de GPIO-aansluitingen van het display:
Verbindingen:
ESP32 ---> TM1637
=================
GND --------> GND
3V3 --------> VCC
G21 --------> DIO
G22 --------> CLK
Sketch:
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager/
#include <TM1637Display.h> // https://github.com/avishorp/TM1637/
struct tm tInfo; // https://cplusplus.com/reference/ctime/tm/
WiFiManager myWiFi;
#if defined(ESP32)
TM1637Display ledSeg(22, 21); // scl (clk) -> G22 / sda (dio) -> G21.
#elif defined(ESP8266)
TM1637Display ledSeg(5, 4); // scl (clk) -> GPIO5 (D1) / sda (dio) -> GPIO4 (D2).
#endif
void setup() {
Serial.begin(115200); // watch serial monitor in case of new WiFi-connection
myWiFi.autoConnect("TM1637_ESP"); // connect ESP to new wifi via GSM or PC in that case
ledSeg.setBrightness(2); // 0 .. 7
configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", "be.pool.ntp.org"); // https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
}
void loop() {
getLocalTime(&tInfo); // sntp sync at startup & every hour from then on
ledSeg.showNumberDecEx(tInfo.tm_hour * 100 + tInfo.tm_min, 0x40 * (millis() % 1000 < 500), 1); // 0x40 = ":", 1 = leading zeros
}
We zouden deze code kunnen uitbreiden, zodat het klokje, als het een WiFi-verbinding aangaat tijdens de opstart, zelf zijn locatie opzoekt via een API. Dan kan de tijdzone automatisch toegekend worden. Zo zou je een NTP-klokje kunnen maken met de ESP, dat je om het even waar ter wereld kan gebruiken. Na het verbinden met een beschikbare WiFi geeft het de correcte locale tijd weer.
Benieuwd naar andere displays? Bekijk het volledige overzicht met o.a. SSD1306, SH1106, ST7735, ST7789, e-paper en geïntegreerde displays zoals de Lilygo T-Display en de Waveshare ESP32-S3.