Inhoudsopgave:

NODEMCU Lua ESP8266 met real-time klok (RTC) & EEPROM - Ajarnpa
NODEMCU Lua ESP8266 met real-time klok (RTC) & EEPROM - Ajarnpa

Video: NODEMCU Lua ESP8266 met real-time klok (RTC) & EEPROM - Ajarnpa

Video: NODEMCU Lua ESP8266 met real-time klok (RTC) & EEPROM - Ajarnpa
Video: FLProg7: часы реального времени и температура | ESP32 NodeMCU | Визуальное программирование для 2024, November
Anonim
NODEMCU Lua ESP8266 met realtime klok (RTC) & EEPROM
NODEMCU Lua ESP8266 met realtime klok (RTC) & EEPROM

De juiste tijd krijgen is essentieel als u een datalog wilt bijhouden. Er zijn verschillende manieren om de tijd uit bronnen op internet te halen.

U vraagt zich misschien af waarom u de ESP8266 niet gebruikt om de tijd voor u bij te houden? Dat kan, het heeft zijn eigen interne RTC (Real Time Clock), maar de ESP8266 heeft 3 verschillende werkende klokfrequenties - 52 MHz wanneer het opstart, 80 MHz tijdens normaal gebruik en 160 MHz als het wordt versterkt. Als u een nauwkeurigere tijdregistratie nodig heeft, vooral over langere periodes, dan kan een externe RTC een oplossing bieden. Deze modules hebben ook een batterij back-up in geval van stroomuitval. Een RTC is niet erg nauwkeurig omdat het de tijd telt die is verstreken sinds het is ingesteld en hoewel het voor de meeste toepassingen kan werken, is het misschien niet goed genoeg voor kritieke tijdregistratie. Het is mogelijk om een nauwkeurige tijd te krijgen van een SNTP-tijdserver waarvan de RTC indien nodig met regelmatige tussenpozen kan worden bijgewerkt.

De DS1307 Tiny RTC I2C-module (hierboven) is een voorbeeld van deze items en kan op Ebay en andere leveranciers worden gekocht voor minder dan £ 2. Er zijn ook andere zoals de DS1302 en DS3231 die op een vergelijkbare manier werken en vanaf 99 pence kosten.

De DS1307-module gebruikt een I2C-interface en moet voor een ESP-01 worden aangesloten als:

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

SDA en SCL kunnen worden aangesloten op een van de I/O-pinnen op de grotere ESP8266's (pas de code dienovereenkomstig aan). Op deze module hoeven alleen de pinnen aan de linkerkant te worden aangesloten.

Stap 1: Google Tijd

Google Tijd
Google Tijd

Er zijn veel voorbeelden van het verkrijgen van de tijd van Google en zien er ongeveer zo uit. Wanneer u het programma GoogleTime.lua uitvoert, krijgt u het volgende resultaat:

dofile("GoogleTime.lua")> Tijd: vr, 15 december 2017 11:19:45 GMT

Het probleem met deze methode is dat je de tijd in tekenreeksformaat krijgt en je de tekenreeks moet splitsen in zijn individuele bits voor uren, minuten, seconden enz. De RTC accepteert de tijd in een speciaal formaat, d.w.z. UNIX-tijdstempel. In termen van de leek is dit het aantal seconden dat is verstreken sinds donderdag 1 januari 1970 tot heden en tijd. Het UNIX-tijdperk (1970/01/01 00:00:00) wordt gebruikt door de meeste computerbesturingssystemen en de verstreken tijd wordt opgeslagen als een ondertekend 32-bits nummer. Dit betekent dat dit systeem zal werken tot 19 januari 2038 wanneer het aantal te groot wordt om op deze manier op te slaan. Een oplossing is om het nummer als 64 bits op te slaan, maar voorlopig is de 32 bit methode voldoende.

Om de tijd in te stellen op 9 juli 2015 18:29:49 op de interne RTC, gebruikt u deze regel code:

rtctime.set(1436430589, 0)

De 2 parameters zijn seconden en microseconden.

U kunt meer informatie vinden in de NodeMCU-documentatie.

Stap 2: SNTP-tijdservers

SNTP-tijdservers
SNTP-tijdservers

Simple Network Time Protocol (SNTP) wordt geleverd door veel bronnen op internet en veel landen over de hele wereld hebben deze service.

Het programma SNTPTime2.lua stelt de tijd in op de interne RTC. U moet de rtctime- en sntp-modules in uw build hebben wanneer u uw ESP8266 flasht. Het programma haalt de tijd van de server in seconden en microseconden en stelt de interne RTC in met rtctime.set(sec, usec).

Het programma geeft dan de datum en tijd weer in verschillende formaten.

Er zijn veel SNTP-servers over de hele wereld en sommige zijn als volgt:

  • 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 bovenstaande coderegels kunnen worden vervangen door het programma SNTPTime2.lua.

Er zijn meer SNTP-servers op de onderstaande adressen die weer in het programma kunnen worden gebruikt.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google biedt ook tijdservers op deze adressen:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

