Innehållsförteckning:

NODEMCU Lua ESP8266 med realtidsklocka (RTC) och EEPROM: 7 steg
NODEMCU Lua ESP8266 med realtidsklocka (RTC) och EEPROM: 7 steg

Video: NODEMCU Lua ESP8266 med realtidsklocka (RTC) och EEPROM: 7 steg

Video: NODEMCU Lua ESP8266 med realtidsklocka (RTC) och EEPROM: 7 steg
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Juli
Anonim
NODEMCU Lua ESP8266 Med Real Time Clock (RTC) & EEPROM
NODEMCU Lua ESP8266 Med Real Time Clock (RTC) & EEPROM

Att få rätt tid är viktigt om du vill föra en datalogg. Det finns olika sätt att få tid från källor på Internet.

Du kan fråga varför inte använda ESP8266 för att hålla tid åt dig? Du kan väl, den har sin egen interna RTC (Real Time Clock), men ESP8266 har 3 olika driftsklockfrekvenser - 52MHz när den startar, 80MHz under vanlig drift och 160MHz om den förstärks. Om du behöver mer exakt tidshållning, särskilt under längre perioder, kan en extern RTC ge en lösning. Dessa moduler har också en batteribackup vid strömavbrott. En RTC är inte särskilt korrekt eftersom den räknar tiden som har gått sedan den sattes och även om den kan göra för de flesta applikationer är den kanske inte tillräckligt bra för att hålla kritisk tid. Det är möjligt att få en exakt tid från en SNTP -tidsserver från vilken RTC kan uppdateras med jämna mellanrum om det behövs.

DS1307 Tiny RTC I2C -modulen (ovan) är ett exempel på dessa artiklar och kan köpas på Ebay och andra leverantörer för mindre än £ 2. Det finns också andra som DS1302 och DS3231 som fungerar på ett liknande sätt och kostar från 99p och uppåt.

DS1307-modulen använder ett I2C-gränssnitt och för en ESP-01 bör anslutas som:

Vcc - 3.3v, Gnd - Gnd, SDA - D3, SCL - D4

SDA och SCL kan anslutas till någon av I/O -stiften på de större ESP8266: erna (ändra koden i enlighet därmed). Endast de vänstra sidostiften behöver anslutas till denna modul.

Steg 1: Google Time

Google Time
Google Time

Det finns många exempel på att få tid från Google och se ut ungefär så här. När du kör programmet GoogleTime.lua får du ett resultat så här:

dofile ("GoogleTime.lua")> Tid: fre 15 dec 2017 11:19:45 GMT

Problemet med den här metoden är att du får tiden i strängformat och du måste dela strängen i dess enskilda bitar i timmar, minuter, sekunder etc. RTC accepterar tiden i ett speciellt format, dvs UNIX -tidsstämpel. I lekmannas termer är detta antalet sekunder som har gått sedan torsdagen den 1 januari 1970 till idag och idag. UNIX -epoken (1970/01/01 00:00:00) används av de flesta datoroperativsystem och den förflutna tiden lagras som ett signerat 32 bitars nummer. Detta innebär att detta system kommer att fungera fram till 19 januari 2038 då antalet kommer att bli för stort för att lagras på detta sätt. En lösning är att lagra numret som 64 bitar, men för närvarande räcker 32 -bitarsmetoden.

För att ställa in tiden till 2015 juli 9, 18:29:49 på den interna RTC använder du denna kodrad:

rtctime.set (1436430589, 0)

De två parametrarna är sekunder och mikrosekunder.

Du kan hitta mer information om att läsa NodeMCU -dokumentationen.

Steg 2: SNTP -tidsservrar

SNTP -tidsservrar
SNTP -tidsservrar

Simple Network Time Protocol (SNTP) tillhandahålls från många källor på Internet, och många länder över hela världen har denna tjänst.

Programmet, SNTPTime2.lua ställer in tiden på den interna RTC. Du måste ha rtctime & sntp -modulerna i din build när du blinkar din ESP8266. Programmet får tiden från servern på sekunder och mikrosekunder och ställer in den interna RTC med rtctime.set (sek, usec).

Programmet visar sedan datum och tid i olika format.

Det finns många SNTP -servrar runt om i världen och några är följande:

  • sntp.sync ({"216.239.35.0"},
  • sntp.sync ({"0.uk.pool.ntp.org", "0.uk.pool.ntp.org"},
  • sntp.sync ({"3.uk.pool.ntp.org", "143.210.16.201"},
  • sntp.sync ({"0.uk.pool.ntp.org", "1.uk.pool.ntp.org", "3.uk.pool.ntp.org"},

Alla ovanstående kodrader kan ersättas med SNTPTime2.lua -programmet.

Det finns fler SNTP -servrar på nedanstående adresser som igen kan användas i programmet.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google tillhandahåller också tidsservrar på följande adresser:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Du måste komma ihåg att få tiden från landet du befinner dig i, eller så kan du behöva ändra den för de olika tidszonerna i världen. Vissa länder har också sommartid, så du kan behöva hantera det också.

Steg 3: Få tiden från RTC -modulen

Få tiden från RTC -modulen
Få tiden från RTC -modulen

Programmet GetRTCTime.lua läser tiden från den interna RTC.

Den första delen läser tiden och visar den på sekunder och mikrosekunder.

Den andra delen omvandlar den till ett mer mänskligt läsbart format.

när du ringer tm = rtctime.epoch2cal (rtctime.get ()) returnerar det:

  • år - 1970 ~ 2038
  • mån - månad 1 ~ 12 under innevarande år
  • dag - dag 1 ~ 31 i innevarande månad
  • timme
  • min
  • sek
  • dag - dag 1 ~ 366 under innevarande år
  • wday - dag 1 ~ 7 i innevarande vecka (söndag är 1)

Varje objekt kan nås som tm ["dag"], tm ["år"] …

Du kan hitta mer information om att läsa NodeMCU -dokumentationen.

DisplaySNTPtime.lua är ett mer genomarbetat sätt att visa datum och tid på en LCD 128 x 64 OLED -display, eftersom den enkelt kan anslutas och kan användas med dessa program.

Steg 4: RTC -användarminne

En liten avvikelse från tiden är den interna RTC på ESP8266 har 128 x 32 bitars minnesadresser som kan nås av programmeraren. De är särskilt användbara eftersom de kan överleva den djupa sömncykeln i ESP8266. Det är upp till programmeraren att kontrollera deras användning och se till att de inte skrivs över av misstag.

Jag har inkluderat RTCmem.lua, ett enkelt program som visar dess användning. Du måste ha rtcmem -modul i ditt bygge.

Steg 5: Externa RTC -moduler

Externa RTC -moduler
Externa RTC -moduler

De externa RTC-modulerna ansluter till ESP8266 via I2C-gränssnittet, som bara använder två I/O-stift och fungerar sålunda med ESP-01 som de flesta andra ESP8266-enheter.

RTC -modulens adress är 0x68 och nås med de vanliga I2C -kommandona. Det finns dock något att tänka på, data i RTC -registren lagras i BCD -format (bas 16), så dina program måste hantera detta. Tid och datum lagras i 7 register inom RTC. På den interna RTC sköts BCD -omvandlingarna av rtctime -modulen.

SetExtRTC.lua konverterar data till BCD och ställer in tiden.

ReadExtRTC.lua läser tidsdata och skriver ut dem. OBS: data skrivs ut hexadecimal.

Jag har inte lagt ner mycket tid på att formatera skärmen eftersom du kanske har dina egna idéer om vad du vill göra med datum och tid. Detta är grundmotorn i sin enklaste form, så att du kan utveckla den vidare om du vill.

Steg 6: Dataloggning

Dataloggning
Dataloggning

Om du tittar noga på RTC -modulerna kommer du att märka att de har en AT24C32 EEPROM IC eller liknande inbyggda i dem, eller så kan du använda ett 24C256 -kort enligt ovan. De flesta av dessa EEPROM IC har liknande pin -outs som ovan. De levereras med olika mängder lagring, men alla är tillgängliga på samma sätt. Eftersom AT24C32 redan är lödt på kortet kan den användas direkt från I2C för den externa RTC.

Om du bara har en 24C256 IC eller liknande kan du ställa in den i ett brödbräda, ansluta A1, A2 och A3 till Gnd, Vcc till 3.3V och SDA OCH SCL till I2C, WP kan lämnas flytande. Vissa EEPROM IC fungerar bara med 5V, så kontrollera det relevanta databladet först.

ByteWR.lua skriver 1 byte data till minnesplats 0x00 i EEPROM och läser tillbaka den.

Desiderata.lua skriver ett par rader från känd text till EEPROM.

eeRead.lua läser data från EEPROM och skriver ut dem.

OBS: Dessa program bör också fungera med andra EEPROM -kort.

Steg 7: Slutsats

Jag har försökt visa hur RTC och EEPROM fungerar för dataloggning. Detta är bara en förrätt för dig att utvecklas vidare. Du kan ansluta olika enheter till I2C -bussen som ljussensorer, barometriska trycksensorer, temperatur- och fuktsensorer och spela in data på EEPROM.

Rekommenderad: