Simplest ESP8266 Local Time Internet Clock With OLED

57,529

301

53

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!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

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:

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!

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!

6 People Made This Project!

Recommendations

  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

53 Discussions

None
parisa2000

6 weeks ago

hi, can you launched sensor fluxgate flc100 magnetometr with ardunio and conected to pc wiht bleuthos? thack you very much

None
Edward_

Question 3 months 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?

None
leonardtsai22

4 months 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.


1 reply
None
MichaelB247leonardtsai22

Reply 4 months ago

Looks like you have usPST and usPDT reversed. Your third line should read:
Timezone usPacific(usPDT, usPST);

None
BohuslavK1

5 months 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 !!!!

None
gig68

Question 7 months ago

Buon giorno
volevo realizzare questo progetto ma aprendo il file . ino scaricato sull ide di arduino mi da errore
mi potete aiutare
grazie

None
giecuk

Question 1 year 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...

1 answer
None
Xuan TruongHgiecuk

Answer 8 months 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

None
meahdi

2 years ago

Hi

I like this project

How can i change time zone to my local time

3 replies
None
karsten2meahdi

Reply 1 year ago

hey, you have to edit the line 94 and 95 to deposit your own difference to the utc-time.

None
wangzhenmeahdi

Reply 1 year ago

youcan do that: setTime(nettime + x * 3600);

Im in china so x = 8 setTime(nettime + 8 * 3600);

None
timg11

Question 1 year 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?

1 answer
None
giecuk

1 year ago

why my oled not showing anything...
i'm using LCD OLED 0.96" WHITE I2C, the OLED is not broken, because i have tested it with other library with my arduino uno.
seems the ESP8266 successfully uploading, because when i test serial monitor, it's working...
but my oled blank, no any display... and i have already try to changing 0x3C it's same...

10751189271388600327.jpggfjgfkj.PNG
1 reply
None
giecukgiecuk

Reply 1 year ago

Solved it by reflashing the esp8266 using newer firmware.

None
josefn1

2 years ago

Very nice and simple project.
Could you add sketch for 24-hour format?

3 replies
None
MichaelM1287TomK32

Reply 1 year ago

how to change this to BST.

I added like that, but don't work for me. didi I missed something

TimeChangeRule BST = {"BST", Last, Sun, Mar, 1, 60}; //British Summer Time

TimeChangeRule GMT = {"GMT", Last, Sun, Oct, 2, 0}; //Standard Time

Timezone UK(BST, GMT);

None
josefn1TomK32

Reply 2 years ago

Thanks, time is now displayed in a 24-hour format.