NODEMCU Lua ESP8266 mit Echtzeituhr (RTC) & EEPROM - Gunook
NODEMCU Lua ESP8266 mit Echtzeituhr (RTC) & EEPROM - Gunook
Anonim
NODEMCU Lua ESP8266 mit Echtzeituhr (RTC) & EEPROM
NODEMCU Lua ESP8266 mit Echtzeituhr (RTC) & EEPROM

Wenn Sie ein Datenprotokoll führen möchten, ist es wichtig, die richtige Zeit zu erhalten. Es gibt verschiedene Möglichkeiten, die Zeit aus Quellen im Internet zu beziehen.

Sie fragen sich vielleicht, warum Sie nicht den ESP8266 verwenden, um die Zeit für Sie zu behalten? Nun, Sie können, es hat seine eigene interne RTC (Real Time Clock), aber der ESP8266 hat 3 verschiedene Betriebstaktfrequenzen - 52 MHz beim Booten, 80 MHz während des regulären Betriebs und 160 MHz bei Boost. Wenn Sie eine genauere Zeitmessung benötigen, insbesondere über längere Zeiträume, kann eine externe RTC eine Lösung sein. Diese Module verfügen auch über einen Batterie-Backup bei Stromausfall. Eine Echtzeituhr ist nicht besonders genau, da sie die seit ihrer Einstellung verstrichene Zeit zählt, und obwohl sie für die meisten Anwendungen geeignet ist, ist sie möglicherweise nicht gut genug für die kritische Zeitmessung. Es ist möglich, die genaue Uhrzeit von einem SNTP-Zeitserver zu beziehen, von dem aus die RTC bei Bedarf in regelmäßigen Abständen aktualisiert werden kann.

Das DS1307 Tiny RTC I2C-Modul (oben) ist ein Beispiel für diese Artikel und kann bei Ebay und anderen Anbietern für weniger als 2 € erworben werden. Es gibt auch andere wie die DS1302 und DS3231, die ähnlich funktionieren und ab 99p aufwärts kosten.

Das DS1307-Modul verwendet eine I2C-Schnittstelle und sollte für ein ESP-01 angeschlossen werden als:

Vcc - 3,3 V, Masse - Masse, SDA - D3, SCL - D4

SDA und SCL können an jeden der I/O-Pins der größeren ESP8266 angeschlossen werden (ändern Sie den Code entsprechend). An diesem Modul müssen nur die Pins auf der linken Seite angeschlossen werden.

Schritt 1: Google-Zeit

Google-Zeit
Google-Zeit

Es gibt viele Beispiele dafür, die Zeit von Google zu bekommen und ungefähr so auszusehen. Wenn Sie das Programm GoogleTime.lua ausführen, erhalten Sie ein Ergebnis wie dieses:

dofile("GoogleTime.lua")> Zeit: Fr, 15 Dez 2017 11:19:45 GMT

Das Problem bei dieser Methode ist, dass Sie die Uhrzeit im String-Format erhalten und Sie den String in seine einzelnen Bits für Stunden, Minuten, Sekunden usw. aufteilen müssen. Die RTC akzeptiert die Uhrzeit in einem speziellen Format, z. B. einem UNIX-Zeitstempel. Laienhaft ausgedrückt ist dies die Anzahl der Sekunden, die seit Donnerstag, dem 1. Januar 1970, bis zum heutigen Tag und zur heutigen Zeit vergangen sind. Die UNIX-Epoche (1970/01/01 00:00:00) wird von den meisten Computerbetriebssystemen verwendet und die verstrichene Zeit wird als vorzeichenbehaftete 32-Bit-Zahl gespeichert. Dies bedeutet, dass dieses System bis zum 19. Januar 2038 funktioniert, wenn die Anzahl zu groß wird, um auf diese Weise gespeichert zu werden. Eine Lösung besteht darin, die Zahl als 64-Bit zu speichern, aber für den Moment reicht die 32-Bit-Methode aus.

Um die Zeit auf dem internen RTC auf den 9. Juli 2015, 18:29:49 Uhr einzustellen, verwenden Sie diese Codezeile:

rtctime.set(1436430589, 0)

Die 2 Parameter sind Sekunden und Mikrosekunden.

Weitere Informationen finden Sie in der NodeMCU-Dokumentation.

Schritt 2: SNTP-Zeitserver

SNTP-Zeitserver
SNTP-Zeitserver

Simple Network Time Protocol (SNTP) wird von vielen Quellen im Internet bereitgestellt, und viele Länder auf der ganzen Welt haben diesen Dienst.

Das Programm SNTPTime2.lua stellt die Uhrzeit auf der internen RTC ein. Sie müssen die rtctime- und sntp-Module in Ihrem Build haben, wenn Sie Ihren ESP8266 flashen. Das Programm holt sich die Zeit vom Server in Sekunden und Mikrosekunden und setzt die interne RTC mit rtctime.set(sec, usec).

Das Programm zeigt dann Datum und Uhrzeit in verschiedenen Formaten an.

Es gibt viele SNTP-Server auf der ganzen Welt und einige sind wie folgt:

  • 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 oben genannten Codezeilen können in das SNTPTime2.lua-Programm eingefügt werden.

Unter den folgenden Adressen gibt es weitere SNTP-Server, die wieder im Programm verwendet werden können.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google stellt auch Zeitserver unter diesen Adressen bereit:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Sie müssen daran denken, die Zeit aus dem Land zu beziehen, in dem Sie sich befinden, oder Sie müssen sie möglicherweise für die verschiedenen Weltzeitzonen ändern. In einigen Ländern gibt es auch Sommerzeit, sodass Sie sich möglicherweise auch damit befassen müssen.

Schritt 3: Abrufen der Zeit vom RTC-Modul

Abrufen der Zeit vom RTC-Modul
Abrufen der Zeit vom RTC-Modul

Das Programm GetRTCTime.lua liest die Uhrzeit aus der internen RTC.

Der erste Teil liest die Zeit und zeigt sie in Sekunden und Mikrosekunden an.

Der zweite Teil wandelt es in ein für Menschen lesbareres Format um.

Beim Aufruf von tm = rtctime.epoch2cal(rtctime.get()) wird zurückgegeben:

  • Jahr - 1970 ~ 2038
  • Mo - Monat 1 ~ 12 im laufenden Jahr
  • Tag - Tag 1 ~ 31 im aktuellen Monat
  • Stunde
  • Mindest
  • Sek
  • Tag - Tag 1 ~ 366 im aktuellen Jahr
  • wday - Tag 1 ~ 7 in der aktuellen Woche (Sonntag ist 1)

Auf jedes Element kann als tm["day"], tm["year"]… zugegriffen werden.

Weitere Informationen finden Sie in der NodeMCU-Dokumentation.

DisplaySNTPtime.lua ist eine aufwendigere Möglichkeit, Datum und Uhrzeit auf einem LCD 128 x 64 OLED-Display anzuzeigen, da es einfach angeschlossen und mit diesen Programmen verwendet werden kann.

Schritt 4: RTC-Benutzerspeicher

Eine kleine Ablenkung von der Zeitmessung ist die interne RTC des ESP8266 mit 128 x 32 Bit Speicheradressen, auf die der Programmierer zugreifen kann. Sie sind besonders nützlich, da sie den Tiefschlafzyklus des ESP8266 überstehen. Es obliegt dem Programmierer, ihre Verwendung zu kontrollieren und sicherzustellen, dass sie nicht versehentlich überschrieben werden.

Ich habe RTCmem.lua eingefügt, ein einfaches Programm, das seine Verwendung demonstriert. Sie müssen das rtcmem-Modul in Ihrem Build haben.

Schritt 5: Externe RTC-Module

Externe RTC-Module
Externe RTC-Module

Die externen RTC-Module werden über die I2C-Schnittstelle mit dem ESP8266 verbunden, die nur zwei I/O-Pins verwendet und daher mit dem ESP-01 sowie den meisten anderen ESP8266-Geräten funktioniert.

Die RTC-Moduladresse ist 0x68 und der Zugriff erfolgt über die normalen I2C-Befehle. Es ist jedoch zu beachten, dass die Daten in den RTC-Registern im BCD-Format (Basis 16) gespeichert sind, also müssen Ihre Programme damit umgehen. Uhrzeit und Datum werden in 7 Registern innerhalb der RTC gespeichert. Auf der internen RTC werden die BCD-Konvertierungen vom rtctime-Modul übernommen.

SetExtRTC.lua konvertiert die Daten in BCD und stellt die Zeit ein.

ReadExtRTC.lua liest die Zeitdaten und druckt sie aus. HINWEIS: Die Daten werden hexadezimal ausgedruckt.

Ich habe nicht viel Zeit damit verbracht, die Anzeige zu formatieren, da Sie möglicherweise Ihre eigenen Vorstellungen davon haben, was Sie mit Datum und Uhrzeit tun möchten. Dies ist die Basis-Engine in ihrer einfachsten Form, so dass Sie sie auf Wunsch weiterentwickeln können.

Schritt 6: Datenprotokollierung

Datenerfassung
Datenerfassung

Wenn Sie sich die RTC-Module genau ansehen, werden Sie feststellen, dass sie einen AT24C32-EEPROM-IC oder ähnliches eingebaut haben, oder Sie können wie oben eine 24C256-Platine verwenden. Die meisten dieser EEPROM-ICs haben ähnliche Pinbelegung wie oben. Sie verfügen über verschiedene Speicherkapazitäten, werden jedoch alle auf die gleiche Weise aufgerufen. Da der AT24C32 bereits auf der Platine aufgelötet ist, kann er direkt vom I2C der externen RTC genutzt werden.

Wenn Sie nur einen 24C256-IC oder ähnliches haben, können Sie ihn in einem Steckbrett einrichten, A1, A2 und A3 an Gnd, Vcc an 3,3 V und SDA UND SCL an I2C anschließen, WP kann schwebend gelassen werden. Einige EEPROM-ICs arbeiten nur mit 5V, überprüfen Sie daher zuerst das entsprechende Datenblatt.

ByteWR.lua schreibt 1 Byte Daten in den Speicherplatz 0x00 des EEPROM und liest es zurück.

Desiderata.lua schreibt ein paar Zeilen aus einem bekannten Text in das EEPROM.

eeRead.lua liest Daten aus dem EEPROM und druckt sie aus.

HINWEIS: Diese Programme sollten auch mit anderen EEPROM-Karten funktionieren.

Schritt 7: Fazit

Ich habe versucht zu zeigen, wie RTC und EEPROM für die Datenprotokollierung funktionieren. Dies ist nur ein Anfang für Sie, um sich weiterzuentwickeln. An den I2C-Bus können Sie verschiedene Geräte wie Lichtsensoren, Luftdrucksensoren, Temperatur- und Feuchtigkeitssensoren anschließen und die Daten auf dem EEPROM aufzeichnen.

Empfohlen: