NODEMCU Lua ESP8266 Με ρολόι πραγματικού χρόνου (RTC) & EEPROM: 7 βήματα
NODEMCU Lua ESP8266 Με ρολόι πραγματικού χρόνου (RTC) & EEPROM: 7 βήματα
Anonim
NODEMCU Lua ESP8266 Με ρολόι πραγματικού χρόνου (RTC) & EEPROM
NODEMCU Lua ESP8266 Με ρολόι πραγματικού χρόνου (RTC) & EEPROM

Η λήψη του σωστού χρόνου είναι απαραίτητη εάν θέλετε να τηρείτε αρχείο καταγραφής δεδομένων. Υπάρχουν διάφοροι τρόποι για να αντλήσετε χρόνο από πηγές στο Διαδίκτυο.

Μπορείτε να ρωτήσετε γιατί να μην χρησιμοποιήσετε το ESP8266 για να έχετε χρόνο για εσάς; Λοιπόν μπορείτε, έχει το δικό του εσωτερικό RTC (Ρολόι πραγματικού χρόνου), αλλά το ESP8266 έχει 3 διαφορετικές συχνότητες ρολογιού λειτουργίας - 52MHz κατά την εκκίνηση, 80MHz κατά την κανονική λειτουργία και 160MHz εάν ενισχυθεί. Εάν χρειάζεστε πιο ακριβή τήρηση χρόνου, ειδικά για μεγαλύτερα χρονικά διαστήματα, τότε ένα εξωτερικό RTC μπορεί να δώσει μια λύση. Αυτές οι μονάδες διαθέτουν επίσης εφεδρική μπαταρία σε περίπτωση απώλειας ισχύος. Ένα RTC δεν είναι τρομερά ακριβές καθώς μετρά τον χρόνο που έχει περάσει από τη ρύθμισή του και παρόλο που μπορεί να ισχύει για τις περισσότερες εφαρμογές, μπορεί να μην είναι αρκετά καλός για τη διατήρηση κρίσιμου χρόνου. Είναι δυνατόν να λάβετε τον ακριβή χρόνο από έναν διακομιστή ώρας SNTP από τον οποίο το RTC μπορεί να ενημερώνεται ανά τακτά χρονικά διαστήματα, εάν απαιτείται.

Η μονάδα DS1307 Tiny RTC I2C (παραπάνω) είναι ένα παράδειγμα αυτών των ειδών και μπορεί να αγοραστεί στο Ebay και σε άλλους προμηθευτές για λιγότερο από £ 2. Υπάρχουν επίσης άλλα όπως το DS1302 και το DS3231 που λειτουργούν με παρόμοιο τρόπο και κοστίζουν από 99p και πάνω.

Η μονάδα DS1307 χρησιμοποιεί διεπαφή I2C και για ESP-01 θα πρέπει να συνδεθεί ως:

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

Το SDA και το SCL μπορούν να συνδεθούν με οποιονδήποτε από τους ακροδέκτες εισόδου/εξόδου των μεγαλύτερων ESP8266 (αλλάξτε τον κώδικα ανάλογα). Μόνο οι ακίδες της αριστερής πλευράς πρέπει να συνδεθούν σε αυτήν τη μονάδα.

Βήμα 1: Timeρα Google

Timeρα Google
Timeρα Google

Υπάρχουν πολλά παραδείγματα για να αφιερώσετε χρόνο από την Google και να μοιάσετε κάπως έτσι. Όταν εκτελείτε το πρόγραμμα GoogleTime.lua, έχετε ένα αποτέλεσμα σαν αυτό:

dofile ("GoogleTime.lua")> Timeρα: Παρ, 15 Δεκ 2017 11:19:45 GMT

Το πρόβλημα με αυτήν τη μέθοδο είναι ότι λαμβάνετε το χρόνο σε μορφή συμβολοσειράς και πρέπει να χωρίσετε τη συμβολοσειρά στα μεμονωμένα bits της για ώρες, λεπτά, δευτερόλεπτα κ.λπ. Το RTC δέχεται το χρόνο σε ειδική μορφή, δηλαδή χρονική σφραγίδα UNIX. Λαϊκά, αυτός είναι ο αριθμός των δευτερολέπτων που έχουν παρέλθει από την Πέμπτη 1η Ιανουαρίου 1970 έως σήμερα και σήμερα. Η UNIX Epoch (1970/01/01 00:00:00) χρησιμοποιείται από τα περισσότερα λειτουργικά συστήματα υπολογιστών και ο χρόνος που έχει παρέλθει αποθηκεύεται ως υπογεγραμμένος αριθμός 32 bit. Αυτό σημαίνει ότι αυτό το σύστημα θα λειτουργήσει έως τις 19 Ιανουαρίου 2038, όταν ο αριθμός θα γίνει πολύ μεγάλος για να αποθηκευτεί με αυτόν τον τρόπο. Μια λύση είναι να αποθηκεύσετε τον αριθμό ως 64 bits, αλλά προς το παρόν η μέθοδος 32 bit θα είναι αρκετή.

