Arduino ESP32-Nano woordklok

(Document vertaald met Google translate UK->NL.) (English version

Github voor de laatste wijzegingen

Een klok die de tijd in woorden weergeeft in de talen Nederlands, Engels, Frans en Duits in een grote 4-talige klok of als een enkeltalige klok.
De Arduino ESP32 Nano wordt gebruikt om de klok aan te sturen.
De tijd wordt gesynchroniseerd met het Network Time Protocol (NTP) van het internet.

Instellingen kunnen worden beheerd met een webpagina, een pc of een Bluetooth Low Energy (BLE) seriële terminal-app die is geïnstalleerd op een telefoon, pc of tablet.

4-talige klok

Nederlandse taal klok

 

 


Arduino ESP32 Nano op de printplaat in de klok.


Klein PCB-ontwerp met Rotary en DS3231 RTC bevestigd

 

Voor het starten

De klok ontvangt de tijd van het internet als er een WIFI-verbinding is. Wanneer een DS3231-tijdmodule op de printplaat is bevestigd, is een internetverbinding niet vereist. Een draaiknop kan worden gebruikt om de tijd in te stellen.


Om verbinding te maken met het internet moeten de naam van het WIFI-station en het wachtwoord in de kloksoftware worden ingevoerd om verbinding te kunnen maken met een WIFI-router.
De naam van het WIFI-station en het wachtwoord moeten eenmalig worden ingevoerd. Deze inloggegevens worden opgeslagen in het geheugen van de microprocessor. (Zie Installaties )

 

Om het leven gemakkelijker te maken, kunt u het beste een telefoon of tablet en een Bluetooth-communicatie-app gebruiken om de WIFI-gegevens in de klok in te voeren.

 

BLESeriaal nRF

BLE Serieel Pro

Seriële Bluetooth-terminal

- Download een Bluetooth UART seriële terminal app op je telefoon, PC of tablet.
Voor IOS: BLE Serial Pro of BLESerial nRF .
Voor Android: Seriële Bluetooth-terminal .



 

Compilatie en uploaden

 

Voor elk board dat met de Arduino IDE geprogrammeerd kan worden is een compiler beschikbaar. Deze kan geselecteerd worden in het boards manager menu

Er zijn twee versies beschikbaar voor de Arduino Nano ESP32.

Eén van Arduino zelf die gebruik maakt van core versie 2. Dit bord is veilig in gebruik.

De fabrikant van de ESP32 microcontroller Espressif ontwikkelt coreversie 3. Sinds versie 3.0.5 compileert deze core probleemloos de word clock sketch V056.

-      Zoek naar ESP32 in de boardmanager.

 

De instellingen van het Arduino Nano ESP32-bord zijn als volgt:

-      Installeer ESP32-boards. De Arduino Nano ESP32 kan ergens onderaan die lange lijst met boards worden gevonden als de Espressif core V3 wordt gebruikt.

-      Laad het bestand ESP32Arduino_WordClockV0xx.INO in de IDE

 

Selecteer een van de drie woordklokken

//#define VIERTAALKLOK

#define NL144KLOK

//#define NLM1M2M3M4L94 // NL klok met vier extra LED's voor de minuten om op te lichten voor Ulrich

 

·         #define NL144CLOCK -> een 144 LED enkeltalige klok. Standaardtaal is Nederlands. Voor Frans, Duits en Engels kopieer de codering van de viertalige klok tussen de NL144CLOCK-definities.
Bouwinstructie voor de klok in het Nederlands en Engels of hier in deze repository

·         #define NLM1M2M3M4L94 -> een 144 LED enkeltalige klok met 4 extra LED's voor de minuten en een iets ander ontwerp

·         #define VIERTALIGE KLOK-> een 4-talige klok met 625 LED's in een raster van 25 x 25.
Bouwinstructie van een 4-talige woordklok met SK6812 LED's in het VK, NL, DE, FR met Nano Every. .

 

In de libraries.zip staan de bibliotheken om de software te compileren. Pak ze uit in je libraries-map.
Download de program-map en compileer voor Arduino Nano ESP32

 

Bord: Arduino Nano ESP32

Partitieschema: met FAT

Pinnummering: Op GPIO-nummer (oud)

(als de Arduino pin (standaard) is gekozen, gaat de LED-strip mogelijk niet aan en werkt de RGB LED op de Nano ESP32 mogelijk niet)

 

Als de LED's niet gaan branden, is de kans groot dat de pininstellingen niet goed zijn.

 

 

 

 

 

 

Installaties 

Om verbinding te maken met een WIFI-netwerk moet een SSID (WIFI-naam) en wachtwoord worden ingevoerd.
Er zijn een paar methoden:
Sluit de MCU in de klok met een micro-USB- seriële kabel aan op een pc en gebruik een seriële terminal.
Gebruik​ een BLE- seriële terminal-app op een telefoon of tablet voor verbinding .

Voor een PC de app Termite is prima als seriële terminal. Maar seriële monitor in de Arduino IDE werkt vaak beter.

Voor IOS gebruik : BLE Serial Pro of BLESeriaal nRF .

Voor Android gebruik: Seriële Bluetooth terminal .

Bluetooth Low Energy (BLE) kan twee soorten protocol gebruiken CC25nn of nRF52nn waarbij nn een specifiek nummer is. Deze klok gebruikt nRF52.


- Start de app en start een verbinding met de klok. Sommige apps starten automatisch met een verbindingsvenster, maar voor sommige moet een verbindingssymbool worden ingedrukt. Er is waarschijnlijk één station, het woord klok, om uit te selecteren.

- Selecteer de klok in de lijst.

- De app toont een venster en een regel waar opdrachten kunnen worden ingevoerd en naar de klok kunnen worden verzonden.

- Door de letter I of i voor informatie te verzenden, wordt het menu weergegeven, gevolgd door de werkelijke instellingen van verschillende voorkeuren .

 

In de klok zit een LED die een rode stip heeft die oplicht als het programma draait.
Een groene stip gaat branden als er een WIFI-verbinding is. Als er een Bluetooth-verbinding is, gaat er een blauwe stip in de LED branden.

In beide gevallen stuurt u de letter I van Informatie en het menu verschijnt .

Voer de eerste letter in van de instelling die u wilt wijzigen, gevolgd door een code.

Sommige items schakelen alleen Aan en Uit. Zoals de W om WIFI Uit of Aan te zetten.

 

Om de SSID en het wachtwoord te wijzigen:
Verstuur de letter A of a gevolgd door de naam van het wifi -station.

Een my- ssid en verstuur deze opdracht. Bijvoorbeeld AFRITZ!Box01 of aFRITZ!Box01. Beginnend met een hoofdletter of kleine letter is een identieke instructie in de opdrachtreeks.
Daarna volgt de letter B met het wachtwoord.
B mypassword en verstuur het wachtwoord.
Cbroadcastname verandert in de naam die wordt weergegeven in de Bluetooth-verbindingslijst. Iets als: cMyClock

Als de lengte van de SSID en/of het wachtwoord minder dan 5 tekens is, wordt de WIFI automatisch uitgeschakeld om verbindingsfouten te voorkomen.

Gebruik een lengte van minimaal 8 tekens voor de SSID en het wachtwoord.
Controleer in het menu (derde rij van onderen) of WIFI en NTP aan staan.

Voer @ in om de MCU opnieuw op te starten . Deze wordt opnieuw opgestart en er worden verbindingen gemaakt.
Soms moet de klok een tweede of derde keer worden gereset voordat hij verbinding kan maken met WIFI. Als​ verbinding​​​​​​​​​ nog steeds​​​ f a i l s rekening​​​​ de​​ S Z I D naam​​​ En​​ het ingevoerde wachtwoord. (stuur de letter b, een easter egg)) Als er WIFI is verbonden
, zal de LED op de MCU oplichten als een groene stip.

______________________________

Een SSID B Wachtwoord C BLE-bakennaam

D Datum (D15012021) T Tijd (T132145)

E Tijdzone (E<-02>2 of E<+01>-1)

F Eigen kleur (Hex FWWRRGGBB)

G Scan WIFI-netwerken

H Schakelen tussen draai-encoder

Ik Om dit Info-menu af te drukken

J Schakel DS3231 RTC-module in

K LDR leest/sec. schakelt aan/uit

N Weergave uit tussen Nhhhh (N2208)

O Weergave aan/uit schakelen

P Status LED-schakelaar Aan/Uit

Q Weergave kleurkeuze

Q0 Geel Q1 Uurlijks Q2 Wit

Q3 Allemaal Eigen Q4 Eigen Q5 Wiel

  Q6 Digitaal

R Instellingen resetten @ = MCU resetten

U Demo- modus ( msec ) (M200)

--Instellingen voor lichtintensiteit (1-250)--

S-helling, L-min, M-max (S80 L5 M200)

W WIFI, X NTP&, CCC BLE, + Snelle BLE

# Zelf test, ! Zie RTC, & Update RTC

Ed Nieuwenhuys November 2024

________________________________________________

Weergave uit tussen: 23u - 08u

Weergavekeuze: Wiel

Helling: 5 Min: 5 Max: 100

SSID: FRITZ!Box

BLE -naam : RedSmall01

IP-adres: 192.168.178.199 (/update)

Tijdzone: CET-1CEST,M3.5.0,M10.5.0/3

WIFI=Aan NTP=Aan BLE=Aan FastBLE =Aan

LED-strip: SK6812 (Stuur % naar schakelaar)

Software: ESP32Arduino_WordClockV049.ino

ESP32 Arduino kernversie: 2.0.17

__________________________________________________________________________________

 

Menu weergegeven in seriële uitvoer.

 

Standaard staat de klok ingesteld op Amsterdamse tijd. Een reset met optie R in het menu zal deze tijdzone weer terugzetten naar Amsterdam.
Om een andere tijdzone in te stellen, stuurt u de tijdzonestring tussen de aanhalingstekens, voorafgegaan door het teken E of e.

Onderaan deze handleiding worden veel tijdzones afgedrukt.
Bijvoorbeeld: als u in Australië/Sydney woont, stuurt u de string,

eAEST-10AEDT,M10.1.0,M4.1.0/3.

De klok gebruikt de zomertijd (DST) wanneer deze is verbonden met een NTP-server, maar niet wanneer de DS3231-tijdmodule wordt gebruikt

HTML-pagina op iPhone

Termietenterminal vanaf een pc

 

Software upgraden

Software kan over the air (OTA) worden geüpgraded door een webbrowser te openen en het IP-adres van de klok in te voeren, gevolgd door /update.
Bijvoorbeeld: 192.168.178.78/update. Kies firmware en klik op Choose File. Kies het juiste bin-bestand.

Zoiets als:

ESP32Arduino_WordClockV056.ino-NL144-3.0.7.bin


 


 

Bediening en instellingen van de klok

De klok kan worden bediend met de WIFI webpagina of BLE UART terminal app.
Wanneer de klok is verbonden met WIFI heeft deze een IP -adres ontvangen van de router waarmee deze is verbonden.
Het IP-adres staat afgedrukt in het menu.


Om het menu als een webpagina te starten, IP -adresnummers en punten (bijvoorbeeld: 192.168.178.77) moeten worden ingevoerd in de webbrowser van uw mobiele telefoon of pc

of gebruik in plaats daarvan de BLE-uitzendnaam gevolgd door .local als URL in de browser. (Standaard na een reset: wordclock.local

Of gebruik een Bluetooth-verbinding:
- Open de BLE-terminal-app.
- Zoek in de app naar de klok om verbinding mee te maken en maak verbinding.

Elke app heeft zijn eigen manier om het Bluetooth-apparaat weer te geven waarmee verbinding moet worden gemaakt.

De iPhone / iPad / iMac BLE-seriële apps zijn door mij gemaakt en werken met hun standaardinstellingen.
Bij andere apps moeten de instellingen voor het verzenden en ontvangen van gegevens mogelijk worden gewijzigd. Speel met de lettergrootte en de CR- en LF-instelling totdat u

op een iPhone, iPad of iMac met de BLE-seriële app de transmissiesnelheid kunt versnellen door de optie '+ Fast BLE' te selecteren in het menu

Helaas kunnen sommige apps geen strings lezen die langer zijn dan 20 tekens en ziet u de strings afgekapt of vervormd .
Als u een vervormd menu ziet, voer dan het teken '+' in en verstuur het om de langzamere transmissiemodus te selecteren .
Als de transmissie te vervormd is en het onmogelijk is om het teken Z te verzenden, probeer dan de webpagina van de klok en verstuur het teken +.

Als alles mislukt, moet u de MCU in de klok met een USB-C-kabel aansluiten op een pc en een seriële terminal-app gebruiken om een + te verzenden of als laatste redmiddel R om de fabrieksinstellingen te resetten.

 

De lichtintensiteit van het display aanpassen

 

In het menu kan de lichtintensiteit van het display met drie parameters worden geregeld:

--Instellingen voor lichtintensiteit (1-250)--

S=Helling L=Min M=Max (S80 L5 M200)

Standaardwaarden worden tussen () weergegeven.

S Toon snel de helderheid de maximale helderheid bereikt .

Ik Hoe helder het scherm is in volledige duisternis .

M de maximale helderheid van het scherm .

In de onderste helft van het menu worden de opgeslagen waarden weergegeven

Helling: 80 Min: 5 Max: 255

 

De klok reageert op licht met zijn LDR (lichtafhankelijke weerstand) .  

 

 


Als het donker wordt schakelt het display niet helemaal uit maar blijft gedimd op een minimale waarde .
Met de parameter V kan de laagste helderheid worden geregeld. Met een waarde tussen 0 en 255 kan deze helderheid worden ingesteld.
V5 is de standaardwaarde.

De maximale helderheid van het display wordt geregeld met de parameter U. Ook een waarde tussen 0 en 255.

Met parameter S kan de helling worden geregeld hoe snel de maximale helderheid wordt bereikt.





 

Instellingen worden ingesteld door het eerste teken van een opdracht in te voeren, gevolgd door parameters indien nodig.
Bijvoorbeeld:
Om de kleuren van de woorden in de klok op wit in te stellen, voer in: Q2


Om willekeurig alle vier de talen elke minuut te tonen, stuurt u L4. (Dit werkt niet in een klok met één taal)


Schakel WIFI uit door een W te sturen.

Start de klok opnieuw met de letter @.

Reset naar standaardinstelling door R te sturen.

 

HTML-pagina

BLE-menu

 


 

De software updaten


De software kan 'Over The Air' worden bijgewerkt wanneer de klok is verbonden met WIFI.
Het IP-adres staat in het menu.

 

Voer het IP-adres van de klok in, gevolgd door /update.

Zoiets als dit: 192.168.178.141/update.

Of gebruik BLEbroadcastname.local /update in plaats van het IP-adres.

In dit geval: redpcbv01.local/update.

 

'Kies bestand' in het menu en selecteer het bin-bestand dat u wilt bijwerken.

Iets als: ESP32Arduino_WordClockV056.ino.bin

waarbij V056 het versienummer van de software is.


 

Gedetailleerde beschrijving

Met het menu kunnen veel voorkeuren worden ingesteld. Deze voorkeuren worden opgeslagen in de ESP32-opslagruimte.
 
Voer het eerste teken in het menu van het item in dat moet worden gewijzigd, gevolgd door de parameter.
Er is geen verschil tussen hoofdletters of kleine letters. Beide zijn OK.

 

Serie gestart

Rotary NIET gebruikt

Rotary beschikbaar

I2C-adres gevonden: 0X57

I2C-adres gevonden: 0X68

Externe RTC-module IS gevonden

DS3231 RTC-software gestart

Geheugencontrolesom = 25065

Opgeslagen instellingen geladen

LED-strip is SK6812

LED-strip gestart

BLE is gestart

10: netwerken gevonden

1: FRITZ!BoxEd -47 * -- Zal verbinding maken met

2: NETGEAR_EXT-69

3: FRITZ!BoxEd -71 * -- Zal verbinding maken met

4: H369A209CE1 -75 *

 5: H3baas -81 *

6: H369A209CE1 -81 *

7: FRITZ!Box -82 *

8: H369A209CE1 -83 *

 9: FRITZ!Box 5490 IS -83 *

10: FRITZ!Box 5490 XL -84 *

[ WiFi -gebeurtenis] gebeurtenis: 0: WiFi- interface gereed

[ WiFi -gebeurtenis] gebeurtenis: 2: WiFi- client gestart

[ WiFi -gebeurtenis] gebeurtenis: 4: Verbonden met toegangspunt

[ WiFi -gebeurtenis] gebeurtenis: 7 : Verkregen IP-adres: 192.168.178.199

IP-adres: 192.168.178.199

Webpagina gestart

WIFI gestart

01/01/2000 00:06:42

________________________________________________

Een SSID B Wachtwoord C BLE-bakennaam

D Datum (D15012021) T Tijd (T132145)

E Tijdzone (E<-02>2 of E<+01>-1)

F Eigen kleur (Hex FWWRRGGBB)

G Scan WIFI-netwerken

H Schakelen tussen draai-encoder

Ik Om dit Info-menu af te drukken

J Schakel DS3231 RTC-module in

K LDR leest/sec. schakelt aan/uit

N Weergave uit tussen Nhhhh (N2208)

O Weergave aan/uit schakelen

P Status LED-schakelaar Aan/Uit

Q Weergave kleurkeuze

Q0 Geel Q1 Uurlijks Q2 Wit

Q3 Allemaal Eigen Q4 Eigen Q5 Wiel

  Q6 Digitaal

R Instellingen resetten @ = MCU resetten

U Demo- modus ( msec ) (M200)

--Instellingen voor lichtintensiteit (1-250)--

S-helling, L-min, M-max (S80 L5 M200)

W WIFI, X NTP&, CCC BLE, + Snelle BLE

# Zelf test, ! Zie RTC, & Update RTC

Ed Nieuwenhuys November 2024

________________________________________________

Weergave uit tussen: 23u - 08u

Weergavekeuze: Geel

Helling: 5 Min: 5 Max: 100

SSID: FRITZ!BoxEd

BLE -naam : RedSmall01

IP-adres: 192.168.178.199 (/update)

Tijdzone: CET-1CEST,M3.5.0,M10.5.0/3

WIFI=Aan NTP=Uit BLE=Aan FastBLE =Aan

LED-strip: SK6812 (Stuur % naar schakelaar)

Software: ESP32Arduino_WordClockV049.ino

ESP32 Arduino kernversie: 2.0.17

01/01/2000 00:06:42

________________________________________________

Het is vijf over twaalf

Het is vijf over twaalf LDR:140= 3% 220692 l/s 20°C 00:06:43

Het was vijf over twaalf LDR:140= 3% 215629 l/s 20°C 00:07:00

A SSID B Wachtwoord C BLE beacon naam
Voer de naam van de SSID van de router en het wachtwoord in waarmee de klok verbonden moet worden.
De Bluetooth broadcast naam die weergegeven wordt in de Bluetooth seriële terminal app kan gewijzigd worden.

Bijvoorbeeld: een FRITZ!Box of A FRITZ!Box .
Voer vervolgens het wachtwoord in. Bijvoorbeeld: B Secret_pass word.

Voer eventueel c BluetoothName in (standaard na een reset: wordclock )
Start de klok opnieuw door @ te verzenden .

 

CCC Door CCC of ccc in te voeren, schakelt u BLE in of uit. Wees voorzichtig bij het uitschakelen. Als BLE uit staat, kan de klok alleen worden bediend met WIFI of de USB-seriële poort.


D Datum instellen en T Tijd instellen
Als er geen verbinding is met WIFI-tijd en er een RTC DS3231 is aangesloten, moet de datum handmatig worden ingesteld .
Voer bijvoorbeeld in: D06112022 om de datum in te stellen op 6 november 2022.

Voer bijvoorbeeld T132145 (of 132145, of t132145) in om de tijd in te stellen op 45 seconden en 21 minuten na één uur.
Het wijzigen van datum en tijd werkt alleen als er een DS3231 RTC-module is aangesloten.

 

E Stel tijdzone E<-02>2 of E<+01>-1
in Onderaan deze pagina staan de tijdzones die in 2022 worden gebruikt.
Het is een vrij ingewikkelde string en het is daarom verstandig om deze te kopiëren.
Laten we er een kiezen als u hier woont: Antarctica/Troll,"<+00>0<+02>-2,M3.5.0/1,M10.5.0/3"
Kopieer de string tussen de " "'s en verstuur deze beginnend met een 'E' of 'e' ervoor.
E<+00>0<+02>-2,M3.5.0/1,M10.5.0/3


F Eigen kleur (Hex WWRRGGBB)
De kleuren van uw keuze van de woorden die in de klok worden weergegeven, kunt u selecteren met optie Q3 of Q4 in het menu.
Het in te voeren formaat is hexadecimaal. 0123456789ABCDEF zijn de tekens die kunnen worden gebruikt.
Het commando bestaat uit 2 cijfers voor Rood gevolgd door 2 voor Groen en eindigend met 2 cijfers voor Blauw.

Om de karakters intens Groen te kleuren, voer F0000FF00 in, voorafgegaan door de letter F. Om
de karakters intens Rood te kleuren, voer FF0000 in, voorafgegaan door het karakter F.

Om intens blauw in te stellen, voer je F0000FF of FFF in.

Om het gedimde teken donkergrijs te maken, voert u bijvoorbeeld F191919 in.

Bij SK6812 LED's kan de extra witte LED naast de drie RGB LED's in dezelfde behuizing worden gebruikt.

Bijvoorbeeld: F8800FF00 is 50% wit en 100% groen.

 

G Scannen naar WIFI netwerken in de buurt
Door 'G' te versturen worden de beschikbare netwerken in de buurt in de seriële terminal afgedrukt. Dit kan eenvoudig zijn om de soms lastige SSID te kopiëren naar optie A van het menu.

 

H Schakelen om de draaiknop te gebruiken.
Door 'H' te verzenden schakelt u het gebruik van een optionele draaiknop die op de printplaat is bevestigd in of uit.

Als u de draaiknop inschakelt en er geen draaiknop op aansluit, zal dit waarschijnlijk resulteren in onbedoelde invoer, omdat de niet-aangesloten pinnen willekeurig signalen oppikken.


Om dit infomenu af te drukken,
drukt u het menu af via Bluetooth en de seriële monitor die met een USB-kabel is aangesloten .

 

J Schakelen om de DS3231-moduletijd te gebruiken
Door 'J' te verzenden, schakelt u het gebruik van een optionele DS3231-tijdmodule AAN en UIT.
Als de klok geen internetverbinding heeft, zal de tijd waarschijnlijk ongewenst snel afdrijven. Door een DS3231-tijdmodule te installeren, wordt de afwijking teruggebracht tot een paar seconden per jaar. De tijd kan worden ingevoerd met optie T en D in het menu.

 

K Reads/sec wisselt Aan/Uit
Door een K in te voeren wisselt u het afdrukken van de LDR-uitlezing van de gemeten lichtintensiteit.
Het toont ook hoe vaak de processor door het programma loopt en zijn taken controleert om de klok te laten lopen.

N Display uit tussen Nhhhh (N2208)
Met N2208 wordt het display uitgeschakeld tussen 22:00 en 8:00.

O Display aan/uit schakelen
O Schakelt het display uit en in.

 

P Status-LED's schakelen aan/uit
P Schakelt de status-LED's op de Arduino Nano uit en aan.

Q Keuze van de weergavekleur (Q0-6)
Q0 Geel Q1 per uur Q2 Wit Q3 Alles Eigen Q4 Eigen Q5 Wiel Q6 Digitaal display


Q0 geeft de tijd weer met gele woorden

en zal HET (of IT) binnen een uur van groen via geel naar rood veranderen.

en zal IS of WAS van groen naar rood via geel veranderen in een minuut.
Q1 zal elk uur een andere kleur tonen.
Q2 toont alle teksten wit.
Q3 en Q4 gebruiken uw eigen gedefinieerde kleuren.
Q5 zal elke minuut regenboogkleuren volgen.
Q6 is het digitale display

 

R Instellingen resetten
R zet alle voorkeuren terug naar de standaardinstellingen.

Hiermee worden ook de SSID en het wachtwoord gewist.

Voer een reset uit wanneer de schets voor de eerste keer wordt geüpload naar de Arduino Nano ESP32.

 

S=Slope L=Min M=Max (S80 L5 M200)
S Hoe snel de helderheid de maximale helderheid bereikt.
L Hoe helder het display is in volledige duisternis.
M de maximale helderheid van het display.
Waarden tussen 0 en 250'

 

U Demo-modus (msec) (U200)

Voer U in, gevolgd door de duur van een seconde in milliseconden.

M200 (200 milliseconde) versnelt de klok 5 keer.

Als u een U verzendt, wordt de demomodus uitgeschakeld.

 

W=WIFI, X=NTP & , CCC=BLE
Schakel WIFI, NTP in en uit.
Voer het teken in om het in of uit te schakelen.
Onderaan het menu staat het aangegeven.

Bottom menu

Door een & te verzenden wordt een query vanaf de tijdserver gestart.

 

+ Snelle BLE
Het BLE UART-protocol verzendt standaardpakketten van 20 bytes lang. Tussen elk pakket zit een vertraging van 50 msec .
De IOS BLEserial- app, en misschien ook andere, kan pakketten van 80 bytes of meer ontvangen voordat tekens worden gemist . Hierdoor wordt het menu sneller afgedrukt.
Optie Z schakelt tussen de lange en korte pakketten.

 

! = Toon NTP, RTC en DS3231 tijd
!
zal de NTP, RTC en DS3231 tijd weergeven zoals ze zijn opgeslagen in de klok in de klok . De DS3231 tijd module moet geïnstalleerd zijn en gebruikt worden om een realistische tijd te tonen.
Hetzelfde als de & optie maar deze optie zal niet worden bijgewerkt vanaf de internet NTP server maar toont alleen de tijd.

 

# = Selftest
Door een # te sturen start de klokzelftest. Dit is handig om te controleren of alle woorden in de klok functioneren.

 

% = Wisselen tussen SK6812 en WS2812 LED strip
Met deze optie kan de gebruikte LED strip worden gewisseld. De klok is uitgerust met een van deze twee typen LED strips.

Een reset van alle instellingen door een R in het menu te sturen, verandert de selectie van de LED-strip niet.

@ = Res et MCU
@ start de MCU opnieuw op . Dit is handig als de SSID, et cetera worden gewijzigd en het programma opnieuw moet worden opgestart. Instellingen worden niet verwijderd.

 

& = Haalt en slaat NTP-tijd op in RTC- en DS3231-tijd
&
haalt de NTP-tijd direct van internet en slaat deze op in de RTC-klokken. Deze optie is handig om de klok te dwingen de juiste NTP-tijd op te halen.
In andere gevallen controleert het programma de tijd die in de klok en op de NTP-server loopt, zo nu en dan, en werkt de RTC-klokken bij.
De DS3231-tijdmodule moet geïnstalleerd zijn en gebruikt worden om een realistische tijd weer te geven.

 

123456 Tijd instellen in RTC-module

Voer de tijd in als 152300 hhmmss . Hetzelfde als T152300.
Datum en tijd wijzigen werkt alleen als een DS3231 RTC-module is aangesloten.

 

 

 


 

Programma uitleg 

 

Het programma maakt gebruik van de volgende standaardbibliotheken.

//----------------------------------------

// ESP32 Bevat definities en initialisaties

//----------------------------------------

 

#include < Arduino.h >

#include < Voorkeuren.h >

#als ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)

#include " EdSoftLED.h " // voor LED-strip WS2812 of SK6812

#anders

#include < Adafruit_NeoPixel.h > // voor LED-strip WS2812 of SK6812

#endif

#include < NimBLEDevice.h > // Voor BLE-communicatie

#include < ESPNtpClient.h > // https://github.com/gmag11/ESPNtpClient

#include < WiFi.h > // Gebruikt voor webpagina

#include < AsyncTCP.h > // Gebruikt voor webpagina

#include < ESPAsyncWebServer.h > // Gebruikt voor webpagina ESPAsyncWebServer  

#include < ElegantOTA.h >

#include < Wire.h >

#include < RTClib.h > // Gebruikt voor aangesloten DS3231

#include < Encoder.h >

 

De TAB in de IDE is de webpagina die in de browser moet worden weergegeven.
De #include " Webpage.h " een paar regels verder in de code laadt de webpagina.
Ik heb de webpagina gemaakt in de gratis 'Microsoft Expression Web 4'. Deze wordt niet meer onderhouden, maar heeft meer dan genoeg functionaliteiten voor onze doeleinden.

Om de code te kopiëren van de MS-Expression web HTML-editor:
Klik in de onderste regel van het venster van MS-Expression op 'Splitsen'. In de bovenste helft wordt de onbewerkte HTML-code weergegeven en in de onderste helft het ontwerpvenster. Kopieer in het codevenster alle HTML-code. Ga naar de Arduino IDE en plak deze in de webpage.h TAB tussen:
R"rawliteral ( ... en ... ) rawliteral ";

Of kopieer de code van de webpage.h in het MSexpression -codegebied en ontwerp de pagina opnieuw.

MS expression

Er volgt een lange lijst met definities en initialisaties.
Ik ben geen fan van het doorgeven van alle variabelen van en naar functies en houd ze graag globaal in één programmalijst. Als je een programma schrijft met andere mensen is het een goede gewoonte om niet te veel globale variabelen te gebruiken, maar dit programma staat in één grote lijst, om dezelfde reden om het simpel te houden.
Ik heb alle variabelen per toepassing gegroepeerd om bij te houden waar ze worden gebruikt. Met een eenvoudige zoekopdracht is het gemakkelijk om in deze ene geweldige lijst de achterkant te vinden.

Om de tijd af te drukken als tekst en kleur met de juiste LED's of tekens, worden de woorden en de positie ervan in een reeks LED's of tekst gedefinieerd. De definities voeren de functie ColorLeds uit met de juiste parameters.
Verderop in het programma in de functie void Dutch(void), void English(void) et cetera wordt duidelijk waarom deze definities zo nuttig en handig zijn.

...

#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 );

...

Dit is de initialisatie van het opslaggebied om de struct EEPROMstorage op te slaan .
De Struct met al zijn instellingen wordt in één opdracht opgeslagen in het permanente geheugen of SDPreferences FLASHSTOR;

struct EEPROMstorage { // Gegevensopslag om ze te behouden na stroomuitval
byte DisplayChoice = 0;
...char BLEbroadcastName [30]; // Naam van het BLE-baken
char Timezone [50];
int Checksum = 0;} Mem;

De variabelen worden geadresseerd met een korte naam Mem. Bijvoorbeeld Mem.DisplayChoice = 3;

De Struct EEPROMstorage
wordt opgeslagen in de functie StoreStructInFlashMemory
en opgehaald in de functie GetStructFromFlashMemory

Het menu dat wordt weergegeven in de seriële monitor en de BLE-app wordt hier gedefinieerd. De string mag niet langer zijn dan 40 tekens, wat kan worden gecontroleerd met de string 'ruler'.

// Menu

//0 1 2 3 4

//1234567890123456789012345678901234567890

tekenmenu[][40] = {

"Een SSID B Wachtwoord C BLE-bakennaam",

"D Datum (D15012021) T Tijd (T132145)",

...

"W=WIFI, X =NTP, Y=BLE, Z=Snelle BLE",

" Juni 2024" };


De installatie vindt hier plaats:

//----------------------------------------

// ARDUINO-installatie

//----------------------------------------

lege setup()

{

 Serial.begin (115200); // Stel de seriële poort in op 115200 baud //

 pinMode ( secondenPin , OUTPUT); // seconden LED-pin inschakelen

...

...

msTick = millis ();
}


De lus wordt bijna leeg gehouden en het programma start in EverySeccondCheck .
Alleen subroutine in CheckDevices (); moet vaak worden uitgevoerd.

 

//----------------------------------------

// ESP32-lus

//----------------------------------------

lege lus()

{

Loopcounter ++; // Hoe vaak herhaalt de MCU een loop/sec?

ElkeSecondeControle ();

ControleerApparaten ();

}

De volgende routines controleren of er elke seconde, minuut, uur en dag iets moet gebeuren.
Deze flow handling van het programma houdt de processor voor 99% vrij voor andere doeleinden.
In dit programma is dat bijna niets, maar voor andere doeleinden kan dit nodig zijn.
In de Bluetooth en Seriële communicatiefuncties worden enkele korte vertragingen gebruikt die hier essentieel zijn, maar het programma draait hier alleen als er daadwerkelijk communicatie is.
(Een alternatieve methode had het gebruik van een interrupt elke seconde en een lege lus kunnen zijn).

//--------------------------------------------

// KLOK Update routine wordt elke seconde uitgevoerd

//----------------------------------------

ElkeSecondCheck ongeldig maken (ongeldig)

{

statisch int Toggle = 0;

uint32_t msLeap = millis () - msTick ; //

als ( msLeap >999) // Elke seconde de lus ingaan

{

  msTick = millis ();

  GetTijd (false); // Haal de tijd op voor de seconden

leds aan of uit te zetten

  UpdateStatusLEDs (schakelen);

  SetSecondColour (); // Stel de kleur per seconde in van 'IS' en 'WAS'

  DimLeds ( TestLDR ); // Elke seconde een intensiteitscontrole

als ( timeinfo.tm_min != lastminute) ElkeMinuteUpdate ();

  Lusteller =0;

}}

//----------------------------------------

// KLOK Update routine wordt elke minuut uitgevoerd

//----------------------------------------

ElkeMinuteUpdate ongeldig maken (ongeldig)

{

...

als( timeinfo.tm_hour != laatsteuur ) ElkeHourUpdate ();

}

//----------------------------------------

// KLOK Update routine wordt elk uur uitgevoerd

//----------------------------------------

ongeldig EveryHourUpdate (ongeldig)

{

...

als ( timeinfo.tm_mday != laatstedag ) EveryDayUpdate ();

}

// //

//----------------------------------------------------------------------

// KLOK Update routine wordt elke dag uitgevoerd

//------------------------------------------- ----------------------------

leeg EveryDayUpdate (leeg)

{

...

}


Controleer op seriële invoer van de seriële monitor en geef de opdracht door aan ReworkInputString ()

//----------------------------------------

// Algemene controle voor seriële invoer

//----------------------------------------

ongeldige SerialCheck (ongeldig)

{

...

ReworkInputString ( SerialString +"\n"); // Opnieuw bewerken ReworkInputString ();

...

}


Herstel alle standaardwaarden.

//-----------------------------------------------------------------

// Algemeen Resetten naar standaardinstellingen

//-----------------------------------------------------------------

leeg Reset(leeg)

{

Mem.Controlesom = 25065;

...

}

Algemene printroutines.
Om alle printopdrachten op één plek te houden, is het eenvoudig om deze routines te wijzigen voor andere borden met een andere 'slang'.

//----------------------------------------

// Algemene afdrukroutines

//----------------------------------------

void Tekstprint (char const tekst [])

{ if(Serial) Serial.print ( tekst ); SendMessageBLE ( tekst ); sptext [0]=0; }

leegte Tekstafdruk ( char const tekst[])

{ sprintf ( sptext ,"%s\ n",tekst ); Tekstprint( sptext ); }

leegte TekstSprint ( char const tekst[])

{ printf (tekst); sptext [0]=0;} // afdrukken voor foutopsporingsdoeleinden​

leegte TekstSprintln ( char const tekst[])

{ sprintf ( sptext ,"%s\ n",tekst ); TekstSprint ( sptext ); }

 

//-------------------------------------------- -----------------------

// Algemeen Beperk een string met gehele getallen

// De waarde tussen het eerste en laatste teken in een tekenreeks wordt geretourneerd tussen de lage en hoge grenzen

//-------------------------------------------- -----------------------

int SConstrainInt (String s,byte eerste,byte laatste,int laag,int omhoog)

{return constrain( s.substring (eerste, laatste). toInt (), laag, omhoog);}

int SConstrainInt (String s,byte eerst, int laag, int omhoog)

{return constrain( s.substring (eerste). toInt (), laag, omhoog);}

 

 

De instelling van opslagruimte en controle van de geldigheid van de instellingen.
In de checksum is ongeldig zal een reset() de standaardinstellingen herstellen

//----------------------------------------

// Algemene init en controleer de inhoud van EEPROM

//----------------------------------------

leeg InitStorage (leeg)

 

Instellingen opslaan en ophalen van SPIFFS of SD of EEPROM
. De verschillende mogelijkheden worden hier opgeslagen. EEPROM veroudert, maar werkt nog steeds.

----------------------------------------

// COMMON Bewaar mem.struct in FlashStorage of SD

//----------------------------------------

leeg StoreStructInFlashMemory (leeg)

{

}

//----------------------------------------

// ALGEMEEN Gegevens ophalen uit FlashStorage Voorkeuren.h

//----------------------------------------

leeg GetStructFromFlashMemory (leeg)

{

}

 

 

Haal de commando's op uit de strings die zijn ingevoerd in de seriële monitor, Bluetooth of de webpagina en voer het commando uit in een actie.
De menuletters worden bijna gebruikt, maar het is mogelijk om onderscheid te maken tussen kleine en hoofdletters wanneer er meer commando's nodig zijn.
(Daarom is er geen conversie naar Hoofdletters of Kleine letters ).

//----------------------------------------

// KLOK-invoer van Bluetooth of serieel

//----------------------------------------

void ReworkInputString (String InputString )

{

....

schakelen ( InputString [0])

{

geval 'A':

geval 'a':

als ( InputString.length () >5 )

...

 

Lees de LDR af en deel deze door 16 om de waarden van 0 - 4096 tussen 0 en 255 te krijgen.
Niet alle borden hebben een 12-bits AD-converter zoals.

//----------------------------------------

// LDR-waarden liggen tussen 0 en 255.

// ESP32 analoge leeswaarde ligt tussen 0 - 4096 -- is: 4096 / 8

//----------------------------------------

int ReadLDR (void) { return analogRead ( PhotoCellPin )/16;}


Regel de kleur en intensiteit van de LED op de borden met één commando

//----------------------------------------

// KLOK Bedien de LED's op de ESP32

// 0 Laag is LED uit. Daarom is de waarde omgekeerd met de ! Not

//----------------------------------------

void SetStatusLED (bool Rood, bool Groen, bool Blauw)

{


Deze functie leest de analoge poort en berekent een output-intensiteit naar een display of LED-strip. De metingen worden gekwadrateerd om een hyperbolische curve te krijgen die beter lijkt op uw oogcorrectie voor donker en licht dan een lineair bereik. Het werkt wonderwel goed.


//----------------------------------------

// LED Dim de leds gemeten door de LDR en print waarden

// De LDR-waarden liggen tussen 0 en 255. De helderheid die naar de LED's wordt verzonden, ligt tussen 0 en 255

//----------------------------------------

ongeldige DimLeds (bool print) { ... }


Hier printen en kleuren we de karakters in het display of lichten we op naar de juiste LED's in een String van RGB(W) LED's.
De #define voert deze functies uit met de juiste parameters voor elke taal en print de teksten in de seriële verbindingen.
#define QUARTER ColorLeds ("kwartaal", 32, 38, LetterColor );

//---------------------------------------- /

/ LED Stel de kleur voor de LED in.

//----------------------------------------

void ColorLeds (char const * Texkst , int EersteLed , int LaatsteLed , uint32_t RGBColor )

{ }


Om alle tekens in een tekenreeks naar hoofdletters te converteren.

//----------------------------------------

// COMMON String boven

//----------------------------------------

leeg naar_boven (char* string)

 

Elk display of elke strip gebruikt andere commando's om de helderheid te regelen

Daarom is er voor alle LED/Display-opdrachten een functie

//-----------------------------------------------------------------

// LED Stel de helderheid van de achtergrondverlichting in

//------------------------------------------------------------------

leeg SetBrightnessLeds (byte Helder)

{

 SetBackLight (Bright); // Stel de helderheid van LED's in

}


Een plek om alle LED's uit te schakelen of het display leeg te maken

//----------------------------------------

// LED Wis de tekenreeks

//----------------------------------------

leeg LedsUit (leeg)

 

Hier zijn alle kleuren ingesteld voor de tekens.
De functie is vaak veranderd en de naam beschrijft het oorspronkelijke doel. Voor achterwaartse compatibiliteit is de naam ongewijzigd.
//--------------------------------------------
// LED Stel tweede kleur
in //--------------------------------------------void SetSecondColour (void)
{ switch ( Mem.DisplayChoice ) { case DEFAULTCOLOUR: LetterColor = C_YELLOW;
...



SWversion () drukt het menu en de instellingen van verschillende voorkeuren af.
De functie is vaak veranderd en de naam beschrijft het oorspronkelijke doel. Voor achterwaartse compatibiliteit is de naam ongewijzigd.
PrintLine () drukt de horizontale lijnen in het menu af.

//----------------------------------------

// KLOK Versie en voorkeuren info

//----------------------------------------

void SWversie (void)

{

#define FILENAAM ( strrchr (__FILE__, '\\') ? strrchr (__FILE__, '\\') + 1 : __FILE__)

PrintLijn (35);

voor (uint8_t i = 0; i < grootte van (menu) / grootte van (menu[0]); Tekstprintln (menu[ i ++]));

...

PrintLijn (35);

}

leegte PrintLine (byte lengte)

{...}


Displaytime () print de tijd naar de seriële monitor als tekst en controlewiich taal wordt geprint.
Het stuurt ook de juiste volgorde van kleur en intensiteiten naar een RGB(W) LED-strip.

//--------------------------------------------
// KLOK Zeg de tijd en laad de LED's// met de juiste kleur en intensiteit

//----------------------------------------

void Weergavetijd (void)

{
..

switch(Taal) // Druk alle tekens op de achtergrond af kleur , een soort ClearScreen

{

geval 0: strncpy ( Template,"HETVISOWASOVIJFQPRECIESZSTIENKPFKWARTSVOORS

OVERAHALFSMIDDERTVIJFATWEESOEENOXVIERELFQTIENK

TWAALFBHDRIE CNEGENACHTFZESVZEVENOENVUUR",129);
        ColorLeds (Sjabloon,0,127, Mem.DimmedLetter );

Nederlands(); Print_tijd (); pauze;

geval 1:
...

}


Een reeks functies om tijd op te halen en op te slaan. De NTP-tijdserver plaatst de opgehaalde tijd in de standaard C-tijdstructuren.

//--------------------------- Tijdfuncties --------------------------

 

leeg GetTijd (byte printit )

leegte Print_RTC_tijd ( leeg )

leegte PrintNTP_tijd ( void )

leegte AfdrukkenUTCtijd ( void )

void Print_tijd (void)

ongeldige SetRTCTime (ongeldig)

 

Converteer een HEX-tekenreeks naar een ongetekend 32-bits geheel getal

//----------------------------------------

// KLOK Converteer Hex naar uint32

//----------------------------------------

uint32_t HexToDec (String hexString )

Functies om de klokken de tijd in vier talen te laten spreken

Er is ook veel straattaal in talen.
'Half nine' betekent soms 8:30, maar kan ook 9:30 zijn. (-:

/-------------------------------------------
// KLOK Nederlandse klokweergave//--------------------------------------------void Nederlands(void){HET; // HET is altijd onswitch ( timeinfo.tm_min )
{case 0: IS; PRECIES; break;case 1: IS; break;case 2:case 3: WAS; break;case 4:case 5:...

void Engels(void)void Duits(void)void Frans(void)


De Bluetooth Low Energy Nordic nRF- functies.
Ze verschillen van het Texas-instrument CC2540/CC2541 dat wordt gebruikt in andere chipsets zoals de HM-10, HM16, JDY-08 enzovoort.
Meer hier op Instructables https://www.instructables.com/Communicate-Using-CC254x-or-NRF-BLE-With-Arduino-a/


/---------------------------

// BLE SendMessage door BLE Traag in pakketten van 20 tekens

//----------------------------

leegte SendMessageBLE ( std :: string Bericht)

/---------------------------

// BLE Start BLE- klassen

//----------------------------

klasse MyServerCallbacks : openbare BLEServerCallbacks

 

/---------------------------

// BLE Start BLE-service

//----------------------------

ongeldige StartBLEService (void)

 

/---------------------------

// BLE- controleBLE

//----------------------------

ongeldig CheckBLE (ongeldig)


Functies om een WIFI-verbinding te starten en de webpagina te gebruiken


/----------------------------------------

// WIFI WEBPAGINA

//----------------------------------------

ongeldig StartWIFI_NTP (ongeldig)

 

/----------------------------------------

// WIFI WEBPAGINA

//----------------------------------------

lege webpagina (void)

 

/----------------------------------------

// WIFI WEBPAGE Niet gevonden bericht

//----------------------------------------

void niet gevonden ( AsyncWebServerRequest *request)




 

Tijdzones


Kopieer de tekst tussen de aanhalingstekens en plak deze na het teken E en stuur deze naar de klok

Bijvoorbeeld EGMT0.

 

  Afrika/Abidjan,"GMT0"

Afrika/Accra,"GMT0"

Afrika/Addis_Ababa,"EAT-3"

Afrika/Algiers,"CET-1"

Afrika/Asmara,"EAT-3"

Afrika/Bamako,"GMT0"

Afrika/Bangui,"WAT-1"

Afrika/Banjul,"GMT0"

Afrika/Bissau,"GMT0"

Afrika/Blantyre,"CAT-2"

 Afrika/Brazzaville,"WAT-1"

Afrika/Bujumbura,"CAT-2"

Afrika/Caïro,"EET-2"

Afrika/Casablanca,"<+01>-1"

Afrika/Ceuta,"CET-1CEST,M3.5.0,M10.5.0/3"

Afrika/Conakry,"GMT0"

Afrika/Dakar,"GMT0"

Afrika/Dar_es_Salaam,"EAT-3"

Afrika/Djibouti,"EAT-3"

Afrika/Douala,"WAT-1"

 Afrika / El_Aaiun ,"<+01>-1"

 Afrika /Freetown,"GMT0"

 Afrika/Gaborone,"CAT-2"

Afrika/Harare,"CAT-2"

 Afrika/Johannesburg,"SAST-2"

Afrika/Juba,"CAT-2"

Afrika/Kampala,"EAT-3"

Afrika/Khartoem,"CAT-2"

Afrika/Kigali,"CAT-2"

 Afrika /Kinshasa,"WAT-1"

 Afrika /Lagos,"WAT-1"

 Afrika /Libreville,"WAT-1"

 Afrika/Lomé,"GMT0"

Afrika/Luanda,"WAT-1"

Afrika/Lubumbashi,"CAT-2"

Afrika/Lusaka,"CAT-2"

Afrika/Malabo,"WAT-1"

Afrika/Maputo,"CAT-2"

Afrika/Maseru,"SAST-2"

Afrika/Mbabane,"SAST-2"

Afrika/Mogadishu,"EAT-3"

Afrika/Monrovia,"GMT0"

Afrika/Nairobi,"EAT-3"

Afrika/Ndjamena,"WAT-1"

Afrika/Niamey,"WAT-1"

Afrika/Nouakchott,"GMT0"

Afrika/Ouagadougou,"GMT0"

 Afrika/Porto-Novo,"WAT-1"

Afrika/Sao_Tome,"GMT0"

 Afrika/Tripoli,"EET-2"

Afrika/Tunis,"CET-1"

Afrika/Windhoek,"CAT-2"

Amerika/Adak,"HST10HDT,M3.2.0,M11.1.0"

 Amerika/Anchorage,"AKST9AKDT,M3.2.0,M11.1.0"

Amerika/Anguilla,"AST4"

 Amerika /Antigua,"AST4"

 Amerika / Araguaina ,"<-03>3"

 Amerika /Argentinië/ Buenos_Aires ,"<-03>3"

 Amerika /Argentinië/Catamarca,"<-03>3"

 Amerika /Argentinië/ Cordoba ,"<-03>3"

 Amerika /Argentinië/Jujuy,"<-03>3"

 Amerika /Argentinië/ La_Rioja , "<-03>3"

 Amerika /Argentinië/Mendoza,"<-03>3"

 Amerika /Argentinië/ Rio_Gallegos ,"<-03>3"

 Amerika /Argentinië/Salta,"<-03>3"

 Amerika /Argentinië/ San_Juan , "<-03>3"

 Amerika /Argentinië/ San_Luis , "<-03>3"

 Amerika /Argentinië/ Tucuman , "<-03>3"

 Amerika /Argentinië/Ushuaia,"<-03>3"

 Amerika /Aruba,"AST4"

 Amerika / Asuncion , "<-04>4<-03>,M10.1.0/0,M3.4.0/0"

 Amerika /Atikokan,"EST5"

 Amerika / Bahia ,"<-03>3"

 Amerika /Bahia_Banderas,"CST6CDT,M4.1.0,M10.5.0"

 Amerika /Barbados,"AST4"

 Amerika /Belem,"<-03>3"

 Amerika /Belize,"CST6"

 Amerika /Blanc-Sablon,"AST4"

 Amerika / Boa_Vista ,"<-04>4"

 Amerika / Bogota ,"<-05>5"

 Amerika/Boise,"MST7MDT,M3.2.0,M11.1.0"

Amerika/Cambridge_Bay,"MST7MDT,M3.2.0,M11.1.0"

Amerika/ Campo_Grande , "<-04>4"

Amerika/Cancun,"EST5"

Amerika/Caracas,"<-04>4"

Amerika/Cayenne,"<-03>3"

Amerika/Cayman,"EST5"

Amerika/Chicago,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Chihuahua,"MST7MDT,M4.1.0,M10.5.0"

Amerika/Costa_Rica,"CST6"

Amerika/Creston,"MST7"

Amerika/ Cuiaba ,"<-04>4"

Amerika/Curaçao,"AST4"

Amerika/Danmarkshavn,"GMT0"

Amerika/Dawson,"MST7"

Amerika/Dawson_Creek,"MST7"

Amerika/Denver,"MST7MDT,M3.2.0,M11.1.0"

Amerika/Detroit,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Dominica,"AST4"

Amerika/Edmonton,"MST7MDT,M3.2.0,M11.1.0"

Amerika/ Eirunepe ,"<-05>5"

 Amerika /El_Salvador,"CST6"

 Amerika /Fortaleza,"<-03>3"

 Amerika/Fort_Nelson,"MST7"

Amerika/Glace_Bay,"AST4ADT,M3.2.0,M11.1.0"

Amerika/Godthab,"<-03>3<-02>,M3.5.0/-2,M10.5.0/-1"

Amerika/Goose_Bay,"AST4ADT,M3.2.0,M11.1.0"

Amerika/Grand_Turk,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Grenada,"AST4"

Amerika/Guadeloupe,"AST4"

Amerika/Guatemala,"CST6"

Amerika/Guayaquil,"<-05>5"

Amerika/Guyana,"<-04>4"

 Amerika /Halifax,"AST4ADT,M3.2.0,M11.1.0"

 Amerika /Havana,"CST5CDT,M3.2.0/0,M11.1.0/1"

 Amerika /Hermosillo,"MST7"

 Amerika/Indiana/Indianapolis,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Indiana/Knox,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Indiana/Marengo,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Indiana/Petersburg,"EST5EDT,M3.2.0,M11.1.0"

 Amerika/Indiana/Tell_City,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Indiana/Vevay,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Indiana/Vincennes,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Indiana/Winamac,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Inuvik,"MST7MDT,M3.2.0,M11.1.0"

Amerika/Iqaluit,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Jamaica,"EST5"

Amerika/Juneau,"AKST9AKDT,M3.2.0,M11.1.0"

Amerika/Kentucky/Louisville,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Kentucky/Monticello,"EST5EDT,M3.2.0,M11.1.0"

 Amerika /Kralendijk,"AST4"

 Amerika / La_Paz ,"<-04>4"

 Amerika /Lima,"<-05>5"

 Amerika /Los_Angeles,"PST8PDT,M3.2.0,M11.1.0"

 Amerika /Lower_Princes,"AST4"

 Amerika / Maceió ,"<-03>3"

 Amerika /Managua,"CST6"

 Amerika / Manaus ,"<-04>4"

 Amerika /Marigot,"AST4"

 Amerika /Martinique,"AST4"

 Amerika /Matamoros,"CST6CDT,M3.2.0,M11.1.0"

 Amerika/Mazatlan,"MST7MDT,M4.1.0,M10.5.0"

Amerika/Menominee,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Merida,"CST6CDT,M4.1.0,M10.5.0"

Amerika/Metlakatla,"AKST9AKDT,M3.2.0,M11.1.0"

 Amerika /Mexico_Stad,"CST6CDT,M4.1.0,M10.5.0"

 Amerika / Miquelon , "<-03>3<-02>,M3.2.0,M11.1.0"

 Amerika /Moncton,"AST4ADT,M3.2.0,M11.1.0"

 Amerika /Monterrey,"CST6CDT,M4.1.0,M10.5.0"

 Amerika /Montevideo,"<-03>3"

 Amerika /Montreal,"EST5EDT,M3.2.0,M11.1.0"

 Amerika /Montserrat,"AST4"

 Amerika /Nassau,"EST5EDT,M3.2.0,M11.1.0"

 Amerika /New_York,"EST5EDT,M3.2.0,M11.1.0"

 Amerika /Nipigon,"EST5EDT,M3.2.0,M11.1.0"

 Amerika/Nome,"AKST9AKDT,M3.2.0,M11.1.0"

Amerika/Noronha,"<-02>2"

Amerika/ Noord_Dakota /Beulah,"CST6CDT,M3.2.0,M11.1.0"

Amerika/ Noord_Dakota / Centrum,"CST6CDT,M3.2.0,M11.1.0"

 Amerika/ Noord_Dakota / New_Salem,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Nuuk,"<-03>3<-02>,M3.5.0/-2,M10.5.0/-1"

Amerika/Ojinaga,"MST7MDT,M3.2.0,M11.1.0"

Amerika/Panama,"EST5"

Amerika/Pangnirtung,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Paramaribo,"<-03>3"

Amerika/Phoenix,"MST7"

 Amerika/Port-au-Prince,"EST5EDT,M3.2.0,M11.1.0"

 Amerika/Port_of_Spain,"AST4"

Amerika/ Porto_Velho , "<-04>4"

Amerika/Puerto_Rico,"AST4"

Amerika/ Punta_Arenas , "<-03>3"

Amerika/Regenachtige_rivier,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Rankin_Inlet,"CST6CDT,M3.2.0,M11.1.0"

Amerika/Recife,"<-03>3"

Amerika/Regina,"CST6"

Amerika/Resolute,"CST6CDT,M3.2.0,M11.1.0"

Amerika/ Rio_Branco ,"<-05>5"

Amerika/Santarem,"<-03>3"

Amerika/Santiago,"<-04>4<-03>,M9.1.6/24,M4.1.6/24"

Amerika/Santo_Domingo,"AST4"

 Amerika/ Sao_Paulo ,"<-03>3"

Amerika/ Scoresbysund ,"<-01>1<+00>,M3.5.0/0,M10.5.0/1"

 Amerika/Sitka,"AKST9AKDT,M3.2.0,M11.1.0"

 Amerika/St_Barthelemy,"AST4"

Amerika/St_Johns,"NST3:30NDT,M3.2.0,M11.1.0"

Amerika/St_Kitts,"AST4"

Amerika/St_Lucia,"AST4"

Amerika/St_Thomas,"AST4"

Amerika/St_Vincent,"AST4"

Amerika/Swift_Current,"CST6"

Amerika/Tegucigalpa,"CST6"

Amerika/Thule,"AST4ADT,M3.2.0,M11.1.0"

Amerika/Thunder_Bay,"EST5EDT,M3.2.0,M11.1.0"

 Amerika /Tijuana,"PST8PDT,M3.2.0,M11.1.0"

 Amerika/Toronto,"EST5EDT,M3.2.0,M11.1.0"

Amerika/Tortola,"AST4"

Amerika/Vancouver,"PST8PDT,M3.2.0,M11.1.0"

Amerika/Whitehorse,"MST7"

Amerika/Winnipeg,"CST6CDT,M3.2.0,M11.1.0"

 Amerika/Yakutat,"AKST9AKDT,M3.2.0,M11.1.0"

Amerika/Yellowknife,"MST7MDT,M3.2.0,M11.1.0"

Antarctica/Casey,"<+11>-11"

Antarctica/Davis,"<+07>-7"

Antarctica/ DumontD'Urville ,"<+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 / Trol ,"<+00>0<+02>-2,M3.5.0/1,M10.5.0/3"

 Antarctica / Vostok ,"<+06>-6"

 Arctisch /Longyearbyen,"CET-1CEST,M3.5.0,M10.5.0/3"

 Azië/Aden,"<+03>-3"

Azië/Almaty,"<+06>-6"

Azië/Amman,"EET-2EEST,M2.5.4/24,M10.5.5/1"

Azië/Anadyr,"<+12>-12"

Azië/ Aqtau ,"<+05>-5"

Azië/ Aqtobe ,"<+05>-5"

Azië/ Ashgabat ,"<+05>-5"

 Azië/Atyrau,"<+05>-5"

Azië/Bagdad,"<+03>-3"

Azië/Bahrein,"<+03>-3"

Azië/Bakoe,"<+04>-4"

Azië/Bangkok,"<+07>-7"

Azië/Barnaul,"<+07>-7"

Azië/Beiroet,"EET-2EEST,M3.5.0/0,M10.5.0/0"

 Azië/Bisjkek,"<+06>-6"

Azië/Brunei,"<+08>-8"

Azië/ Tsjita ,"<+09>-9"

 Azië/Tsjojbalsan,"<+08>-8"

Azië/Colombo,"<+0530>-5:30"

Azië/Damascus,"EET-2EEST,M3.5.5/0,M10.5.5/0"

 Azië/Dhaka,"<+06>-6"

Azië/Dili,"<+09>-9"

Azië/Dubai,"<+04>-4"

Azië/ Dushanbe ,"<+05>-5"

Azië/Famagusta,"EET-2EEST,M3.5.0/3,M10.5.0/4"

 Azië /Gaza,"EET-2EEST,M3.4.4/48,M10.5.5/1"

 Azië/Hebron,"EET-2EEST,M3.4.4/48,M10.5.5/1"

Azië/ Ho_Chi_Minh ,"<+07>-7"

Azië/Hongkong,"HKT-8"

Azië/ Hovd ,"<+07>-7"

Azië/Irkoetsk,"<+08>-8"

Azië/Jakarta,"WIB-7"

Azië/Jayapura,"WIT-9"

 Azië/Jeruzalem,"IST-2IDT,M3.4.4/26,M10.5.0"

Azië/Kaboel,"<+0430>-4:30"

 Azië/ Kamtsjatka ,"<+12>-12"

Azië/Karachi,"PKT-5"

Azië/Kathmandu,"<+0545>-5:45"

Azië/ Khandyga ,"<+09>-9"

Azië/Kolkata,"IST-5:30"

Azië/ Krasnojarsk ,"<+07>-7"

Azië/ Kuala_Lumpur ,"<+08>-8"

Azië/ Kuching ,"<+08>-8"

Azië/Koeweit,"<+03>-3"

Azië/Macau,"CST-8"

Azië/ Magadan ,"<+11>-11"

Azië/Makassar,"WITA-8"

Azië/Manilla,"PST-8"

Azië/ Muscat ,"<+04>-4"

Azië/Nicosia,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Azië/Novokoeznetsk,"<+07>-7"

Azië/Novosibirsk,"<+07>-7"

Azië/Omsk,"<+06>-6"

 Azië/Oraal,"<+05>-5"

Azië/ Phnom_Penh ,"<+07>-7"

 Azië/Pontianak,"WIB-7"

Azië/Pyongyang,"KST-9"

Azië/Qatar,"<+03>-3"

Azië/ Qyzylorda ,"<+05>-5"

Azië/ Riyad ,"<+03>-3"

Azië/ Sachalin ,"<+11>-11"

Azië/Samarkand,"<+05>-5"

Azië/Seoul,"KST-9"

Azië/Shanghai,"CST-8"

Azië/Singapore,"<+08>-8"

Azië/ Srednekolymsk , "<+11>-11"

Azië/Taipei,"CST-8"

Azië/ Tasjkent ,"<+05>-5"

Azië/Tbilisi,"<+04>-4"

Azië/ Teheran ,"<+0330>-3:30<+0430>,J79/24,J263/24"

Azië/Thimphu,"<+06>-6"

Azië/Tokio,"JST-9"

Azië/ Tomsk ,"<+07>-7"

Azië/Ulaanbaatar,"<+08>-8"

Azië/ Urumqi ,"<+06>-6"

Azië/ Oest-Nera ,"<+10>-10"

Azië/Vientiane,"<+07>-7"

Azië/Vladivostok,"<+10>-10"

Azië/ Jakoetsk ,"<+09>-9"

Azië/Yangon,"<+0630>-6:30"

 Azië/Jekaterinenburg,"<+05>-5"

Azië/Jerevan,"<+04>-4"

Atlantische Oceaan/Azoren,"<-01>1<+00>,M3.5.0/0,M10.5.0/1"

Atlantische Oceaan/Bermuda,"AST4ADT,M3.2.0,M11.1.0"

Atlantische Oceaan/Canarische Oceaan,"WET0WEST,M3.5.0/1,M10.5.0"

Atlantische Oceaan/ Kaapverdië ,"<-01>1"

Atlantische Oceaan/Faeröer,"WET0WEST,M3.5.0/1,M10.5.0"

Atlantische Oceaan/Madeira,"WET0WEST,M3.5.0/1,M10.5.0"

Atlantische Oceaan/Reykjavik,"GMT0"

Atlantische Oceaan/ Zuid_Georgia ,"<-02>2"

Atlantische Oceaan/Stanley,"<-03>3"

Atlantische Oceaan/St_Helena,"GMT0"

 Australië/Adelaide,"ACST-9:30ACDT,M10.1.0,M4.1.0/3"

Australië/Brisbane,"AEST-10"

 Australië/Broken_Hill,"ACST-9:30ACDT,M10.1.0,M4.1.0/3"

 Australië/Currie,"AEST-10AEDT,M10.1.0,M4.1.0/3"

Australië/Darwin,"ACST-9:30"

Australië/ Eucla ,"<+0845>-8:45"

Australië/Hobart,"AEST-10AEDT,M10.1.0,M4.1.0/3"

Australië/Lindeman,"AEST-10"

Australië/ Lord_Howe ,"<+1030>-10:30<+11>-11,M10.1.0,M4.1.0"

Australië/Melbourne,"AEST-10AEDT,M10.1.0,M4.1.0/3"

Australië/Perth,"AWST-8"

Australië/Sydney,"AEST-10AEDT,M10.1.0,M4.1.0/3"

Europa/Amsterdam,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Andorra,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Astrachan,"<+04>-4"

Europa/Athene,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Belgrado,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Berlijn,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Bratislava,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Brussel,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Boekarest,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Boedapest,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Busingen,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Chisinau,"EET-2EEST,M3.5.0,M10.5.0/3"

Europa/Kopenhagen,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Dublin,"IST-1GMT0,M10.5.0,M3.5.0/1"

 Europa/Gibraltar,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Guernsey,"GMT0BST,M3.5.0/1,M10.5.0"

 Europa/Helsinki,"EET-2EEST,M3.5.0/3,M10.5.0/4"

 Europa/Isle_of_Man,"GMT0BST,M3.5.0/1,M10.5.0"

Europa/Istanboel,"<+03>-3"

Europa/Jersey,"GMT0BST,M3.5.0/1,M10.5.0"

Europa/Kaliningrad,"EET-2"

Europa/Kiev,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Kirov,"<+03>-3"

Europa/Lissabon,"WET0WEST,M3.5.0/1,M10.5.0"

 Europa/Ljubljana,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Londen,"GMT0BST,M3.5.0/1,M10.5.0"

Europa/Luxemburg,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Madrid,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Malta,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa /Mariehamn,"EET-2EEST,M3.5.0/3,M10.5.0/4"

 Europa /Minsk,"<+03>-3"

 Europa/Monaco,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Moskou,"MSK-3"

Europa/Oslo,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Parijs,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Podgorica,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Praag,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Riga,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Rome,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Samara,"<+04>-4"

Europa/San_Marino,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Sarajevo,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Saratov,"<+04>-4"

Europa/Simferopol,"MSK-3"

 Europa/Skopje,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Sofia,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Stockholm,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Tallinn,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Tirane,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/ Oeljanovsk ,"<+04>-4"

Europa/Oezjhorod,"EET-2EEST,M3.5.0/3,M10.5.0/4"

Europa/Vaduz,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Vaticaan,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Wenen,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Vilnius,"EET-2EEST,M3.5.0/3,M10.5.0/4"

 Europa/Volgograd,"<+03>-3"

Europa/Warschau,"CET-1CEST,M3.5.0,M10.5.0/3"

Europa/Zagreb,"CET-1CEST,M3.5.0,M10.5.0/3"

 Europa/Zaporozhye,"EET-2EEST,M3.5.0/3,M10.5.0/4"

 Europa/Zürich,"CET-1CEST,M3.5.0,M10.5.0/3"

 Indiaas /Antananarivo,"EAT-3"

 Indiaas /Chagos,"<+06>-6"

 Indiaas /Kerstmis,"<+07>-7"

 Indiaas /Cocos,"<+0630>-6:30"

 Indiaas /Comoren,"EAT-3"

 Indiaas /Kerguelen,"<+05>-5"

 Indiaas /Mahe,"<+04>-4"

 Indiaas /Malediven,"<+05>-5"

 Indiaas /Mauritius,"<+04>-4"

 Indiaas /Mayotte,"EAT-3"

 Indiaas / Reünie ,"<+04>-4"

Stille Oceaan/Apia,"<+13>-13"

Stille Oceaan/Auckland,"NZST-12NZDT,M9.5.0,M4.1.0/3"

 Stille Oceaan/Bougainville,"<+11>-11"

Stille Oceaan/Chatham,"<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45"

Stille Oceaan/Chuuk,"<+10>-10"

Pacific/Pasen,"<-06>6<-05>,M9.1.6/22,M4.1.6/22"

Pacific/Efate,"<+11>-11"

Stille Oceaan/ Enderbury ,"<+13>-13"

Stille Oceaan/Fakaofo,"<+13>-13"

Stille Oceaan/Fiji,"<+12>-12<+13>,M11.2.0,M1.2.3/99"

Stille Oceaan/Funafuti,"<+12>-12"

Stille Oceaan/Galapagos,"<-06>6"

Pacific/Gambier,"<-09>9"

 Stille Oceaan / Guadalcanal,"<+11>-11"

 Stille Oceaan /Guam,"ChST-10"

 Stille Oceaan / Honolulu,"HST10"

 Stille Oceaan / Kiritimati , "<+14>-14"

 Stille Oceaan / Kosrae ,"<+11>-11"

 Stille Oceaan / Kwajalein , "<+12>-12"

 Stille Oceaan / Majuro ,"<+12>-12"

 Pacific /Marquesas,"<-0930>9:30"

 Stille Oceaan /Midway,"SST11"

 Stille Oceaan /Nauru,"<+12>-12"

 Stille Oceaan /Niue,"<-11>11"

 Stille Oceaan/Norfolk,"<+11>-11<+12>,M10.1.0,M4.1.0/3"

Stille Oceaan/ Noumea ,"<+11>-11"

Pacific/Pago_Pago,"SST11"

Stille Oceaan/Palau,"<+09>-9"

Stille Oceaan/Pitcairn,"<-08>8"

Stille Oceaan/Pohnpei,"<+11>-11"

 Stille Oceaan/ Port_Moresby ,"<+10>-10"

Stille Oceaan/Rarotonga,"<-10>10"

Stille Oceaan/Saipan,"ChST-10"

Stille Oceaan/Tahiti,"<-10>10"

Stille Oceaan/Tarawa,"<+12>-12"

Stille Oceaan/Tongatapu,"<+13>-13"

Pacific/Kielzog,"<+12>-12"

 Stille Oceaan/Wallis,"<+12>-12"

 enz. /GMT,"GMT0"

 enz. /GMT-0,"GMT0"

 enz. /GMT-1,"<+01>-1"

 enz. /GMT-2,"<+02>-2"

 enz. /GMT-3,"<+03>-3"

 enz. /GMT-4,"<+04>-4"

 enz. /GMT-5,"<+05>-5"

 enz. /GMT-6,"<+06>-6"

 enz. /GMT-7,"<+07>-7"

 enz. /GMT-8,"<+08>-8"

 enz. /GMT-9,"<+09>-9"

 enz. /GMT-10,"<+10>-10"

 enz. /GMT-11,"<+11>-11"

 enz. /GMT-12,"<+12>-12"

 enz. /GMT-13,"<+13>-13"

 enz. /GMT-14,"<+14>-14"

 enz. /GMT0,"GMT0"

 enz. /GMT+0,"GMT0"

 enz. /GMT+1,"<-01>1"

 enz. /GMT+2,"<-02>2"

 enz. /GMT+3,"<-03>3"

 enz. /GMT+4,"<-04>4"

 enz. /GMT+5,"<-05>5"

 enz. /GMT+6,"<-06>6"

 enz. /GMT+7,"<-07>7"

 enz. /GMT+8,"<-08>8"

 enz. /GMT+9,"<-09>9"

 enz. /GMT+10,"<-10>10"

 enz. /GMT+11,"<-11>11"

 enz. /GMT+12,"<-12>12"

 enz. /UCT,"UTC0"

 enz. /UTC,"UTC0"

 enz. /Greenwich,"GMT0"

 Etc /Universeel,"UTC0"

 enz. /Zoeloe,"UTC0"