U moet eraan denken om de tijd op te halen uit het land waarin u zich bevindt, anders moet u deze mogelijk aanpassen voor de verschillende wereldtijdzones. Ook hebben sommige landen zomertijd, dus daar kan je ook mee te maken krijgen.

Stap 3: De tijd halen uit de RTC-module

De tijd halen uit de RTC-module
De tijd halen uit de RTC-module

Het programma GetRTCTime.lua leest de tijd uit de interne RTC.

Het eerste deel leest de tijd en geeft deze weer in seconden en microseconden.

Het tweede deel zet het om in een meer voor mensen leesbaar formaat.

bij het aanroepen van tm = rtctime.epoch2cal(rtctime.get()) geeft het terug:

  • jaar - 1970 ~ 2038
  • ma - maand 1 ~ 12 in het huidige jaar
  • dag - dag 1 ~ 31 in huidige maand
  • uur
  • min
  • sec
  • dag - dag 1 ~ 366 in het huidige jaar
  • wday - dag 1 ~ 7 in huidige week (zondag is 1)

Elk item is toegankelijk als tm["day"], tm["year"]…

U kunt meer informatie vinden in de NodeMCU-documentatie.

DisplaySNTPtime.lua is een meer uitgebreide manier om de datum en tijd weer te geven op een LCD 128 x 64 OLED-scherm, omdat het eenvoudig kan worden aangesloten en met deze programma's kan worden gebruikt.

Stap 4: RTC-gebruikersgeheugen

Een kleine afleiding van het bijhouden van de tijd is dat de interne RTC op de ESP8266 128 x 32 bit geheugenadressen heeft die toegankelijk zijn voor de programmeur. Ze zijn vooral handig omdat ze de diepe slaapcyclus van de ESP8266 kunnen overleven. Het is aan de programmeur om het gebruik ervan te controleren en ervoor te zorgen dat ze niet per ongeluk worden overschreven.

Ik heb RTCmem.lua toegevoegd, een eenvoudig programma dat het gebruik ervan demonstreert. U moet een rtcmem-module in uw build hebben.

Stap 5: Externe RTC-modules

Externe RTC-modules
Externe RTC-modules

De externe RTC-modules maken verbinding met de ESP8266 via de I2C-interface, die slechts twee I/O-pinnen gebruikt en dus zowel met de ESP-01 als met de meeste andere ESP8266-apparaten werkt.

Het adres van de RTC-module is 0x68 en is toegankelijk via de normale I2C-commando's. Wel is er iets om rekening mee te houden, de gegevens in de RTC-registers worden opgeslagen in BCD-formaat (base 16), dus je programma's hebben hier mee te maken. De tijd en datum worden opgeslagen in 7 registers binnen de RTC. Op de interne RTC worden de BCD-conversies verzorgd door de rtctime-module.

SetExtRTC.lua converteert de gegevens naar BCD en stelt de tijd in.

ReadExtRTC.lua leest de tijdgegevens en drukt deze af. OPMERKING: de gegevens worden in hexadecimaal afgedrukt.

Ik heb niet veel tijd besteed aan het formatteren van het scherm, omdat je misschien je eigen ideeën hebt over wat je met datum en tijd wilt doen. Dit is de basismotor in zijn eenvoudigste vorm, zodat je hem desgewenst verder kunt ontwikkelen.

Stap 6: Gegevensregistratie

Gegevens bijhouden
Gegevens bijhouden

Als je goed naar de RTC-modules kijkt, zul je merken dat ze een AT24C32 EEPROM IC of iets dergelijks hebben ingebouwd, of je kunt een 24C256-kaart gebruiken zoals hierboven. De meeste van deze EEPROM-IC's hebben vergelijkbare pin-outs als hierboven. Ze worden geleverd met verschillende hoeveelheden opslagruimte, maar ze zijn allemaal op dezelfde manier toegankelijk. Omdat de AT24C32 al op het bord is gesoldeerd, kan deze direct vanaf de I2C van de externe RTC worden gebruikt.

Als je alleen een 24C256 IC of iets dergelijks hebt, kun je deze in een breadboard plaatsen, A1, A2 en A3 aansluiten op Gnd, Vcc op 3,3V en SDA EN SCL op I2C, WP kan zwevend blijven. Sommige EEPROM-IC's werken alleen op 5V, dus controleer eerst het relevante gegevensblad.

ByteWR.lua schrijft 1 byte aan gegevens naar geheugenlocatie 0x00 van de EEPROM en leest deze terug.

Desiderata.lua schrijft een paar regels van bekende tekst naar de EEPROM.

eeRead.lua leest gegevens uit de EEPROM en drukt deze af.

OPMERKING: Deze programma's zouden ook met andere EEPROM-kaarten moeten werken.

Stap 7: Conclusie

Ik heb geprobeerd te laten zien hoe de RTC en EEPROM werken voor datalogging. Dit is slechts een aanzet om je verder te ontwikkelen. Op de I2C-bus kunt u verschillende apparaten aansluiten zoals lichtsensoren, luchtdruksensoren, temperatuur- en vochtigheidssensoren en de gegevens vastleggen op de EEPROM.

Aanbevolen: