Indholdsfortegnelse:

NODEMCU Lua ESP8266 med ur i realtid (RTC) og EEPROM: 7 trin
NODEMCU Lua ESP8266 med ur i realtid (RTC) og EEPROM: 7 trin

Video: NODEMCU Lua ESP8266 med ur i realtid (RTC) og EEPROM: 7 trin

Video: NODEMCU Lua ESP8266 med ur i realtid (RTC) og EEPROM: 7 trin
Video: How to Make PLC LCD HMI || FLProg 2024, November
Anonim
NODEMCU Lua ESP8266 Med ur i realtid (RTC) & EEPROM
NODEMCU Lua ESP8266 Med ur i realtid (RTC) & EEPROM

Det er vigtigt at få det korrekte tidspunkt, hvis du vil føre en datalog. Der er forskellige måder at få tiden fra kilder på Internettet.

Du kan spørge, hvorfor ikke bruge ESP8266 til at holde tid til dig? Det kan du godt, den har sin egen interne RTC (Real Time Clock), men ESP8266 har 3 forskellige driftsurfrekvenser - 52MHz når den starter, 80MHz under normal drift og 160MHz hvis boostet. Hvis du har brug for mere præcis tidsholdning, især over længere perioder, kan en ekstern RTC muligvis give en løsning. Disse moduler har også en batteribackup i tilfælde af strømtab. En RTC er ikke særlig nøjagtig, da den tæller den tid, der er gået siden den blev indstillet, og selvom den kan gøre det for de fleste applikationer, er den muligvis ikke god nok til kritisk tidsopbevaring. Det er muligt at få det nøjagtige tidspunkt fra en SNTP -tidsserver, hvorfra RTC kan opdateres med jævne mellemrum, hvis det kræves.

DS1307 Tiny RTC I2C -modulet (ovenfor) er et eksempel på disse varer og kan købes på Ebay og andre leverandører for mindre end £ 2. Der er også andre som DS1302 og DS3231, der fungerer på en lignende måde og koster fra 99p og opefter.

DS1307-modulet bruger et I2C-interface, og til en ESP-01 skal det tilsluttes som:

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

SDA og SCL kan tilsluttes enhver af I/O -benene på de større ESP8266'er (ændre koden i overensstemmelse hermed). Kun de venstre sidestifter skal tilsluttes på dette modul.

Trin 1: Google Time

Google Time
Google Time

Der er mange eksempler på at få tiden fra Google og se sådan ud. Når du kører GoogleTime.lua -programmet, får du et resultat som dette:

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

Problemet med denne metode er, at du får tiden i strengformat, og du skal opdele strengen i dens individuelle bits i timer, minutter, sekunder osv. RTC accepterer tiden i et specielt format, dvs. UNIX -tidsstempel. I lægmandsspørgsmål er dette antallet af sekunder, der er gået siden torsdag 1. januar 1970 til i dag og i dag. UNIX -epoken (1970/01/01 00:00:00) bruges af de fleste computeroperativsystemer, og den forløbne tid gemmes som et signeret 32 bit -nummer. Det betyder, at dette system vil fungere frem til den 19. januar 2038, når antallet bliver for stort til at gemme på denne måde. En løsning er at gemme tallet som 64 bit, men nu er 32 bit metoden tilstrækkelig.

For at indstille tiden til 2015 juli 9, 18:29:49 på den interne RTC ville du bruge denne kode linje:

rtctime.set (1436430589, 0)

De 2 parametre er sekunder og mikrosekunder.

Du kan finde flere oplysninger ved at læse NodeMCU -dokumentationen.

Trin 2: SNTP -tidsservere

SNTP -tidsservere
SNTP -tidsservere

Simple Network Time Protocol (SNTP) leveres fra mange kilder på Internettet, og mange lande i hele verden har denne service.

Programmet, SNTPTime2.lua indstiller tiden på den interne RTC. Du skal have rtctime & sntp -modulerne i din build, når du blinker din ESP8266. Programmet får tiden fra serveren på sekunder og mikrosekunder og indstiller den interne RTC med rtctime.set (sek, usec).

Programmet viser derefter dato og klokkeslæt i forskellige formater.

Der er mange SNTP -servere rundt om i verden, og nogle er som følger:

  • 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"},

Alle ovenstående kodelinjer kan erstattes i SNTPTime2.lua -programmet.

Der er flere SNTP -servere på nedenstående adresser, som igen kan bruges i programmet.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google leverer også tidsservere på disse adresser:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Du skal huske at få tiden fra det land, du er i, eller du skal muligvis ændre den for de forskellige verdens tidszoner. Nogle lande har også sommertid, så du skal muligvis også håndtere det.

