ESP32 Tutorial 53/55 - Bouw een LCD-internetklok | SunFounder's ESP32 IoT-leerkit
In deze tutorial bouwen we een internetverbonden LCD-klok met behulp van de ESP32-microcontroller van SunFounder. Deze klok synchroniseert automatisch met de huidige tijd via internet en geeft de tijd weer in 12-uurs- of 24-uursformaat, samen met de dag van de week, datum en maand. Het gebruik van het Network Time Protocol (NTP) zorgt ervoor dat de klok nauwkeurig blijft zonder handmatige aanpassingen.
Dit project maakt gebruik van de ingebouwde Wi-Fi-mogelijkheden van de ESP32 om de huidige tijd van een NTP-server op te halen. We gebruiken een Liquid Crystal Display (LCD) om de tijd weer te geven, die kan worden opgemaakt volgens de voorkeuren van de gebruiker. Raadpleeg voor verdere verduidelijking van eventuele stappen de video op (in video op 00:30).
Hardware uitgelegd
De belangrijkste componenten voor dit project zijn de ESP32-microcontroller, een 20x4 LCD-scherm en een stroombron. De ESP32 is een krachtige microcontroller met ingebouwde Wi-Fi en Bluetooth, waardoor deze geschikt is voor IoT-projecten. Het LCD-scherm wordt gebruikt om de tijd en datum weer te geven en kan worden geconfigureerd voor verschillende schermformaten.
Het LCD-scherm werkt via het I2C-protocol, dat communicatie over twee draden (SDA en SCL) mogelijk maakt. Dit vereenvoudigt de bedrading en vermindert het aantal benodigde pinnen op de ESP32. De verbinding met de NTP-server wordt gemaakt met behulp van de Wi-Fi-mogelijkheden van de ESP32, waardoor realtime updates mogelijk zijn.
- Zorg voor de juiste voedingsspanning (5 V).
- Gebruik ontkoppelcondensatoren nabij de voedingspinnen voor stabiliteit.
- Wees voorzichtig met I2C-verbindingen om busconflicten te voorkomen.
- Controleer het I2C-adres van het LCD-scherm (0x27 of 0x3F).
- Controleer de Wi-Fi-gegevens voor een nauwkeurige verbinding.
- Houd rekening met aanpassingen voor zomertijd in uw code.
- Gebruik de juiste NTP-server voor uw geografische locatie.
- Maak het LCD-scherm altijd leeg voordat u het display bijwerkt.
Bedradingsinstructies

Om de ESP32 met het LCD-scherm te bedraden, begint u met het aansluiten van de voedingspinnen. Verbind de VCC van het LCD-scherm met de 5V-pin op de ESP32 en de GND-pin van het LCD-scherm met de GND-pin op de ESP32. Voor de I2C-communicatie verbindt u de SDA-pin van het LCD-scherm met GPIO 21 op de ESP32 en de SCL-pin met GPIO 22. Zorg ervoor dat de verbindingen stevig zijn om communicatieproblemen te voorkomen.
Gebruik bij het opzetten van de bedrading male-to-female jumperdraden voor eenvoudige verbindingen. Als uw LCD-scherm een ander I2C-adres of een andere pinconfiguratie heeft, pas dan de code dienovereenkomstig aan. Raadpleeg de video op (in video op 05:30) voor alternatieve bedradingsopties indien nodig.
Codevoorbeelden & uitleg
De code initialiseert het LCD-scherm en stelt de Wi-Fi-verbinding in om tijdgegevens van de NTP-server op te halen. Belangrijke identificatiegegevens zoals ssid en password worden gebruikt om verbinding te maken met het Wi-Fi-netwerk, terwijl ntpServer1 en ntpServer2 de te gebruiken NTP-servers specificeren.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Dit fragment toont de netwerkgegevens en serveradressen. Zorg ervoor dat u uw Wi-Fi-SSID en wachtwoord nauwkeurig invoert, aangezien elke fout voorkomt dat de ESP32 verbinding maakt met internet.
In de functie printLocalTime() wordt de huidige tijd opgemaakt voor weergave. De structuur tm wordt gebruikt om tijdinformatie op te slaan, terwijl strftime helpt om de tijd op te maken tot een leesbare string.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Deze code controleert of de lokale tijd beschikbaar is en haalt het uur op. Het opgemaakte uur wordt vervolgens gebruikt om de huidige tijd op het LCD-scherm weer te geven. Als de tijd nog niet beschikbaar is, wordt er een bericht naar de Serial Monitor gestuurd.
Tot slot initialiseert de functie setup() het LCD-scherm en maakt verbinding met Wi-Fi. Het configureert ook de NTP-serverinstellingen en stelt een callback in voor tijdsynchronisatie.
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);
Dit fragment initialiseert de Serial Monitor voor debugging, stelt het LCD-scherm in en probeert verbinding te maken met het opgegeven Wi-Fi-netwerk. De verbindingsstatus wordt naar de Serial Monitor gestuurd, zodat u de verbinding kunt verifiëren.
Demonstratie / Wat te verwachten
Na een succesvolle installatie toont het LCD-scherm de huidige tijd, dag van de week en de datum. U kunt verwachten dat de tijd elke 5 seconden wordt bijgewerkt, dankzij de functie loop(). Als de verbinding met de NTP-server mislukt, verschijnt er een bericht op de Serial Monitor dat aangeeft dat de tijd nog niet beschikbaar is (in video op 12:00).
Veelvoorkomende valkuilen zijn onjuiste bedrading, verkeerde I2C-adressen en onjuiste Wi-Fi-gegevens. Zorg ervoor dat alle verbindingen stevig zijn en dat de NTP-server bereikbaar is vanaf uw netwerk.
Videotijdstempels
- 00:00 Start
- 2:10 Introductie
- 5:15 Bedrading uitgelegd
- 7:32 Arduino-code uitgelegd
- 18:43 ESP32-board en COM-poort selecteren in Arduino IDE
- 20:27 Internetklok-demonstratie
/*
Internet Clock using SunFounder's IoT ESP32 Learning kit
Full video instruction https://youtu.be/0KnuNqfiVug
📚⬇️ Download and resource page https://robojax.com/RJT686
Internet Clock for ESP32
Written by Ahamd Shasmhiri on Dec 31, 2023 at 19:29
www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
const bool showSeconds = true;//set to "true" to show seconds and "false" to hide
const bool showShortMonth = false;//December = false, Dec=true
const bool show24Hours = true;//true to have 18:30 or false to have 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
//TZ.h is taken from 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 12Hours: %I:%M:%S");
// get time format HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour);//convert timeHour to string
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String minuteString = String(timeMinute);
//Serial.println(hourString);
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(months[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);//add seconds if 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);
}
// Callback function (get's called when time adjusts via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init();// initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
lcd.print("Internet Clock");
delay(3000);//waif 3 seconds
// set notification call-back function
sntp_set_time_sync_notification_cb( timeavailable );
/**
* NTP server address could be aquired via DHCP,
*
* NOTE: This call should be made BEFORE esp32 aquires IP address via DHCP,
* otherwise SNTP option 42 would be rejected by default.
* NOTE: configTime() function call if made AFTER DHCP-client run
* will OVERRIDE aquired NTP server address
*/
sntp_servermode_dhcp(1); // (optional)
/**
* This will set configured ntp servers and constant TimeZone/daylightOffset
* should be OK if your time zone does not need to adjust daylightOffset twice a year,
* in such a case time adjustment won't be handled automagicaly.
*/
// configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/**
* A more convenient approach to handle TimeZones with daylightOffset
* would be to specify a environmnet variable with TimeZone definition including daylight adjustmnet rules.
* A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
//configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
//connect to WiFi
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(); // it will take some time to sync time :)
}
Common Course Links
Common Course Files
Dingen die je misschien nodig hebt
-
AmazonPurchase LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Hulpmiddelen en referenties
-
ExternPurchase LCD1602 display from Banggoodbanggood.com
Bestanden📁
Vereist bestand (.h)
-
TZ.h
TZ.h0.02 MB