I chose the Wemos D1 Mini, as it can be simply programmed using the USB port on the microcontroller. I would suggest using PlatformIO, but you can use the Arduino IDE as well. If you've never done this before, there are a few steps that need to be followed before you can program the ESP8266

PlatformIO

Download and install Microsoft's free IDE - VSCode: https://code.visualstudio.com/download Open VSCode Extension Manager

VSCode Extension Manager Search for official PlatformIO IDE extension

for official PlatformIO IDE extension Install PlatformIO IDE. Open PlatformIO home and click on Platforms Seach for Espressif 8266 and download the platform

Arduino IDE

Download and install the Arduino IDE: https://www.arduino.cc/en/Main/Software Open the IDE and go to Tools -> Boards -> Boards Manager... Search for ESP8266 and click install

The Code

The source code for the project can be downloaded from github (for the latest version): https://github.com/dushyantahuja/SmallInfinityMirr...

Click on "Clone or Download" and then "Download Zip" (see image for reference) and extract it.

You can now open this in PlatformIO or Arduino. PlatformIO will download the required libraries automatically, however you will have to download these manually if you're using the Arduino IDE:

IPGeolocation FastLED NTPClient Time< ArduinoJSON ESPAsyncTCP ESP Async WebServer@1.2.2 - make sure you download version 1.2.2 - the newer version seems to error out while compiling - and I haven't really looked into it ESPAsyncWifiManager

IP Geolocation

The clock is designed to locate your time zone using your IP address (geolocation). To use this feature, you need to register at https://ipgeolocation.io/signup.html and create an API Key. Then replace the Xs in Line 21 to the API Key that you have generated

String IPGeoKey = "XXXXXXXXXXXXXXXXX";

In case, you do not want to use geolocation, or if you want to set the clock to a different time zone, you will have to make the following modifications to the code:

Comment out lines 20 and 21

#include <ipgeolocation.h> String IPGeoKey = "XXXXXXXXXXXXXXXXX";

Comment out lines 102 to 105

IPGeolocation IPG(IPGeoKey); IPGeo I; IPG.updateStatus(&I); timeClient.setTimeOffset(I.offset*3600);

Modify line 40 to set your time zone

NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 0, 360000);

The third parameter (0 in the line above) is the timezone offset in seconds. So if the offset is one hour, put in 3600 instead of zero. Please note, in case there you will need to change this for daylight savings, or if you move to a different timezone.

Uploading the Code