A small clock that displays the time in words in Dutch, English, French and
German.
The clock is able to receive time via NTP from the internet.
Settings can be controlled via a webpage, PC and Bluetooth LE.
Also info here:
On my home page for the latest info.
The clock is built with an ESP32-C3-12F kit.
The software is written with the Arduino IDE 1.8.19.
The software contains coding to use:
1 ILI9314 colour display
2 BLE nRF UART connection with a phone with an option to send strings longer than 20 bytes
3 Time zone corrected time with daylight savings from a NTP server via WIFI
4 RGBCW LED control on the MCU board
5 RTC for time keeping when off line
6 LDR analogue readings and control of display intensity
7 Storage of the settings in the ESP32-C3 SPIFSS Flash memor
8 Menu driven control of preferences with serial monitor, BLE and WIFI-html page
9 Four languages to display time
10 SK6812 RGBW /WS2812 RGB LED strip support to make a word clock
11 Analog clock.
12 OTA. Upgrade the software over the air without USB-cable
The ESP32-C3-12F is a cheap, versatile Micro Computer Unit (MCU).
Competitors at this moment, end 2022, I have played with are the Arduino MKR1010
and IOT33, the Arduino RP2040 Connect and Raspberry Pico W.
The RP2040 Connect is my favorite at the moment while it pins are compatible with the Arduino
Nano / Every and my designed printed circuit boards (PCB) can still be used, it has a lot a memory and more than enough speed
for my projects
A kickstarter project using the
ESP32-C3 with an OLED display forced me to study this architecture.
A piece of cake was my first thought and I started to convert the word clock
into the ESP-C3.
Source code for an Arduino also compiles and uploads with the Arduino IDE
in a ESP32-C3.
But many libraries are different and changing from 5V and 3.3V was needed.
The result is the program and design below.
Everything works and the time is displayed in words in the display.
The program's origin was a word
clock running with an ATMEGA328 processor. The software was then converted
to be used with SK6812 RGBW orWS2812
RGB LED-strips. Time was received with a DCF77 receiver.
This ESP32-C3 program is able to connect to a NTP service on the internet and is
attached to an ILI9314 display to print the time as text. The ILI9341 colour display is, around €10, very cheap
but not very fast. For this clock it is not an issue. When no connection is made
the clock runs on the internal RTC but will drift.
Settings can be changed via Bluetooth on a phone or with a webpage in a browser.
No cloud service is used or needed to operate this clock.
Materials
- ESP32-C3-12F
- ILI9341 display
- LDR (Light Dependent Resistor) type GL5516 or GL5528
- Resistors 1 kOhm, 10 kOhm and optional 22 kOhm
- 2N2222 or 2N3906 PNP transistor
- For IOS:
BLE
Serial Pro. (Turn on Fast BLE with option Z in the menu)
- For Android :
Serial Bluetooth terminal. (Turn off (default) Fast BLE)
The program
'ESP32C3-WordClockV009.ino' or newer can be uploaded in the
ESP32-C3-12F with the Arduino IDE 1.8.19 or newer. The Arduino IDE 2.0.2
(November 2022) was not able to compile this program due to a bug in the IDE.
The libraries needed to compile can be installed with the Arduino IDE (Tools -> Manage libraries) or be copied from the V009LibsAndBuilt.zip in the folder 'libraries' located in the sketch book location folder of the IDE.
Add the string in Additional Boards Manager URLs in File-> Preference of the IDE
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Restart the IDE and install the ESP32 boards.
Choose the 'ESP32C3 Dev Module' as board and set the partition scheme to 'huge'
in the IDE menu --> Tools.
If the program compiles without errors and uploads into the ESP-C3 the
hardware can be connected to the board.
Connect the DC/RS, RST, MOSI, SCK to respectively GPIO pins 06, 07, 08 and 09.
MISO is not used because no data comes back from the display.
CS is connected to GND.
To control the brightness of a connected LED-strip or the back light of the
display a LDR measures the
luminosity and dims the LEDs or back light accordingly by PWM on the pin that
powers the back light or changes the RGBW LED intensity in the software.
If no LDR is attached
set the minimum light intensity to 254 in the menu and the maximum to 255.
The back light of the ILI9341 uses 50 - 100 mA and the pins of the ESP32-C3-12F
supply 12mA (or 40mA?). Therefore a 2N2222 PNP transistor is used. A BC327 did
not work. Probably 3V3 is too less to switch the transistor. A 2N3906 may also
work.
Connect the 1 kOhm resistor to pin GPIO 01 that controls the intensity of the
backlight.
The LDR is connected via a 10 - 22 kOhm LDR to ground. The pin A2 is connected to GPIO 02.
With option K in the menu display
of the LDR readings are printed every second. With the options minimum, maximum
and slope in the menu the light intensity of the display can be controlled
More about the LDR and it types
Connecting the LDR to GPIO 00
failed. The pin did not go low to 0V. It is used for WIFI?
Almost all the pins are used now.
GPIO 03, 04, 05, 18 and 19 are used for the LEDs on
the MCU. GPIO 20 and 21 are probably used for the serial USB connection.
When the MCU is started and running properly the LED on the
board will pulse red every second.
When connected to WIFI the same led will also pulse green.
Press the
the top right button to see the IP-address, time and date of the clock.
Date and IP-address will disappear as a new minute starts.
Enter the IP-address in a browser or connect
via Bluetooth and send the character 'I' to see for the menu.
In the menu the name of the router to connect to, the SSID, and its password can
be entered.
If the clock is connected to the internet it will seek contact with a time
server. (NTP connection can be turned off in the menu).
The time zone is set to UTC+1 Amsterdam but can be changed in the menu.
To connect to a WIFI network a SSID and password must be entered.
There are a few methods:
1. Connect the MCU with a serial cable to a PC and use a serial terminal. I
use the Arduino IDE or
Termite as serial terminal.
Sending the character 'I' for information will display the menu followed with the actual
settings of several preferences.
HTML page on iPhone. | Termite Terminal on a PC |
2. USE the BLE nRF connection with an UART serial terminal app
to control it with your mobile phone or tablet.
Start the
app and find the MCU in the list of devices and connect to it. You
can change it's beacon name in the menu with option C. To change the SSID and password: |
___________________________________ A SSID B Password C BLE beacon name D Date (D15012021) T Time (T132145) E Timezone (E<-02>2 or E<+01>-1) Make own colour of: (Hex RRGGBB) F Font G Dimmed font H Bkgnd I To print this Info menu K LDR reads/sec toggle On/Off L L0 = NL, L1 = UK, L2 = DE L3 = FR, L4 = Wheel N Display off between Nhhhh (N2208) O Display toggle On/Off Q Display colour choice (Q0-6) Q0 Yellow Q1 hourly Q2 White Q3 All Own Q4 Own Q5 Wheel Q6 Digital display R Reset settings @ = Reset MCU Light intensity (1-250) S=Slope V=Min U=Max (S80 L5 M200) W=WIFI X=NTP Y=BLE Z=Fast BLE Ed Nieuwenhuys Nov 2022 ___________________________________ Display off: 00h - 00h Display choice: Yellow SSID: FRITZ!BoxEd BLE name: ESPWordClock IP-address: 192.168.178.31 Timezone:CET-1CEST,M3.5.0,M10.5.0/3 WIFI=On NTP=On BLE=On FastBLE=On Language choice: Rotate language Software: ESp32C3-WordClockV009.ino 09:27:22 ___________________________________ |
Menu shown in serial output. |
If no WIFI is not used check at the bottom of the menu if WIFI is OFF.
The clock will start much quicker because it
will not try to connect.
As mentioned before the clock can be controlled with the WIFI webpage or BLE
UART terminal app.
When the clock is connected to WIFI the IP-address is displayed in the Digital display.
Enter this IP-address numbers and dots (for example: 192.168.178.31) in the browser of your mobile or PC where you type
your internet addresses (URL).
Or
Open the BLE terminal app. Look for the WordClock to connect to and connect.
BLE connection can be made with my app
BLE Serial
pro on the
app
store for Apple IOS devices.
For Android
nRF UART terminal program and
Serial Bluetooth terminal.
Unfortunately these Android apps
can not read strings longer than 20 characters.
If you see a garbled menu enter and send the character 'Z' to select the slower
transmission mode.
Settings are set by entering the first character of a command following by
parameters if necessary.
For example to set the colours of the characters in the display
to white enter: Q2
To shown random all four languages every minute send L4.
Set the time by entering T130245. (130245 will also work)
Turn off WIFI by sending a W.
Reset the MCU with the character @.
Reset to default setting by send R.
In the BLE connection the SSID and password will be shown.
HTML page | BLE menu |
___________________________________ A SSID B Password C BLE beacon name D Date (D15012021) T Time (T132145) E Timezone (E<-02>2 or E<+01>-1) Make own colour of: (Hex RRGGBB) F Font G Dimmed font H Bkgnd I To print this Info menu K LDR reads/sec toggle On/Off L L0 = NL, L1 = UK, L2 = DE L3 = FR, L4 = Wheel N Display off between Nhhhh (N2208) O Display toggle On/Off Q Display colour choice (Q0-6) Q0 Yellow Q1 hourly Q2 White Q3 All Own Q4 Own Q5 Wheel Q6 Digital display R Reset settings @ = Reset MCU Light intensity (1-250) S=Slope V=Min U=Max (S80 L5 M200) W=WIFI X=NTP Y=BLE Z=Fast BLE Ed Nieuwenhuys Nov 2022 ___________________________________ Display off: 00h - 00h Display choice: Yellow SSID: FRITZ!BoxEd BLE name: ESPWordClock IP-address: 192.168.178.31 Timezone:CET-1CEST,M3.5.0,M10.5.0/3 WIFI=On NTP=On BLE=On FastBLE=On Language choice: Rotate language Software: ESp32C3-WordClockV009.ino 09:27:22 ___________________________________
With the menu many preferences can be set.
These preferences are permanently stored in the ESP32-C3 SPIFFS-storage space.
Enter the first character in the menu of the item to be changed followed with the parameter.
For most entries upper and lower case are identical.
A SSID B Password C BLE beacon name
Change the name of the SSID of the router to be connected to.
aFRITZ!BoxEd or AFRITZ!BoxEd
Then enter the password. For example: BSecret_pass
Restart the MCU by sending @.
Entering a single 'b' will show the used password. This Easter egg can can used
to check if a valid password was entered
D Set Date and T Set Time
If you are not connected to WIFI you have to set the time and date by hand.
For example enter: D06112022 to set the date to 6 November 2022.
Enter for example T132145 (or 132145 , or t132145) to set the time to 45 seconds and 21 minutes past one o'clock.
E Set Timezone E<-02>2 or E<+01>-1
At the bottom of this page you can find the time zones used in 2022.
It is a rather complicated string and it is therefore wise to copy it.
Let's pick one if you happen to live here: Antarctica/Troll,"<+00>0<+02>-2,M3.5.0/1,M10.5.0/3"
Copy the string between the " " 's and send it starting with an 'E' or 'e' in front.
E<+00>0<+02>-2,M3.5.0/1,M10.5.0/3
Time zones and daylight savings should be ended and replaced by one universal date and time for the whole planet cq universe. But that is my opinion.
Make own colour of: (Hex RRGGBB)
F Font G Dimmed font H Bkgnd
You can set the colours of the highlighted and dimmed characters and the background.
The time is shown with the colour defined when Display choice Q3 or Q4
is chosen and the rest of the not highlighted characters are coloured with the settings
from Dimmed
font.
The format to be entered is hexadecimal. 0123456789ABCDEF are the character that
can be used.
The command is 2 digits for Red followed with two
digits for Green and ending
with two digits for Blue.
To colour the characters intense red enter FF0000 prefixed with the
character F, G
or H.
To set the background to intense blue enter: H0000FF
To set the dimmed character to dark gray enter for example: G191919.
You get
gray if red, green and blue has the same intensity.
I To print this Info menu
Print the menu to Bluetooth and the serial monitor
when connected with an USB-cable.
K LDR reads/sec toggle On/Off
Prints the LDR-readings and the calculated intensity output.
L L0 = NL, L1 = UK, L2 = DE, L3 = FR, L4 = Wheel
You can choose between four languages to display or show them randomly every
minute.
N Display off between Nhhhh (N2208)
With N2208 the display will be turned off between 22:00 and
08:00.
O Display toggle On/Off
O toggles the display off and on.
Q Display colour choice (Q0-6)
Q0 Yellow Q1 hourly
Q2 White Q3 All Own
Q4 Own Q5 Wheel
Q6 Digital display
Q0 will show the time with yellow words.
Q1 will show every hour another colour.
Q2 shows all the texts white.
Q3 and Q4 uses you own defined colours.
Q5 will follow rainbow colours every minute.
Q6 is the digital display with the IP-address and date until seconds are 00.
The selected choice is displayed at the bottom of the menu.
Send an 'I' to display the latest's settings
R Reset settings
R will set all preferences to default settings and clears the SSID and password.
Light intensity (1-250)
S=Slope V=Min U=Max
(S100 L5 M200)
The settings of the ESP32C3 board is as follows.
Partition scheme is huge.
Remember to install the ESP32 boards as explained above in the chapter Materials
Program explanation
The program uses the following standard libraries.
// ESP32-C3 Includes defines and initialisations#include <NimBLEDevice.h> // For BLE communication https://github.com/h2zero/NimBLE-Arduino #include <ESPNtpClient.h> // https://github.com/gmag11/ESPNtpClient #include <WiFi.h> // Used for NTP time and web page #include <AsyncTCP.h> // Used for webpage https://github.com/me-no-dev/ESPAsyncWebServer #include <ESPAsyncWebServer.h> // Used for webpage https://github.com/me-no-dev/ESPAsyncWebServer #include <Preferences.h> // for storage in SPIFFS #include "Colors.h" // Definition of the colour list
Colors.h is included in the program as a TAB in
the IDE. It contains color names and it associated RGB values
The other TAB is the web page to display in the
browser.
The #include "Webpage.h" to load the webpage is a few lines further in the code
I made the web page in the free 'Microsoft Expression Web 4'. It is not
maintained anymore but has more than enough functionalities for our purposes.
To copy the code from the MS-Expression:
In the bottom line of the window of MS-Expression click 'Split'.
In the upper half the raw HTML Code is displayed and in the bottom half the
Design window.
Copy in the Code window all the HTML
code
Go to the Arduino IDE and paste it in the webpage.h TAB between:
R"rawliteral( ... and ...
)rawliteral";
Or copy the the code from the webpage.h into
MSexpression Code area and redesign the page as you like
A long list if definitions and initialisations follows.
I am not a fan of passing all the variables to and from functions and like to
keep them global in one program list.
If you write a program with other people it is good practice not to use
too many globals
but this program is in one large listing, for the same reason to keep it simple.
I grouped all the variables per application to keep track where they are used.
With a simple find it is easy in this one great listing to find the back.
To print the time as text and colour with the proper LEDs or characters, the
words and its position in a string of LEDs or text are defined.
The defines executes the function ColorLeds with its proper parameters.
Further in the program in the function void Dutch(void), void
English(void) et cetera it becomes clear why these defines are so useful and
handy.
... #define PRECIES ColorLeds("precies", 16, 22, LetterColor); #define MTIEN ColorLeds("tien", 25, 28, LetterColor); #define KWART ColorLeds("kwart", 32, 36, LetterColor); #define VOOR ColorLeds("voor", 38, 41, LetterColor); ...This is the initialisation of the storage area to store the struct EEPROMstorage.
The Struct with all its settings is saved in one command to permanent memory or SD
Preferences FLASHSTOR;
struct EEPROMstorage { // Data storage in EEPROM to maintain them after power loss
byte DisplayChoice = 0;
...
char BLEbroadcastName[30]; // Name of the BLE beacon
char Timezone[50];
int Checksum = 0;
} Mem;
The variables are adressed with a short name Mem.
For example Mem.DisplayChoice = 3;
The Struct EEPROMstorage
is stored in the function StoreStructInFlashMemory
and retrieved in the function GetStructFromFlashMemory
The menu displayed in the serial monitor and BLE app is defined here.
String may not be longer than 40 characters what can be checked with the 'ruler'
string.
// Menu //0 1 2 3 4 //1234567890123456789012345678901234567890 char menu[][40] = { "A SSID B Password C BLE beacon name", "D Date (D15012021) T Time (T132145)", ... "W=WIFI, X=NTP, Y=BLE, Z=Fast BLE", "Nov 2022" };
The Setup happens here:
//-------------------------------------------- // ESP32-C3 Setup //-------------------------------------------- void setup() { Serial.begin(115200); Tekstprintln("Serial started"); // Setup the serial port to 115200 baud // ... ... msTick = LastButtonTime = millis(); }
The loop is kept almost empty and the program starts in Every SeccondCheck.
There is nothing in this program that should be executes every millisecond or less
//-------------------------------------------- // ESP32-C3 Loop //-------------------------------------------- void loop() { EverySecondCheck(); }The following routines check if something must happen every second, minute, hour and day.
This flow handling of the program keeps the processor for 99% free for other uses.
In this program that is almost nothing but for other purposes this can be needed.
Use delays very sparsely.
In the Bluetooth and Serial communication functions some short delays are used that are essential
here but the program only runs here when there is an actual communication.
(An alternative method could have been the use of an interrupt every second and an empty loop)
Writing or reading to ports consumes a lot of processor time
To let the LEDs flash like a heartbeat.
With %100==0 the port is written every 100 msec.
The LEDs are very bright therefore only a maximum of 12 bits of the 255 are send to the LED.
//-------------------------------------------- // CLOCK Update routine done every second //-------------------------------------------- void EverySecondCheck(void) { static int lumi=0; (msLeap>500?lumi=(1000-msLeap)/40:lumi=msLeap/40); if (msLeap%100==0){ SetStatusLED(-1,-1,12-lumi,lumi*WIFIConnected,-1); } ... if (timeinfo.tm_min != lastminute) EveryMinuteUpdate(); // Enter the every minute routine after one minute ... } //-------------------------------------------- // CLOCK Update routine done every minute //-------------------------------------------- void EveryMinuteUpdate(void) { ... if(timeinfo.tm_hour != lasthour) EveryHourUpdate(); } //-------------------------------------------- // CLOCK Update routine done every hour //-------------------------------------------- void EveryHourUpdate(void) { ... if (timeinfo.tm_mday != lastday) EveryDayUpdate(); } // // //------------------------------------------------------------------------------ // CLOCK Update routine done every day //------------------------------------------------------------------------------ void EveryDayUpdate(void) { ... }
Check for serial input from the serial monitor and pass the command to ReworkInputString()
//-------------------------------------------- // Common check for serial input //-------------------------------------------- void SerialCheck(void) { ... ReworkInputString(SerialString+"\n"); // Rework ReworkInputString(); ... }
Restore all the default values.
//------------------------------------------------------------------------------ // Common Reset to default settings //------------------------------------------------------------------------------ void Reset(void) { Mem.Checksum = 25065; ... }Common common print routines.
To keep all the print commands in one places it is easy to change these routines for other boards with a different 'slang'.
//-------------------------------------------- // Common common print routines //-------------------------------------------- void Tekstprint(char const tekst[]) { if(Serial) Serial.print(tekst); SendMessageBLE(tekst);sptext[0]=0; } void Tekstprintln(char const tekst[]) { sprintf(sptext,"%s\n",tekst); Tekstprint(sptext); } void TekstSprint(char const tekst[]) { printf(tekst); sptext[0]=0;} // printing for Debugging purposes in serial monitor void TekstSprintln(char const tekst[]){ sprintf(sptext,"%s\n",tekst); TekstSprint(sptext); } //------------------------------------------------------------------------------ // Common Constrain a string with integers // The value between the first and last character in a string is returned between the low and up bounderies //------------------------------------------------------------------------------ int SConstrainInt(String s,byte first,byte last,int low,int up){return constrain(s.substring(first, last).toInt(), low, up);} int SConstrainInt(String s,byte first, int low,int up){return constrain(s.substring(first).toInt(), low, up);}The setup of storage space and control of the validity of the settings.
In the checksum is invalid a reset() will restore the default settings
//-------------------------------------------- // Common Init and check contents of EEPROM //-------------------------------------------- void InitStorage(void)Store and retrieve the settings from SPIFFS or SD or EEPROM
the several possibilities are store here. EEPROM becomes outdated but still works.
-------------------------------------------- // COMMON Store mem.struct in FlashStorage or SD //-------------------------------------------- void StoreStructInFlashMemory(void) { } //-------------------------------------------- // COMMON Get data from FlashStorage Preferences.h //-------------------------------------------- void GetStructFromFlashMemory(void) { }Get the commands from the strings entered in the serial monitor, Bluetooth or the webpage
and perform the command in an action.
The menu letters are almost used but it possible to distinguish between lower and uppercase when more commands are needed.
(That is why there is no conversion to UpperCase or LowerCase).
/-------------------------------------------- // CLOCK Input from Bluetooth or Serial //-------------------------------------------- void ReworkInputString(String InputString) { .... switch (InputString[0]) { case 'A': case 'a': if (InputString.length() >5 ) ...Read the LDR and divide it with 16 to get the values from 0 - 4096 between 0 and 255.
Not all boards has a 12 bit AD converter like.
//-------------------------------------------- // LDR reading are between 0 and 255. // ESP32 analogue read is between 0 - 4096 -- is: 4096 / 8 //-------------------------------------------- int ReadLDR(void) { return analogRead(PhotoCellPin)/16;}
Control the color and intensity of the LED on the boards in one command
-1 leaves the LED unchanged. Values between 0 and 255.
//-------------------------------------------- // CLOCK Control the LEDs on the ESP32 // -1 leaves intensity untouched //-------------------------------------------- void SetStatusLED(int WW, int CW, int Re, int Gr, int Bl) {
This function reads the analog port and calculates an output intensity to a display or LED-strip
The readings are squared to get a hyperbolic curve that resembles you eye correction for dark and light better than a linear range
It works wonderfully well.
//-------------------------------------------- // LED Dim the leds measured by the LDR and print values // LDR reading are between 0 and 255. The Brightness send to the LEDs is between 0 and 255 //-------------------------------------------- void DimLeds(bool print) { ... }
Here we print and colour the characters in the display or light up to proper LEDs in a String of RGB(W) LEDs.
The #define executes this functions with the proper parameters for every language and prints the texts in the serial connections.
#define QUARTER ColorLeds("quarter", 32, 38, LetterColor);
//-------------------------------------------- / / LED Set color for LED. //-------------------------------------------- void ColorLeds(char const *Texkst, int FirstLed, int LastLed, uint32_t RGBColor) { }
To convert all characters to uppercase in a character array.
//-------------------------------------------- // COMMON String upper //-------------------------------------------- void to_upper(char* string)
Every display or strip uses other commands to regulate the brightness Therefore for all LED/Display commands a function
//------------------------------------------------------------------------------ // LED Set brightness of backlight //------------------------------------------------------------------------------ void SetBrightnessLeds(byte Bright) { SetBackLight(Bright); // Set brightness of LEDs }
A place to turn off all LEDs or clear the display
/-------------------------------------------- // LED Clear the character string //-------------------------------------------- void LedsOff(void)
Here are all the colours are set for the characters are set.
The function has changed often and it's name describes it's original purpose
For backward compatibility it's name is unchanged.
/--------------------------------------------
// LED Set second color
//--------------------------------------------
void SetSecondColour(void)
{ switch (Mem.DisplayChoice) { case DEFAULTCOLOUR: LetterColor = C_YELLOW;
...
SWversion() prints the menu and the settings of sevaral preferences
The function has changed often and it's name describes it's original purpose
For backward compatibility it's name is unchanged.
PrintLine() prints the horizontal lines in the menu.
//-------------------------------------------- // CLOCK Version and preferences info //-------------------------------------------- void SWversion(void) { #define FILENAAM (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) PrintLine(35); for (uint8_t i = 0; i < sizeof(menu) / sizeof(menu[0]); Tekstprintln(menu[i++])); ... PrintLine(35); }void PrintLine(byte Lengte) {... }
Displaytime() prints the time to the serial monitor as text and control wiich language is printed.
It also sends the appropriate sequence of colour and intensities to a RGB(W) LED strip.
//-------------------------------------------- // CLOCK Say the time and load the LEDs // with the proper colour and intensity //-------------------------------------------- void Displaytime(void) { .. switch(Language) // Print all the character in the backgound color, a sort of ClearScreen { case 0: strncpy(Template,"HETVISOWASOVIJFQPRECIESZSTIENKPFKWARTSVOORSOVERAHALFSMIDDERTVIJFATWEESOEENOXVIERELFQTIENKTWAALFBHDRIECNEGENACHTFZESVZEVENOENVUUR",129); ColorLeds(Template,0,127, Mem.DimmedLetter); Dutch(); Print_tijd(); break; case 1: ... }
A series of functions to get and store time.
The NTP time server puts the retrieved time in the standard C time structures.
/--------------------------- Time functions -------------------------- void GetTijd(byte printit) void Print_RTC_tijd(void) void PrintNTP_tijd(void) void PrintUTCtijd(void) void Print_tijd(void) void SetRTCTime(void)
Convert a HEX string to a unsigned 32-bits integer
/-------------------------------------------- // CLOCK Convert Hex to uint32 //-------------------------------------------- uint32_t HexToDec(String hexString)There is also a lot of slang in languages.
'Half nine' sometimes means 8:30 but can also be 9:30. (-:
/--------------------------------------------
// CLOCK Dutch clock display
//--------------------------------------------
void Dutch(void)
{
HET; // HET is always on
switch (timeinfo.tm_min)
{
case 0: IS; PRECIES; break;
case 1: IS; break;
case 2:
case 3: WAS; break;
case 4:
case 5:
...
void English(void)
void German(void)
void French(void)
The Bluetooth Low Energy Nordic nRF.. functions.
They are different from the Texas instrument CC2540/CC2541 that is used in other chipsets like the HM-10, HM16, JDY-08 et cetera.
More here on Instructables
/----------------------------- // BLE SendMessage by BLE Slow in packets of 20 chars //------------------------------ void SendMessageBLE(std::string Message)/----------------------------- // BLE Start BLE Classes //------------------------------ class MyServerCallbacks: public BLEServerCallbacks
/----------------------------- // BLE Start BLE Service //------------------------------ void StartBLEService(void)
/----------------------------- // BLE CheckBLE //------------------------------ void CheckBLE(void)
Functions to start a WIFI connection and use the webpage
/-------------------------------------------- // WIFI WEBPAGE //-------------------------------------------- void StartWIFI_NTP(void) /-------------------------------------------- // WIFI WEBPAGE //-------------------------------------------- void WebPage(void) /-------------------------------------------- // WIFI WEBPAGE Not found message //-------------------------------------------- void notFound(AsyncWebServerRequest *request)
@Ed Nieuwenhuys, May 2023
Copy the text between the quotes and paste them after the character E
Africa/Abidjan,"GMT0" Africa/Accra,"GMT0" Africa/Addis_Ababa,"EAT-3" Africa/Algiers,"CET-1" Africa/Asmara,"EAT-3" Africa/Bamako,"GMT0" Africa/Bangui,"WAT-1" Africa/Banjul,"GMT0" Africa/Bissau,"GMT0" Africa/Blantyre,"CAT-2" Africa/Brazzaville,"WAT-1" Africa/Bujumbura,"CAT-2" Africa/Cairo,"EET-2" Africa/Casablanca,"<+01>-1" Africa/Ceuta,"CET-1CEST,M3.5.0,M10.5.0/3" Africa/Conakry,"GMT0" Africa/Dakar,"GMT0" Africa/Dar_es_Salaam,"EAT-3" Africa/Djibouti,"EAT-3" Africa/Douala,"WAT-1" Africa/El_Aaiun,"<+01>-1" Africa/Freetown,"GMT0" Africa/Gaborone,"CAT-2" Africa/Harare,"CAT-2" Africa/Johannesburg,"SAST-2" Africa/Juba,"CAT-2" Africa/Kampala,"EAT-3" Africa/Khartoum,"CAT-2" Africa/Kigali,"CAT-2" Africa/Kinshasa,"WAT-1" Africa/Lagos,"WAT-1" Africa/Libreville,"WAT-1" Africa/Lome,"GMT0" Africa/Luanda,"WAT-1" Africa/Lubumbashi,"CAT-2" Africa/Lusaka,"CAT-2" Africa/Malabo,"WAT-1" Africa/Maputo,"CAT-2" Africa/Maseru,"SAST-2" Africa/Mbabane,"SAST-2" Africa/Mogadishu,"EAT-3" Africa/Monrovia,"GMT0" Africa/Nairobi,"EAT-3" Africa/Ndjamena,"WAT-1" Africa/Niamey,"WAT-1" Africa/Nouakchott,"GMT0" Africa/Ouagadougou,"GMT0" Africa/Porto-Novo,"WAT-1" Africa/Sao_Tome,"GMT0" Africa/Tripoli,"EET-2" Africa/Tunis,"CET-1" Africa/Windhoek,"CAT-2" America/Adak,"HST10HDT,M3.2.0,M11.1.0" America/Anchorage,"AKST9AKDT,M3.2.0,M11.1.0" America/Anguilla,"AST4" America/Antigua,"AST4" America/Araguaina,"<-03>3" America/Argentina/Buenos_Aires,"<-03>3" America/Argentina/Catamarca,"<-03>3" America/Argentina/Cordoba,"<-03>3" America/Argentina/Jujuy,"<-03>3" America/Argentina/La_Rioja,"<-03>3" America/Argentina/Mendoza,"<-03>3" America/Argentina/Rio_Gallegos,"<-03>3" America/Argentina/Salta,"<-03>3" America/Argentina/San_Juan,"<-03>3" America/Argentina/San_Luis,"<-03>3" America/Argentina/Tucuman,"<-03>3" America/Argentina/Ushuaia,"<-03>3" America/Aruba,"AST4" America/Asuncion,"<-04>4<-03>,M10.1.0/0,M3.4.0/0" America/Atikokan,"EST5" America/Bahia,"<-03>3" America/Bahia_Banderas,"CST6CDT,M4.1.0,M10.5.0" America/Barbados,"AST4" America/Belem,"<-03>3" America/Belize,"CST6" America/Blanc-Sablon,"AST4" America/Boa_Vista,"<-04>4" America/Bogota,"<-05>5" America/Boise,"MST7MDT,M3.2.0,M11.1.0" America/Cambridge_Bay,"MST7MDT,M3.2.0,M11.1.0" America/Campo_Grande,"<-04>4" America/Cancun,"EST5" America/Caracas,"<-04>4" America/Cayenne,"<-03>3" America/Cayman,"EST5" America/Chicago,"CST6CDT,M3.2.0,M11.1.0" America/Chihuahua,"MST7MDT,M4.1.0,M10.5.0" America/Costa_Rica,"CST6" America/Creston,"MST7" America/Cuiaba,"<-04>4" America/Curacao,"AST4" America/Danmarkshavn,"GMT0" America/Dawson,"MST7" America/Dawson_Creek,"MST7" America/Denver,"MST7MDT,M3.2.0,M11.1.0" America/Detroit,"EST5EDT,M3.2.0,M11.1.0" America/Dominica,"AST4" America/Edmonton,"MST7MDT,M3.2.0,M11.1.0" America/Eirunepe,"<-05>5" America/El_Salvador,"CST6" America/Fortaleza,"<-03>3" America/Fort_Nelson,"MST7" America/Glace_Bay,"AST4ADT,M3.2.0,M11.1.0" America/Godthab,"<-03>3<-02>,M3.5.0/-2,M10.5.0/-1" America/Goose_Bay,"AST4ADT,M3.2.0,M11.1.0" America/Grand_Turk,"EST5EDT,M3.2.0,M11.1.0" America/Grenada,"AST4" America/Guadeloupe,"AST4" America/Guatemala,"CST6" America/Guayaquil,"<-05>5" America/Guyana,"<-04>4" America/Halifax,"AST4ADT,M3.2.0,M11.1.0" America/Havana,"CST5CDT,M3.2.0/0,M11.1.0/1" America/Hermosillo,"MST7" America/Indiana/Indianapolis,"EST5EDT,M3.2.0,M11.1.0" America/Indiana/Knox,"CST6CDT,M3.2.0,M11.1.0" America/Indiana/Marengo,"EST5EDT,M3.2.0,M11.1.0" America/Indiana/Petersburg,"EST5EDT,M3.2.0,M11.1.0" America/Indiana/Tell_City,"CST6CDT,M3.2.0,M11.1.0" America/Indiana/Vevay,"EST5EDT,M3.2.0,M11.1.0" America/Indiana/Vincennes,"EST5EDT,M3.2.0,M11.1.0" America/Indiana/Winamac,"EST5EDT,M3.2.0,M11.1.0" America/Inuvik,"MST7MDT,M3.2.0,M11.1.0" America/Iqaluit,"EST5EDT,M3.2.0,M11.1.0" America/Jamaica,"EST5" America/Juneau,"AKST9AKDT,M3.2.0,M11.1.0" America/Kentucky/Louisville,"EST5EDT,M3.2.0,M11.1.0" America/Kentucky/Monticello,"EST5EDT,M3.2.0,M11.1.0" America/Kralendijk,"AST4" America/La_Paz,"<-04>4" America/Lima,"<-05>5" America/Los_Angeles,"PST8PDT,M3.2.0,M11.1.0" America/Lower_Princes,"AST4" America/Maceio,"<-03>3" America/Managua,"CST6" America/Manaus,"<-04>4" America/Marigot,"AST4" America/Martinique,"AST4" America/Matamoros,"CST6CDT,M3.2.0,M11.1.0" America/Mazatlan,"MST7MDT,M4.1.0,M10.5.0" America/Menominee,"CST6CDT,M3.2.0,M11.1.0" America/Merida,"CST6CDT,M4.1.0,M10.5.0" America/Metlakatla,"AKST9AKDT,M3.2.0,M11.1.0" America/Mexico_City,"CST6CDT,M4.1.0,M10.5.0" America/Miquelon,"<-03>3<-02>,M3.2.0,M11.1.0" America/Moncton,"AST4ADT,M3.2.0,M11.1.0" America/Monterrey,"CST6CDT,M4.1.0,M10.5.0" America/Montevideo,"<-03>3" America/Montreal,"EST5EDT,M3.2.0,M11.1.0" America/Montserrat,"AST4" America/Nassau,"EST5EDT,M3.2.0,M11.1.0" America/New_York,"EST5EDT,M3.2.0,M11.1.0" America/Nipigon,"EST5EDT,M3.2.0,M11.1.0" America/Nome,"AKST9AKDT,M3.2.0,M11.1.0" America/Noronha,"<-02>2" America/North_Dakota/Beulah,"CST6CDT,M3.2.0,M11.1.0" America/North_Dakota/Center,"CST6CDT,M3.2.0,M11.1.0" America/North_Dakota/New_Salem,"CST6CDT,M3.2.0,M11.1.0" America/Nuuk,"<-03>3<-02>,M3.5.0/-2,M10.5.0/-1" America/Ojinaga,"MST7MDT,M3.2.0,M11.1.0" America/Panama,"EST5" America/Pangnirtung,"EST5EDT,M3.2.0,M11.1.0" America/Paramaribo,"<-03>3" America/Phoenix,"MST7" America/Port-au-Prince,"EST5EDT,M3.2.0,M11.1.0" America/Port_of_Spain,"AST4" America/Porto_Velho,"<-04>4" America/Puerto_Rico,"AST4" America/Punta_Arenas,"<-03>3" America/Rainy_River,"CST6CDT,M3.2.0,M11.1.0" America/Rankin_Inlet,"CST6CDT,M3.2.0,M11.1.0" America/Recife,"<-03>3" America/Regina,"CST6" America/Resolute,"CST6CDT,M3.2.0,M11.1.0" America/Rio_Branco,"<-05>5" America/Santarem,"<-03>3" America/Santiago,"<-04>4<-03>,M9.1.6/24,M4.1.6/24" America/Santo_Domingo,"AST4" America/Sao_Paulo,"<-03>3" America/Scoresbysund,"<-01>1<+00>,M3.5.0/0,M10.5.0/1" America/Sitka,"AKST9AKDT,M3.2.0,M11.1.0" America/St_Barthelemy,"AST4" America/St_Johns,"NST3:30NDT,M3.2.0,M11.1.0" America/St_Kitts,"AST4" America/St_Lucia,"AST4" America/St_Thomas,"AST4" America/St_Vincent,"AST4" America/Swift_Current,"CST6" America/Tegucigalpa,"CST6" America/Thule,"AST4ADT,M3.2.0,M11.1.0" America/Thunder_Bay,"EST5EDT,M3.2.0,M11.1.0" America/Tijuana,"PST8PDT,M3.2.0,M11.1.0" America/Toronto,"EST5EDT,M3.2.0,M11.1.0" America/Tortola,"AST4" America/Vancouver,"PST8PDT,M3.2.0,M11.1.0" America/Whitehorse,"MST7" America/Winnipeg,"CST6CDT,M3.2.0,M11.1.0" America/Yakutat,"AKST9AKDT,M3.2.0,M11.1.0" America/Yellowknife,"MST7MDT,M3.2.0,M11.1.0" Antarctica/Casey,"<+11>-11" Antarctica/Davis,"<+07>-7" Antarctica/DumontDUrville,"<+10>-10" Antarctica/Macquarie,"AEST-10AEDT,M10.1.0,M4.1.0/3" Antarctica/Mawson,"<+05>-5" Antarctica/McMurdo,"NZST-12NZDT,M9.5.0,M4.1.0/3" Antarctica/Palmer,"<-03>3" Antarctica/Rothera,"<-03>3" Antarctica/Syowa,"<+03>-3" Antarctica/Troll,"<+00>0<+02>-2,M3.5.0/1,M10.5.0/3" Antarctica/Vostok,"<+06>-6" Arctic/Longyearbyen,"CET-1CEST,M3.5.0,M10.5.0/3" Asia/Aden,"<+03>-3" Asia/Almaty,"<+06>-6" Asia/Amman,"EET-2EEST,M2.5.4/24,M10.5.5/1" Asia/Anadyr,"<+12>-12" Asia/Aqtau,"<+05>-5" Asia/Aqtobe,"<+05>-5" Asia/Ashgabat,"<+05>-5" Asia/Atyrau,"<+05>-5" Asia/Baghdad,"<+03>-3" Asia/Bahrain,"<+03>-3" Asia/Baku,"<+04>-4" Asia/Bangkok,"<+07>-7" Asia/Barnaul,"<+07>-7" Asia/Beirut,"EET-2EEST,M3.5.0/0,M10.5.0/0" Asia/Bishkek,"<+06>-6" Asia/Brunei,"<+08>-8" Asia/Chita,"<+09>-9" Asia/Choibalsan,"<+08>-8" Asia/Colombo,"<+0530>-5:30" Asia/Damascus,"EET-2EEST,M3.5.5/0,M10.5.5/0" Asia/Dhaka,"<+06>-6" Asia/Dili,"<+09>-9" Asia/Dubai,"<+04>-4" Asia/Dushanbe,"<+05>-5" Asia/Famagusta,"EET-2EEST,M3.5.0/3,M10.5.0/4" Asia/Gaza,"EET-2EEST,M3.4.4/48,M10.5.5/1" Asia/Hebron,"EET-2EEST,M3.4.4/48,M10.5.5/1" Asia/Ho_Chi_Minh,"<+07>-7" Asia/Hong_Kong,"HKT-8" Asia/Hovd,"<+07>-7" Asia/Irkutsk,"<+08>-8" Asia/Jakarta,"WIB-7" Asia/Jayapura,"WIT-9" Asia/Jerusalem,"IST-2IDT,M3.4.4/26,M10.5.0" Asia/Kabul,"<+0430>-4:30" Asia/Kamchatka,"<+12>-12" Asia/Karachi,"PKT-5" Asia/Kathmandu,"<+0545>-5:45" Asia/Khandyga,"<+09>-9" Asia/Kolkata,"IST-5:30" Asia/Krasnoyarsk,"<+07>-7" Asia/Kuala_Lumpur,"<+08>-8" Asia/Kuching,"<+08>-8" Asia/Kuwait,"<+03>-3" Asia/Macau,"CST-8" Asia/Magadan,"<+11>-11" Asia/Makassar,"WITA-8" Asia/Manila,"PST-8" Asia/Muscat,"<+04>-4" Asia/Nicosia,"EET-2EEST,M3.5.0/3,M10.5.0/4" Asia/Novokuznetsk,"<+07>-7" Asia/Novosibirsk,"<+07>-7" Asia/Omsk,"<+06>-6" Asia/Oral,"<+05>-5" Asia/Phnom_Penh,"<+07>-7" Asia/Pontianak,"WIB-7" Asia/Pyongyang,"KST-9" Asia/Qatar,"<+03>-3" Asia/Qyzylorda,"<+05>-5" Asia/Riyadh,"<+03>-3" Asia/Sakhalin,"<+11>-11" Asia/Samarkand,"<+05>-5" Asia/Seoul,"KST-9" Asia/Shanghai,"CST-8" Asia/Singapore,"<+08>-8" Asia/Srednekolymsk,"<+11>-11" Asia/Taipei,"CST-8" Asia/Tashkent,"<+05>-5" Asia/Tbilisi,"<+04>-4" Asia/Tehran,"<+0330>-3:30<+0430>,J79/24,J263/24" Asia/Thimphu,"<+06>-6" Asia/Tokyo,"JST-9" Asia/Tomsk,"<+07>-7" Asia/Ulaanbaatar,"<+08>-8" Asia/Urumqi,"<+06>-6" Asia/Ust-Nera,"<+10>-10" Asia/Vientiane,"<+07>-7" Asia/Vladivostok,"<+10>-10" Asia/Yakutsk,"<+09>-9" Asia/Yangon,"<+0630>-6:30" Asia/Yekaterinburg,"<+05>-5" Asia/Yerevan,"<+04>-4" Atlantic/Azores,"<-01>1<+00>,M3.5.0/0,M10.5.0/1" Atlantic/Bermuda,"AST4ADT,M3.2.0,M11.1.0" Atlantic/Canary,"WET0WEST,M3.5.0/1,M10.5.0" Atlantic/Cape_Verde,"<-01>1" Atlantic/Faroe,"WET0WEST,M3.5.0/1,M10.5.0" Atlantic/Madeira,"WET0WEST,M3.5.0/1,M10.5.0" Atlantic/Reykjavik,"GMT0" Atlantic/South_Georgia,"<-02>2" Atlantic/Stanley,"<-03>3" Atlantic/St_Helena,"GMT0" Australia/Adelaide,"ACST-9:30ACDT,M10.1.0,M4.1.0/3" Australia/Brisbane,"AEST-10" Australia/Broken_Hill,"ACST-9:30ACDT,M10.1.0,M4.1.0/3" Australia/Currie,"AEST-10AEDT,M10.1.0,M4.1.0/3" Australia/Darwin,"ACST-9:30" Australia/Eucla,"<+0845>-8:45" Australia/Hobart,"AEST-10AEDT,M10.1.0,M4.1.0/3" Australia/Lindeman,"AEST-10" Australia/Lord_Howe,"<+1030>-10:30<+11>-11,M10.1.0,M4.1.0" Australia/Melbourne,"AEST-10AEDT,M10.1.0,M4.1.0/3" Australia/Perth,"AWST-8" Australia/Sydney,"AEST-10AEDT,M10.1.0,M4.1.0/3" Europe/Amsterdam,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Andorra,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Astrakhan,"<+04>-4" Europe/Athens,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Belgrade,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Berlin,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Bratislava,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Brussels,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Bucharest,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Budapest,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Busingen,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Chisinau,"EET-2EEST,M3.5.0,M10.5.0/3" Europe/Copenhagen,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Dublin,"IST-1GMT0,M10.5.0,M3.5.0/1" Europe/Gibraltar,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Guernsey,"GMT0BST,M3.5.0/1,M10.5.0" Europe/Helsinki,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Isle_of_Man,"GMT0BST,M3.5.0/1,M10.5.0" Europe/Istanbul,"<+03>-3" Europe/Jersey,"GMT0BST,M3.5.0/1,M10.5.0" Europe/Kaliningrad,"EET-2" Europe/Kiev,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Kirov,"<+03>-3" Europe/Lisbon,"WET0WEST,M3.5.0/1,M10.5.0" Europe/Ljubljana,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/London,"GMT0BST,M3.5.0/1,M10.5.0" Europe/Luxembourg,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Madrid,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Malta,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Mariehamn,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Minsk,"<+03>-3" Europe/Monaco,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Moscow,"MSK-3" Europe/Oslo,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Paris,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Podgorica,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Prague,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Riga,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Rome,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Samara,"<+04>-4" Europe/San_Marino,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Sarajevo,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Saratov,"<+04>-4" Europe/Simferopol,"MSK-3" Europe/Skopje,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Sofia,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Stockholm,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Tallinn,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Tirane,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Ulyanovsk,"<+04>-4" Europe/Uzhgorod,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Vaduz,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Vatican,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Vienna,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Vilnius,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Volgograd,"<+03>-3" Europe/Warsaw,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Zagreb,"CET-1CEST,M3.5.0,M10.5.0/3" Europe/Zaporozhye,"EET-2EEST,M3.5.0/3,M10.5.0/4" Europe/Zurich,"CET-1CEST,M3.5.0,M10.5.0/3" Indian/Antananarivo,"EAT-3" Indian/Chagos,"<+06>-6" Indian/Christmas,"<+07>-7" Indian/Cocos,"<+0630>-6:30" Indian/Comoro,"EAT-3" Indian/Kerguelen,"<+05>-5" Indian/Mahe,"<+04>-4" Indian/Maldives,"<+05>-5" Indian/Mauritius,"<+04>-4" Indian/Mayotte,"EAT-3" Indian/Reunion,"<+04>-4" Pacific/Apia,"<+13>-13" Pacific/Auckland,"NZST-12NZDT,M9.5.0,M4.1.0/3" Pacific/Bougainville,"<+11>-11" Pacific/Chatham,"<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45" Pacific/Chuuk,"<+10>-10" Pacific/Easter,"<-06>6<-05>,M9.1.6/22,M4.1.6/22" Pacific/Efate,"<+11>-11" Pacific/Enderbury,"<+13>-13" Pacific/Fakaofo,"<+13>-13" Pacific/Fiji,"<+12>-12<+13>,M11.2.0,M1.2.3/99" Pacific/Funafuti,"<+12>-12" Pacific/Galapagos,"<-06>6" Pacific/Gambier,"<-09>9" Pacific/Guadalcanal,"<+11>-11" Pacific/Guam,"ChST-10" Pacific/Honolulu,"HST10" Pacific/Kiritimati,"<+14>-14" Pacific/Kosrae,"<+11>-11" Pacific/Kwajalein,"<+12>-12" Pacific/Majuro,"<+12>-12" Pacific/Marquesas,"<-0930>9:30" Pacific/Midway,"SST11" Pacific/Nauru,"<+12>-12" Pacific/Niue,"<-11>11" Pacific/Norfolk,"<+11>-11<+12>,M10.1.0,M4.1.0/3" Pacific/Noumea,"<+11>-11" Pacific/Pago_Pago,"SST11" Pacific/Palau,"<+09>-9" Pacific/Pitcairn,"<-08>8" Pacific/Pohnpei,"<+11>-11" Pacific/Port_Moresby,"<+10>-10" Pacific/Rarotonga,"<-10>10" Pacific/Saipan,"ChST-10" Pacific/Tahiti,"<-10>10" Pacific/Tarawa,"<+12>-12" Pacific/Tongatapu,"<+13>-13" Pacific/Wake,"<+12>-12" Pacific/Wallis,"<+12>-12" Etc/GMT,"GMT0" Etc/GMT-0,"GMT0" Etc/GMT-1,"<+01>-1" Etc/GMT-2,"<+02>-2" Etc/GMT-3,"<+03>-3" Etc/GMT-4,"<+04>-4" Etc/GMT-5,"<+05>-5" Etc/GMT-6,"<+06>-6" Etc/GMT-7,"<+07>-7" Etc/GMT-8,"<+08>-8" Etc/GMT-9,"<+09>-9" Etc/GMT-10,"<+10>-10" Etc/GMT-11,"<+11>-11" Etc/GMT-12,"<+12>-12" Etc/GMT-13,"<+13>-13" Etc/GMT-14,"<+14>-14" Etc/GMT0,"GMT0" Etc/GMT+0,"GMT0" Etc/GMT+1,"<-01>1" Etc/GMT+2,"<-02>2" Etc/GMT+3,"<-03>3" Etc/GMT+4,"<-04>4" Etc/GMT+5,"<-05>5" Etc/GMT+6,"<-06>6" Etc/GMT+7,"<-07>7" Etc/GMT+8,"<-08>8" Etc/GMT+9,"<-09>9" Etc/GMT+10,"<-10>10" Etc/GMT+11,"<-11>11" Etc/GMT+12,"<-12>12" Etc/UCT,"UTC0" Etc/UTC,"UTC0" Etc/Greenwich,"GMT0" Etc/Universal,"UTC0" Etc/Zulu,"UTC0"