Για να ορίσετε την ώρα στο 2015 9 Ιουλίου, 18:29:49 στο εσωτερικό RTC θα χρησιμοποιούσατε αυτήν τη γραμμή κώδικα:

rtctime.set (1436430589, 0)

Οι 2 παράμετροι είναι δευτερόλεπτα και μικρο δευτερόλεπτα.

Μπορείτε να βρείτε περισσότερες πληροφορίες διαβάζοντας την Τεκμηρίωση NodeMCU.

Βήμα 2: Διακομιστές χρόνου SNTP

Διακομιστές χρόνου SNTP
Διακομιστές χρόνου SNTP

Το Simple Network Time Protocol (SNTP) παρέχεται από πολλές πηγές στο Διαδίκτυο και πολλές χώρες σε όλο τον κόσμο διαθέτουν αυτήν την υπηρεσία.

Το πρόγραμμα, SNTPTime2.lua ορίζει την ώρα στο εσωτερικό RTC. Πρέπει να έχετε τις μονάδες rtctime & sntp στην κατασκευή σας όταν αναβοσβήνετε το ESP8266. Το πρόγραμμα λαμβάνει το χρόνο από τον διακομιστή σε δευτερόλεπτα και μικρο δευτερόλεπτα και ορίζει το εσωτερικό RTC με rtctime.set (sec, usec).

Στη συνέχεια, το πρόγραμμα εμφανίζει την ημερομηνία και την ώρα σε διαφορετικές μορφές.

Υπάρχουν πολλοί διακομιστές SNTP σε όλο τον κόσμο και μερικοί είναι οι εξής:

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

Όλες οι παραπάνω γραμμές κώδικα μπορούν να αντικατασταθούν στο πρόγραμμα SNTPTime2.lua.

Υπάρχουν περισσότεροι διακομιστές SNTP στις παρακάτω διευθύνσεις οι οποίοι μπορούν να χρησιμοποιηθούν ξανά στο πρόγραμμα.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Η Google παρέχει επίσης διακομιστές ώρας σε αυτές τις διευθύνσεις:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Πρέπει να θυμάστε να λαμβάνετε το χρόνο από τη χώρα στην οποία βρίσκεστε ή μπορεί να χρειαστεί να τον τροποποιήσετε για τις διαφορετικές ζώνες ώρας του κόσμου. Επίσης, ορισμένες χώρες έχουν θερινή ώρα, οπότε ίσως χρειαστεί να ασχοληθείτε και με αυτό.

Βήμα 3: Λήψη χρόνου από την ενότητα RTC

Λήψη χρόνου από την ενότητα RTC
Λήψη χρόνου από την ενότητα RTC

Το πρόγραμμα GetRTCTime.lua διαβάζει το χρόνο από το εσωτερικό RTC.

Το πρώτο μέρος διαβάζει την ώρα και την εμφανίζει σε δευτερόλεπτα και μικροδευτερόλεπτα.

Το δεύτερο μέρος το μετατρέπει σε πιο αναγνώσιμη μορφή από τον άνθρωπο.

όταν καλείτε tm = rtctime.epoch2cal (rtctime.get ()) επιστρέφει:

  • έτος - 1970 ~ 2038
  • μηνιαίος 1 ~ 12 στο τρέχον έτος
  • ημέρα - ημέρα 1 ~ 31 τον τρέχοντα μήνα
  • ώρα
  • λ
  • δευτ
  • ημέρα - ημέρα 1 ~ 366 το τρέχον έτος
  • ημέρα - ημέρα 1 ~ 7 την τρέχουσα εβδομάδα (η Κυριακή είναι 1)

Μπορείτε να έχετε πρόσβαση σε κάθε στοιχείο ως tm ["ημέρα"], tm ["έτος"]…

Μπορείτε να βρείτε περισσότερες πληροφορίες διαβάζοντας την Τεκμηρίωση NodeMCU.

Το DisplaySNTPtime.lua είναι ένας πιο περίτεχνος τρόπος εμφάνισης της ημερομηνίας και της ώρας σε μια οθόνη LCD OLED 128 x 64, καθώς συνδέεται εύκολα και μπορεί να χρησιμοποιηθεί με αυτά τα προγράμματα.

Βήμα 4: Μνήμη χρήστη RTC

Μια μικρή απόκλιση από την τήρηση του χρόνου είναι ότι το εσωτερικό RTC στο ESP8266 έχει διευθύνσεις μνήμης 128 x 32 bit στις οποίες μπορεί να έχει πρόσβαση ο προγραμματιστής. Είναι ιδιαίτερα χρήσιμα καθώς μπορούν να επιβιώσουν από τον κύκλο ύπνου του ESP8266. Εναπόκειται στον προγραμματιστή να ελέγξει τη χρήση τους και να διασφαλίσει ότι δεν θα αντικατασταθούν τυχαία.

Έχω συμπεριλάβει το RTCmem.lua, ένα απλό πρόγραμμα που αποδεικνύει τη χρήση του. Πρέπει να έχετε μονάδα rtcmem στην κατασκευή σας.

Βήμα 5: Εξωτερικές μονάδες RTC

Εξωτερικές μονάδες RTC
Εξωτερικές μονάδες RTC

Οι εξωτερικές μονάδες RTC συνδέονται με το ESP8266 μέσω της διεπαφής I2C, το οποίο χρησιμοποιεί μόνο δύο ακίδες εισόδου/εξόδου και έτσι λειτουργεί με το ESP-01 καθώς και με τις περισσότερες άλλες συσκευές ESP8266.

Η διεύθυνση της μονάδας RTC είναι 0x68 και η πρόσβαση γίνεται μέσω των κανονικών εντολών I2C. Υπάρχει, ωστόσο, κάτι που πρέπει να έχετε κατά νου, τα δεδομένα στους καταχωρητές RTC αποθηκεύονται σε μορφή BCD (βάση 16), οπότε τα προγράμματα σας πρέπει να το αντιμετωπίσουν. Η ώρα και η ημερομηνία αποθηκεύονται σε 7 καταχωρητές εντός του RTC. Στο εσωτερικό RTC, οι μετατροπές BCD φροντίζονται από την ενότητα rtctime.

Το SetExtRTC.lua μετατρέπει τα δεδομένα σε BCD και ορίζει την ώρα.

Το ReadExtRTC.lua διαβάζει τα δεδομένα ώρας και τα εκτυπώνει. ΣΗΜΕΙΩΣΗ: τα δεδομένα εκτυπώνονται σε δεκαεξαδική μορφή.

Δεν έχω ξοδέψει πολύ χρόνο για τη μορφοποίηση της οθόνης, καθώς μπορεί να έχετε τις δικές σας ιδέες για το τι θέλετε να κάνετε με την ημερομηνία και την ώρα. Αυτός είναι ο βασικός κινητήρας στην απλούστερη μορφή του, ώστε να μπορείτε να τον αναπτύξετε περαιτέρω εάν το επιθυμείτε.

Βήμα 6: Καταγραφή δεδομένων

ΦΟΡΤΩΣΗ ΔΕΔΟΜΕΝΩΝ
ΦΟΡΤΩΣΗ ΔΕΔΟΜΕΝΩΝ

Αν κοιτάξετε προσεκτικά τις μονάδες RTC, θα παρατηρήσετε ότι έχουν ενσωματωμένο ένα AT24C32 EEPROM IC ή παρόμοιο ή μπορείτε να χρησιμοποιήσετε έναν πίνακα 24C256 όπως παραπάνω. Τα περισσότερα από αυτά τα IC EEPROM έχουν παρόμοιες εξόδους καρφιτσών όπως παραπάνω. Έρχονται με διάφορες ποσότητες αποθήκευσης, αλλά έχουν πρόσβαση σε όλους με τον ίδιο τρόπο. Καθώς το AT24C32 είναι ήδη κολλημένο στον πίνακα, μπορεί να χρησιμοποιηθεί απευθείας από το I2C του εξωτερικού RTC.

Εάν έχετε μόνο ένα IC 24C256 ή παρόμοιο, μπορείτε να το ρυθμίσετε σε έναν πίνακα ψωμιού, να συνδέσετε τα A1, A2 και A3 στο Gnd, Vcc σε 3.3V και το SDA AND SCL στο I2C, το WP μπορεί να παραμείνει αιωρούμενο. Ορισμένα IC EEPROM λειτουργούν μόνο σε 5V, οπότε ελέγξτε πρώτα το σχετικό φύλλο δεδομένων.

Το ByteWR.lua γράφει 1 byte δεδομένων στη θέση μνήμης 0x00 του EEPROM και τα διαβάζει πίσω.

Το Desiderata.lua γράφει μερικές γραμμές από διάσημο κείμενο στην EEPROM.

Το eeRead.lua διαβάζει δεδομένα από την EEPROM και τα εκτυπώνει.

ΣΗΜΕΙΩΣΗ: Αυτά τα προγράμματα πρέπει να λειτουργούν και με άλλους πίνακες EEPROM.

Βήμα 7: Συμπέρασμα

Προσπάθησα να δείξω πώς λειτουργεί το RTC και το EEPROM για την καταγραφή δεδομένων. Αυτό είναι απλώς μια αρχή για να αναπτυχθείτε περαιτέρω. Μπορείτε να συνδέσετε διάφορες συσκευές στο δίαυλο I2C όπως αισθητήρες φωτός, αισθητήρες βαρομετρικής πίεσης, αισθητήρες θερμοκρασίας και υγρασίας και να καταγράψετε τα δεδομένα στο EEPROM.

Συνιστάται: