ESP32 Tutorial 53/55 - Baue eine LCD-Internet-Uhr | SunFounder's ESP32 IoT-Lernkit
In diesem Tutorial werden wir eine mit dem Internet verbundene LCD-Uhr mit dem ESP32-Mikrocontroller von SunFounder bauen. Diese Uhr synchronisiert sich automatisch mit der aktuellen Zeit über das Internet und zeigt die Zeit entweder im 12-Stunden- oder im 24-Stunden-Format sowie den Wochentag, das Datum und den Monat an. Die Verwendung des Network Time Protocol (NTP) stellt sicher, dass die Uhr ohne manuelle Anpassungen genau bleibt.
Dieses Projekt nutzt die integrierten Wi-Fi-Funktionen des ESP32, um die aktuelle Zeit von einem NTP-Server abzurufen. Wir werden ein LCD (Liquid Crystal Display) verwenden, um die Zeit anzuzeigen, die gemäß den Benutzerpräferenzen formatiert werden kann. Für weitere Klarstellungen zu einzelnen Schritten sehen Sie sich bitte das Video bei (im Video bei 00:30) an.
Hardware erklärt
Die Hauptkomponenten für dieses Projekt sind der ESP32-Mikrocontroller, ein 20x4-LCD-Display und eine Stromquelle. Der ESP32 ist ein leistungsstarker Mikrocontroller mit integriertem WLAN und Bluetooth, was ihn für IoT-Projekte geeignet macht. Das LCD wird verwendet, um die Uhrzeit und das Datum anzuzeigen, und es kann für verschiedene Displaygrößen konfiguriert werden.
Das LCD funktioniert über das I2C-Protokoll, das die Kommunikation über zwei Leitungen (SDA und SCL) ermöglicht. Dies vereinfacht die Verdrahtung und reduziert die Anzahl der benötigten Pins auf dem ESP32. Die Verbindung zum NTP-Server erfolgt über die WLAN-Fähigkeiten des ESP32, was Echtzeit-Updates ermöglicht.
- Stellen Sie die richtige Betriebsspannung (5 V) sicher.
- Verwenden Sie Entkoppelkondensatoren in der Nähe der Stromanschlüsse für Stabilität.
- Sei vorsichtig mit I2C-Verbindungen, um Buskonflikte zu vermeiden.
- Überprüfen Sie die I2C-Adresse des LCDs (0x27 oder 0x3F).
- Überprüfen Sie die Wi-Fi-Anmeldeinformationen für eine genaue Verbindung.
- Behandeln Sie Anpassungen an der Sommerzeit in Ihrem Code.
- Verwenden Sie den richtigen NTP-Server für Ihren geografischen Standort.
- Reinigen Sie immer das LCD, bevor Sie das Display aktualisieren.
Verdrahtungsanweisungen

Um den ESP32 mit dem LCD zu verbinden, beginnen Sie damit, die Stromanschlüsse anzuschließen. Verbinden Sie VCC des LCD mit dem 5V-Pin des ESP32 und den GND-Pin des LCD mit dem GND-Pin des ESP32. Für die I2C-Kommunikation verbinden Sie den SDA-Pin des LCD mit GPIO 21 des ESP32 und den SCL-Pin mit GPIO 22. Stellen Sie sicher, dass die Verbindungen sicher sind, um Kommunikationsprobleme zu vermeiden.
Beim Einrichten der Verkabelung verwenden Sie männlich-zu-weiblich Jumper-Kabel für einfache Verbindungen. Wenn Ihr LCD eine andere I2C-Adresse oder Pin-Konfiguration hat, passen Sie den Code entsprechend an. Sehen Sie sich das Video bei (im Video bei 05:30) für alternative Verkabelungsoptionen an, falls erforderlich.
Code-Beispiele & Anleitung
Der Code initialisiert das LCD und richtet die Wi-Fi-Verbindung ein, um Zeitdaten vom NTP-Server abzurufen. Wichtige Kennungen wiessidundpasswordwerden verwendet, um eine Verbindung zum Wi-Fi-Netzwerk herzustellen, währendntpServer1undntpServer2Geben Sie die zu verwendenden NTP-Server an.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";Dieser Abschnitt zeigt die Netzwerk-Anmeldeinformationen und Serveradressen. Stellen Sie sicher, dass Sie Ihre Wi-Fi-SSID und Ihr Passwort korrekt eingeben, da jeder Fehler das ESP32 daran hindert, eine Verbindung zum Internet herzustellen.
In derprintLocalTime()Funktion, die aktuelle Zeit wird für die Anzeige formatiert. Die Strukturtmwird verwendet, um zeitliche Informationen zu speichern, währendstrftimehilft, die Zeit in eine lesbare Zeichenkette zu formatieren.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);Dieser Code überprüft, ob die lokale Zeit verfügbar ist, und ruft die Stunde ab. Die formatierte Stunde wird dann verwendet, um die aktuelle Zeit auf dem LCD anzuzeigen. Wenn die Zeit noch nicht verfügbar ist, wird eine Nachricht im Serial Monitor ausgegeben.
Schließlich, dassetup()Die Funktion initialisiert das LCD und verbindet sich mit Wi-Fi. Sie konfiguriert auch die NTP-Servereinstellungen und setzt einen Callback für die Zeitsynchronisierung.
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);Dieser Auszug initialisiert den Serial Monitor zum Debuggen, richtet das LCD ein und versucht, sich mit dem angegebenen Wi-Fi-Netzwerk zu verbinden. Der Verbindungsstatus wird im Serial Monitor angezeigt, sodass Sie die Verbindung überprüfen können.
Demonstration / Was zu erwarten ist
Bei erfolgreicher Einrichtung zeigt das LCD die aktuelle Uhrzeit, den Wochentag und das Datum an. Sie können damit rechnen, dass sich die Uhrzeit alle 5 Sekunden aktualisiert, dank derloop()Funktion. Wenn die Verbindung zum NTP-Server fehlschlägt, wird eine Nachricht im Serial Monitor angezeigt, die darauf hinweist, dass die Zeit noch nicht verfügbar ist (im Video um 12:00).
Häufige Fallstricke sind falsches Verkabeln, falsche I2C-Adressen und falsche Wi-Fi-Anmeldeinformationen. Stellen Sie sicher, dass alle Verbindungen sicher sind und dass der NTP-Server von Ihrem Netzwerk aus erreichbar ist.
Video-Zeiten
- 00:00 Start
- 2:10 Einführung
- 5:15 Verdrahtung erklärt
- 7:32 Arduino-Code erklärt
- 18:43 ESP32-Board und COM-Port im Arduino IDE auswählen
- 20:27 Internet-Uhr-Demonstration
/*
* Internetuhr mit dem IoT ESP32 Lernset von SunFounder
* Vollständige Videoanleitung https://youtu.be/0KnuNqfiVug
* 📚⬇️ Download- und Ressourcen-Seite https://robojax.com/RJT686
* Internetuhr für ESP32
* Verfasst von Ahamd Shasmhiri am 31. Dezember 2023 um 19:29
* www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21, SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // Setzen Sie die LCD-Adresse auf 0x27 für ein Display mit 16 Zeichen und 2 Zeilen.
const bool showSeconds = true; // auf "true" setzen, um Sekunden anzuzeigen, und auf "false", um sie auszublenden
const bool showShortMonth = false; // Dezember = falsch, Dez=true
const bool show24Hours = true; // wahr, um 18:30 zu haben, oder falsch, um 6:30 zu haben
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
// TZ.h stammt von https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
const String months[][2] ={
"January","Jan",
"February","Feb",
"March","Mar",
"April","Apr",
"May","May",
"June","Jun",
"July","Jul",
"August","Aug",
"September","Sep",
"October","Oct",
"November","Nov",
"December","Dec"
};
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S 12Uhr: %I:%M:%S");
// Zeitformat HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour); // Zeitstunde in String umwandeln
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String minuteString = String(timeMinute);
// Serial.println(StundenString);
if(!show24Hours)
{
if(hourString.toInt() >= 12)
{
minuteString = minuteString + "PM";
}else{
minuteString = minuteString + "AM";
}
}
char timeSeconds[3];
strftime(timeSeconds,3, "%S", &timeinfo);
char timeDayofWeek[10];
strftime(timeDayofWeek, 10 , "%A", &timeinfo);
char timeMonth[10];
strftime(timeMonth, 10 , "%B", &timeinfo);
String Month = String(timeMonth);
if(showShortMonth)
{
for(int m=0; m <12; m++)
{
if(Month == months[m][0] )
{
Month = months[m][1];
// Serial.println(monate[m][1]);
}
}
}
char timeDayofMonth[3];
strftime(timeDayofMonth,3 , "%d", &timeinfo);
char timeYear[5];
strftime(timeYear, 5 , "%Y", &timeinfo);
String time = String(timeHour) + ":" + minuteString ;
if(showSeconds) time = time +":" + String(timeSeconds); // Sekunden hinzufügen, wenn showSeconds=true
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(String(timeDayofWeek));
lcd.setCursor(0, 1);
lcd.print(timeDayofMonth);
lcd.print(" ");
lcd.print(Month);
lcd.print(" ");
lcd.print(timeYear);
}
// Rückruffunktion (wird aufgerufen, wenn die Zeit über NTP angepasst wird)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init(); // das LCD initialisieren
lcd.backlight(); // Schaltet die LCD-Hintergrundbeleuchtung ein.
lcd.print("Internet Clock");
delay(3000); // waif 3 Sekunden
// Benachrichtigungs-Rückruffunktion festlegen
sntp_set_time_sync_notification_cb( timeavailable );
/*
* Die NTP-Serveradresse kann über DHCP bezogen werden.
*
* HINWEIS: Dieser Aufruf sollte GETÄTIGT WERDEN, BEVOR der esp32 die IP-Adresse über DHCP erwirbt,
* ansonsten würde die SNTP-Option 42 standardmäßig abgelehnt.
* HINWEIS: Der Aufruf der Funktion configTime() nach dem Betrieb des DHCP-Clients
* überschreibt die erlangte NTP-Serveradresse.
*/
sntp_servermode_dhcp(1); // (optional)
/*
* Dies wird die konfigurierten NTP-Server und die konstante Zeitzone/den Tageslicht-offset festlegen. Es sollte in Ordnung sein, wenn Ihre Zeitzone nicht zweimal im Jahr den Tageslicht-offset anpassen muss. In einem solchen Fall wird die Zeitkorrektur nicht automatisch behandelt.
*/
// configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/*
* Ein bequemerer Ansatz zur Handhabung von Zeitzonen mit daylightOffset wäre es, eine Umgebungsvariable mit der Zeitzonendefinition einschließlich der Regeln für die Sommerzeit anzulegen. Eine Liste von Regeln für Ihre Zone könnte von https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h abgerufen werden.
*/
// configTzTime(TZ_Amerika_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
// Mit WiFi verbinden
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
}
void loop()
{
delay(5000);
printLocalTime(); // Es wird einige Zeit dauern, um die Zeit zu synchronisieren :)
}
Common Course Links
Common Course Files
Dinge, die Sie vielleicht brauchen
-
AmazonLCD1602-I2C bei Amazon kaufenamzn.to
-
eBayKaufen Sie LCD1602-I2C bei eBay.ebay.us
-
BanggoodKaufe das LCD1602-Display bei Banggood.banggood.com
Ressourcen & Referenzen
-
ExternKaufe das LCD1602-Display bei Banggood.banggood.com
Dateien📁
Erforderliche Datei (.h)
-
TZ.h
TZ.h0.02 MB