Når du bygger et IoT-projekt, der afhænger af tidspunktet på dagen, vil du have, at det skal vise det korrekte tidspunkt uden at have behov for manuelle justeringer. Det ser ud til, at dette ville være nemt at opnå med ESP32, da den har indbygget trådløs og kan oprette forbindelse til internettet.
Men mens der er masser af online eksempler, der viser, hvordan man konfigurerer ESP32 til at oprette forbindelse til internettet og synkronisere tiden med en tid server, kræver de fleste af dem, at du justerer for sommertid manuelt to gange om året, hvilket virker ret latterligt for enhver elektronisk elektronik fra det 21. århundrede. enhed.
Her vil vi præsentere dig for en løsning, der gør det muligt for ESP32 at vise den korrekte tid, for ethvert sted i verden, året rundt. Men først, lad os tage et kig på eksemplet SimpleTime i Arduino IDE og se, hvad det gør, og hvordan vi kan forbedre det.
SimpleTime-eksemplet
Hvis du bruger Arduino IDE med ESP32, vil du opdage, at den har et eksempel kaldet SimpleTime der ser sådan ud:
Du kan få adgang til dette eksempel ved at konfigurere Arduino IDE til at bruge et ESP32-kort fra Værktøjer menu, f.eks. ved at vælge ESP32-udviklermodul. Når du har gjort det, kan du få adgang til SimpleTime-eksemplet fra Værktøjer menuen under Eksempler,ESP32,Tid, og Simpel tid.
Man kunne forvente, at dette officielle eksempel viser den bedste måde at gøre tingene på, men der er et stort problem i dette eksempel. For at konfigurere tidszonen og sommertid skal du ændre følgende to linjer:
const lang gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
Indstilling af tidszonen vha gmtOffset_sec er ubelejligt, fordi du skal finde GMT-offset for netop din placering. Du kan gøre dette ved at konsultere Greenwich Mean Time hjemmeside. Heldigvis behøver du kun at gøre dette én gang. Det dagslysOffset_sek giver dog et større problem, fordi du skal justere den to gange om året. Dette kan kræve, at du tager dit projekt ned og tilslutter det til Arduino IDE to gange om året, hvilket gør det helt upassende for et IoT-projekt, som du vil konfigurere og glemme.
Leder efter en bedre tilgang
Så hvad ville være en bedre måde at konfigurere tidszonen og sommertid på? For at besvare dette spørgsmål skal du ikke lede længere end, hvordan din Windows-pc håndterer situationen:
Læg mærke til, hvordan vi i stedet for at skulle give det tidsforskydninger fra GMT fortæller Windows, hvad vores tidszone og placering er - i vores tilfælde Mountain Time (USA og Canada)-og derefter markere afkrydsningsfeltet Juster automatisk uret til sommertid. Fra det tidspunkt håndterer Windows det automatisk for os året rundt. Det er den slags bekvemmelighed, vi ønsker fra vores ESP32.
Relaterede: Sådan tilpasses systembakkeuret på Windows
Oprettelse af en placeringsdatabase til ESP32
At gøre det samme på ESP32 kræver noget benarbejde. vi startede med en blogindlæg der beskrev, hvordan man opsætter tidszonen ved hjælp af TZ-miljøvariablen. For vores placering var det tilfældigvis MST7MDT, M3.2.0, M11.1.0, ifølge denne tidszone tabel. Selvom dette løste problemet med at skulle manuelt justere til sommertid, ønskede vi processen skal være enklere, uden at det er nødvendigt at slå en række tal og bogstaver op for hver Beliggenhed.
Vi konverterede dataene fra hjemmesiden til en database, du kan bruge direkte fra dine Arduino-skitser. Følge med dette link at downloade en zip-fil direkte med Arduino-skitsen.
Selve databasen er gemt i filen tidszone.h. Ved hjælp af databasen ser koden til SimpleTime sådan ud:
Vi har fremhævet ændringerne af SimpleTime-eksemplet med gult. Denne linje giver skitsen mulighed for at bruge databasen:
#inkluder "tidszoner.h"
Denne linje konfigurerer din placering:
const char* location = "Amerika/Denver";
Der er 461 mulige lokationer. Du kan finde de tilgængelige steder ved at tage et kig på tidszone.h fil, eller ved at se på tidszonelisten på denne hjemmeside.
Til sidst fortæller følgende linje ESP32 om at synkronisere tiden med en internetserver ved hjælp af Network Time Protocol (NTP):
configTimeWithTz (getTzByLocation (placering), ntpServer);
Den bestemte internettidsserver kan konfigureres ved hjælp af følgende linje, selvom standarden burde fungere fint for dig:
const char* ntpServer = "pool.ntp.org";
Du vil også sørge for at tilføje oplysningerne for dit trådløse adgangspunkt på følgende to linjer:
const char* ssid = "DIT_SSID";
const char* password = "DIN_PASS";
Erstatte DIT_SSID med navnet på dit trådløse netværk og DIT_PASS med den adgangskode, der blev brugt til at oprette forbindelse til.
Relaterede: Måder at sikkert konfigurere en trådløs router som et offentligt adgangspunkt
Afslutning
Når du har gennemført konfigurationstrinnene, skal du uploade skitsen til ESP32, og den vil bruge den korrekte tid året rundt uden nogen indblanding!
Selvom denne kode giver dig et godt udgangspunkt, er der mere brugervenlige måder at opnå det samme på. For eksempel vil du måske tillade brugeren at konfigurere alt fra en webside i stedet for at få det gjort på kompileringstidspunktet. At gøre det er en del mere arbejde, da du skal gøre følgende i din Arduino-skitse:
- Konfigurer ESP32 som et trådløst adgangspunkt til indledende konfiguration
- Start en webserver for at præsentere brugeren for en konfigurationsside
- Opret en HTML-formular for at give brugeren mulighed for at indtaste oplysninger om det trådløse netværk og vælge deres placering
- Opret koden for at behandle brugerens valg og gem den i ikke-flygtig hukommelse
- Når kortet tændes:
- Læs konfigurationen fra ikke-flygtig hukommelse
- Opret forbindelse til det trådløse netværk og synkroniser tiden
Et projekt, der demonstrerer disse trin, er ESP32 Dali ur. Det var dette projekt, der førte os til at finde en bedre måde at lave tidssynkronisering på ESP32.
Tjek ud kildekode til ESP32 Dali Clock for at se, hvordan man viser en webkonfigurationsside med alle funktioner. Konfigurationssiden viser en rullemenu, så brugeren kan vælge sin placering og tidszone og giver også brugeren mulighed for at indstille klokkeslættet manuelt ved hjælp af en tids- og kalenderwidget, for en ikke-tilsluttet alternativ!
Lokalitetsbaseret netværkstidssynkronisering på ESP32
Du har nu alle de oplysninger, du har brug for, for automatisk at kunne indstille din ESP32s ur til det korrekte klokkeslæt, og også justere det til sommertid. Dette er perfekt til IoT-projekter, som du ikke ønsker at skulle justere manuelt.
Hvis du leder efter interessante projekter med ESP32, er du på det rigtige sted.
Læs Næste
- gør det selv
- ESP32
- Internet of Things

Jeg er en maker med en særlig interesse for open source-software, elektronik, 3D-print, computergrafik og retro-computing.
Abonner på vores nyhedsbrev
Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!
Klik her for at abonnere