Trin 3: Få tiden fra RTC -modulet

Få tiden fra RTC -modulet
Få tiden fra RTC -modulet

Programmet GetRTCTime.lua læser tiden fra den interne RTC.

Den første del læser tiden og viser den på sekunder og mikrosekunder.

Den anden del konverterer den til et mere læseligt format.

når du ringer til tm = rtctime.epoch2cal (rtctime.get ()) returnerer det:

  • år - 1970 ~ 2038
  • man - måned 1 ~ 12 i indeværende år
  • dag - dag 1 ~ 31 i indeværende måned
  • time
  • min
  • sek
  • dag - dag 1 ~ 366 i indeværende år
  • wday - dag 1 ~ 7 i den aktuelle uge (søndag er 1)

Hvert element kan fås som tm ["dag"], tm ["år"] …

Du kan finde flere oplysninger ved at læse NodeMCU -dokumentationen.

DisplaySNTPtime.lua er en mere detaljeret måde at vise dato og klokkeslæt på et LCD 128 x 64 OLED -display, da det let kan tilsluttes og kan bruges med disse programmer.

Trin 4: RTC -brugerhukommelse

En lille afvigelse fra tiden er den interne RTC på ESP8266 har 128 x 32 bit hukommelsesadresser, som programmereren kan få adgang til. De er især nyttige, da de kan overleve ESP8266s dybe søvncyklus. Det er op til programmereren at kontrollere deres brug og sikre, at de ikke overskrives ved et uheld.

Jeg har inkluderet RTCmem.lua, et simpelt program, der demonstrerer dets anvendelse. Du skal have rtcmem -modul i din build.

Trin 5: Eksterne RTC -moduler

Eksterne RTC -moduler
Eksterne RTC -moduler

De eksterne RTC-moduler opretter forbindelse til ESP8266 via I2C-grænsefladen, der kun bruger to I/O-ben og fungerer således med ESP-01 såvel som de fleste andre ESP8266-enheder.

RTC -modulets adresse er 0x68 og tilgås ved hjælp af de normale I2C -kommandoer. Der er dog noget at huske på, dataene i RTC -registre gemmes i BCD -format (base 16), så dine programmer skal håndtere dette. Tid og dato gemmes i 7 registre inden for RTC. På den interne RTC varetages BCD -konverteringerne af rtctime -modulet.

SetExtRTC.lua konverterer dataene til BCD og indstiller tiden.

ReadExtRTC.lua læser tidsdataene og udskriver dem. BEMÆRK: dataene udskrives i hexadecimal.

Jeg har ikke brugt meget tid på at formatere skærmen, da du måske har dine egne ideer om, hvad du vil gøre med dato og klokkeslæt. Dette er grundmotoren i sin enkleste form, så du kan udvikle den yderligere, hvis du ønsker det.

Trin 6: Datalogning

Datalogning
Datalogning

Hvis du ser nærmere på RTC -modulerne, vil du bemærke, at de har en AT24C32 EEPROM IC eller lignende indbygget i dem, eller du kan bruge et 24C256 -kort som ovenfor. De fleste af disse EEPROM IC'er har lignende pin -outs som ovenfor. De leveres med forskellige mængder opbevaring, men de er alle tilgængelige på samme måde. Da AT24C32 allerede er loddet på tavlen, kan den bruges direkte fra I2C på den eksterne RTC.

Hvis du kun har en 24C256 IC eller lignende, kan du sætte den op i et brødbræt, tilslutte A1, A2 og A3 til Gnd, Vcc til 3.3V og SDA OG SCL til I2C, WP kan efterlades flydende. Nogle EEPROM IC'er fungerer kun ved 5V, så tjek først det relevante datablad.

ByteWR.lua skriver 1 byte data til hukommelsesplacering 0x00 i EEPROM og læser det tilbage.

Desiderata.lua skriver et par linjer fra berømt tekst til EEPROM.

eeRead.lua læser data fra EEPROM og udskriver dem.

BEMÆRK: Disse programmer bør også fungere med andre EEPROM -tavler.

Trin 7: Konklusion

Jeg har forsøgt at vise, hvordan RTC og EEPROM fungerer til datalogning. Dette er bare en start for dig at udvikle videre. Du kan tilslutte forskellige enheder til I2C -bussen såsom lyssensorer, barometriske trykfølere, temperatur- og fugtighedsfølere og registrere dataene på EEPROM.

Anbefalede: