När du bygger ett IoT-projekt som beror på tiden på dygnet vill du att det ska visa rätt tid utan att behöva manuella justeringar. Det verkar som att detta skulle vara lätt att åstadkomma med ESP32 eftersom den har inbyggt trådlöst och kan ansluta till Internet.

Men även om det finns massor av online-exempel som visar hur man konfigurerar ESP32 för att ansluta till Internet och synkronisera tiden med en tid server, de flesta av dem kräver att du justerar för sommartid manuellt två gånger om året, vilket verkar ganska löjligt för alla elektroniska apparater från 2000-talet. enhet.

Här kommer vi att presentera en lösning som gör att ESP32 kan visa den korrekta tiden, för vilken plats som helst i världen, året runt. Men först, låt oss ta en titt på exemplet SimpleTime i Arduino IDE och se vad det gör och hur vi kan förbättra det.

SimpleTime-exemplet

Om du använder Arduino IDE med ESP32 kommer du att upptäcka att den har ett exempel som kallas SimpleTime som ser ut så här:

Du kan komma åt det här exemplet genom att konfigurera Arduino IDE att använda ett ESP32-kort, från

instagram viewer
Verktyg menyn, till exempel genom att välja ESP32 Dev Module. När du har gjort det kan du komma åt SimpleTime-exemplet från Verktyg menyn under Exempel,ESP32,Tid, och Enkel tid.

Man kan förvänta sig att detta officiella exempel visar det bästa sättet att göra saker på, men det finns ett stort problem i det här exemplet. För att konfigurera tidszon och sommartid måste du ändra följande två rader:

const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;

Ställa in tidszonen med gmtOffset_sec är obekvämt eftersom du måste hitta GMT-offset för just din plats. Du kan göra detta genom att konsultera Greenwich Mean Time webbplats. Lyckligtvis behöver du bara göra detta en gång. De dagsljusOffset_sec utgör dock ett större problem, eftersom du behöver justera det två gånger om året. Detta kan kräva att du tar ner ditt projekt och kopplar upp det till Arduino IDE två gånger om året, vilket gör det helt olämpligt för ett IoT-projekt som du vill sätta upp och glömma.

Letar du efter ett bättre tillvägagångssätt

Så vad skulle vara ett bättre sätt att konfigurera tidszonen och sommartid? För att svara på den här frågan behöver du inte leta längre än hur din Windows-dator hanterar situationen:

Lägg märke till hur vi istället för att behöva ge det tidsförskjutningar från GMT berättar för Windows vad vår tidszon och plats är – i vårt fall Mountain Time (USA och Kanada)– och markera sedan kryssrutan Justera klockan automatiskt för sommartid. Från den tidpunkten hanterar Windows det automatiskt för oss året runt. Det här är den typ av bekvämlighet vi vill ha från vår ESP32.

Relaterad: Hur man anpassar systemfältsklockan på Windows

Skapa en platsdatabas för ESP32

Att göra samma sak på ESP32 kräver en del benarbete. vi började med en blogginlägg som beskrev hur man ställer in tidszonen med hjälp av miljövariabeln TZ. För vår plats råkade det vara det MST7MDT, M3.2.0, M11.1.0, enligt det här tidszonstabell. Även om detta löste problemet med att manuellt behöva justera för sommartid, ville vi processen ska bli enklare, utan att behöva slå upp en rad siffror och bokstäver för varje plats.

Vi konverterade data från webbplatsen till en databas som du kan använda direkt från dina Arduino-skisser. Följ den här länken för att direkt ladda ner en zip-fil med Arduino-skissen.

Själva databasen lagras i filen tidszon.h. Med hjälp av databasen ser koden för SimpleTime ut så här:

Vi har markerat ändringarna av SimpleTime-exemplet i gult. Den här raden gör det möjligt för skissen att använda databasen:

#inkludera "tidszoner.h"

Den här raden konfigurerar din plats:

const char* location = "Amerika/Denver";

Det finns 461 möjliga platser. Du kan hitta de tillgängliga platserna genom att ta en titt på tidszon.h fil, eller genom att titta på tidszonslistan på denna webbplats.

Slutligen, följande rad talar om för ESP32 att synkronisera tiden med en internetserver som använder Network Time Protocol (NTP):

configTimeWithTz (getTzByLocation (plats), ntpServer);

Den specifika Internet-tidsservern kan konfigureras med hjälp av följande rad, även om standarden borde fungera bra för dig:

const char* ntpServer = "pool.ntp.org";

Du vill också se till att lägga till informationen för din trådlösa åtkomstpunkt på följande två rader:

const char* ssid = "DITT_SSID";
const char* lösenord = "DITT_PASS";

Byta ut DIN_SSID med namnet på ditt trådlösa nätverk och YOUR_PASS med lösenordet som användes för att ansluta till det.

Relaterad: Sätt att säkert konfigurera en trådlös router som en offentlig åtkomstpunkt

Avslutar

När du har slutfört konfigurationsstegen, ladda upp skissen till ESP32 och den kommer att använda rätt tid året runt utan några ingrepp!

Även om den här koden ger dig en bra utgångspunkt, finns det mer användarvänliga sätt att åstadkomma samma sak. Till exempel kanske du vill tillåta användaren att konfigurera allt från en webbsida istället för att göra det vid kompileringstillfället. Att göra det är en hel del mer arbete, eftersom du skulle behöva göra följande saker i din Arduino-skiss:

  1. Konfigurera ESP32 som en trådlös åtkomstpunkt för initial konfiguration
  2. Starta en webbserver för att presentera en konfigurationssida för användaren
  3. Skapa ett HTML-formulär så att användaren kan ange information om det trådlösa nätverket och välja sin plats
  4. Skapa koden för att bearbeta användarens val och lagra den i ett icke-flyktigt minne
  5. När kortet slås på:
    • Läs konfigurationen från icke-flyktigt minne
    • Anslut till det trådlösa nätverket och synkronisera tiden

Ett projekt som visar dessa steg är ESP32 Dali klocka. Det var detta projekt som ledde till att vi hittade ett bättre sätt att göra tidssynkronisering på ESP32.

Bildkredit: Marcio Teixeira/Flickr

Kolla in källkod för ESP32 Dali Clock för att se hur man visar en fullfjädrad webbkonfigurationssida. Konfigurationssidan visar en rullgardinsmeny så att användaren kan välja sin plats och tidszon och gör det också möjligt för användaren att ställa in tiden manuellt med hjälp av en tid- och kalenderwidget, för en icke-ansluten alternativ!

Platsbaserad nätverkstidssynkronisering på ESP32

Du har nu all information du behöver för att automatiskt kunna ställa in din ESP32:s klocka på rätt tid, och även justera den för sommartid. Detta är perfekt för IoT-projekt som du inte vill behöva justera manuellt.

7 intressanta projekt som använder ESP32 för att skapa kompositvideo

Om du letar efter intressanta projekt med ESP32 är du på rätt plats.

Läs Nästa

Dela med sigTweetE-post
Relaterade ämnen
  • DIY
  • ESP32
  • Internet of Things
Om författaren
Marcio Teixeira (4 publicerade artiklar)

Jag är en tillverkare med ett speciellt intresse för programvara med öppen källkod, elektronik, 3D-utskrift, datorgrafik och retrodatorer.

Mer från Marcio Teixeira

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!

Klicka här för att prenumerera