Introduction: Simplest ESP8266 Local Time Internet Clock With OLED
I was looking for a straightforward clock to use with a 128x64 OLED I got from Adafruit but found that a lot of the implementations were too cumbersome, involved a ton of code, weren't clear on what NTP servers to use and how, and basically offered very little in terms of making a clock with the LOCAL time (not UTC, which is easy enough to get). So I set about doing my own research and ended up with this simple clock that leverages already made libraries to minimize the code footprint, while offering some interesting tweaks in displaying the time (like AM/PM, 12-hour format, names for months, days, etc). This instructable assumes you have some experience programming ESP-01s but if not, there are a ton of wonderful tutorials available on Instructables! Enjoy!
Step 1: Components
For this instructable you will need:
- ESP8266-01 module
- 128x64 OLED with I2C interface
- 3.3V power supply
- A way to program the ESP-01
Step 2: Wire It Up!
The wiring is simple. Just follow the diagram above and connect the wires. Then get a 3.3V power supply (I used a step-down module to go from 12V to 3.3 but you can use whatever you have in your arsenal as long as it outputs 3.3V and at least 0.5 A).
Step 3: Program the ESP-01
This step can be frustrating if you haven't done it before, but once you get the hang of how the ESP boards work and have the correct drivers and libraries installed in Arduino, you can go ahead and use the following code. But first, you will need to download and install the following libraries:
- Time.h & TimeLib.h: https://github.com/PaulStoffregen/Time
- Timezone.h: https://github.com/JChristensen/Timezone
- SSD1306.h & SSD1306Wire.h: https://github.com/squix78/esp8266-oled-ssd1306
- NTPClient.h: https://github.com/arduino-libraries/NTPClient
- ESP8266WiFi.h & WifiUDP.h: https://github.com/ekstrand/ESP8266wifi
You may need to modify some of the code according to what OLED you're using (as long as it's SSD1306 it'll work but you may need to update the hex I2C address) and then you may have to change some of the Timezone rules depending on your timezone and daylight savings time rules. Then upload the code attached and you should be done!
Attachments
Step 4: See It Go!
Once you have programmed the ESP, plugged everything in, make sure you have 3.3V going into the setup and then power it on and see your correct time on the tiny display!
64 Comments
Question 5 months ago on Introduction
where Do you download the arduino Code from
Answer 27 days ago
here
4 weeks ago
've done this project, including creating the new 3D printed shell, which I assembled and finished loading date (shown): May 1, 2023.
Remarks: I created a new 3D printing shell (STL format, which can be put into your printer to print, if you want STL, please leave a message for your
我已經做好這個項目,也含創建新的3D打印殻体,我組裝完成裝入日期(顯示):5月1日2023年
備註:我創建新的3D打印殻体(STL格式,可以投入你的打印機來打印,如果你要你要STL請留言你的@信箱,可以分享給大家
1 year ago
Hello, I am from Taiwan(台灣), I am studying NTPClient in the code, I changed it to: "tw.ntp.org"//Taiwan time zone, and also: TimeChangeRule usCDT = {"CDT", Second, Sun, Mar, 2 , 420}; //Taiwan UTC time _ +8, now the Taiwan time is displayed correctly. This project is great, I learned the knowledge, and I am very grateful to the author for publishing, thank you
Question 5 years ago on Step 3
please help me, my oled won't show screen, it's not broken oled... because if i have another sketch the oled works...
Answer 2 years ago
Schematic hand sketch shows scl and sda in wrong positions so you may have to swap these. I did and that made the display work.
Answer 4 years ago
bạn tìm dòng code này SSD1306 display(0x3c, 0, 2); //0x3d for the Adafruit 1.3" OLED, 0x3C being the usual address of the OLED 0.96" thay 0x3d thành 0x3c dùng cho loại LCD 0.96 Inch
Question 4 years ago on Step 3
Compiler gives: "WARNING: library Timezone claims to run on (avr) architecture(s) and may be incompatible with your current board which runs on (esp8266) architecture(s)."
Does this mean anything?
Answer 2 years ago
The reason is the author only works exclusively with AVR even though the library works with ESP8266 and ESP32 just fine. You can ignore the error, or you can modify a file in the library directory to have it know that it will work correctly.
Look for a file in the library directory in the Timezone folder called...
library.properties
open as a text file and change...
architectures=avr
to
architectures=avr,esp8266,esp32
Answer 4 years ago
No
Question 3 years ago on Step 3
Can you please suggest what changes would be necessary for 24 Hour time format?
Or do you have a 24 Hr version?
Answer 3 years ago
t += ":";
if(minute(local) < 10) // add a zero if minute is under 10
t += "0";
t += minute(local);
t += " ";
t += ampm[isPM(local)];
t += hour(local);
t += ":";
if(minute(local) < 10) // add a zero if minute is under 10
t += "0";
t += minute(local);
t += ":";
if(second(local) < 10) // add a zero if minute is under 10
t += "0";
t += second(local);
you can delete the seconds
3 years ago
so this code works great only issue i am having is the clock is a hour fast.. I changed the timezone code to central with no change. anyone help with what to do to change the hour its ahead.. my guess is daylight savings change is the issue.
TimeChangeRule usCDT = {"CDT", Second, Sun, Mar, 2, -300}; //UTC - 5 hours - change this as needed
TimeChangeRule usCST = {"CST", First, Sun, Nov, 2, -360}; //UTC - 6 hours - change this as needed
Timezone usCentral(usCDT, usCST);
local = usCentral.toLocal(utc);
Reply 3 years ago
It's because you didn't change the values of the last numbers in the function. -300 is 5 hours (5*60) but you actually need 360 there and 420 in the second row, because you're an extra hour behind the Prime meridian. So if you change the first line to -360 and second to -420 you should be good to go.
Reply 3 years ago
It worked.. I thank you sir.. I like this format of the clock and date.. Nice work
Question 3 years ago
Pourquoi les projets sur instructable ne fonctionne jamais!
3 years ago
hi, can you launched sensor fluxgate flc100 magnetometr with ardunio and conected to pc wiht bleuthos? thack you very much
3 years ago
Great project for simple clock. I am trying to change timezone with following modifications:
TimeChangeRule usPDT = {"PDT", Second, Sun, Mar, 2, -420}; //UTC - 7 hours - change this as needed
TimeChangeRule usPST = {"PST", First, Sun, Nov, 2, -480}; //UTC - 8 hours - change this as needed
Timezone usPacific(usPST, usPDT);
local = usPacific.toLocal(utc);
However, it seems that the time is showing PST instead of PDT (currently it is June so should be daylight saving PDT time instead).
Where may I have missed it?
Thanks in advance.
Reply 3 years ago
Looks like you have usPST and usPDT reversed. Your third line should read:
Timezone usPacific(usPDT, usPST);
4 years ago
Please help. Compiler writes:
C:\Users\xxxx\Documents\Arduino\libraries\Time-master\DateStrings.cpp:
In function 'char* monthStr(uint8_t)':
C:\Users\xxxx\Documents\Arduino\libraries\Time-master\DateStrings.cpp:76:66:
error: 'strcpy_P' was not declared in this scope
strcpy_P(buffer, (PGM_P)pgm_read_word(&(monthNames_P[month])));
^
C:\Users\xxxx\Documents\Arduino\libraries\Time-master\DateStrings.cpp:
In function 'char* dayStr(uint8_t)':
C:\Users\xxxx\Documents\Arduino\libraries\Time-master\DateStrings.cpp:90:61:
error: 'strcpy_P' was not declared in this scope
strcpy_P(buffer, (PGM_P)pgm_read_word(&(dayNames_P[day])));
What is wrong !!!!