NODEMCU Lua ESP8266 z zegarem czasu rzeczywistego (RTC) i pamięcią EEPROM: 7 kroków
NODEMCU Lua ESP8266 z zegarem czasu rzeczywistego (RTC) i pamięcią EEPROM: 7 kroków
Anonim
NODEMCU Lua ESP8266 z zegarem czasu rzeczywistego (RTC) i EEPROM
NODEMCU Lua ESP8266 z zegarem czasu rzeczywistego (RTC) i EEPROM

Uzyskanie prawidłowego czasu jest niezbędne, jeśli chcesz prowadzić dziennik danych. Istnieje wiele sposobów na uzyskanie czasu ze źródeł w Internecie.

Możesz zapytać, dlaczego nie użyć ESP8266, aby zachować dla siebie czas? Cóż, możesz, ma swój wewnętrzny zegar czasu rzeczywistego RTC (Real Time Clock), ale ESP8266 ma 3 różne częstotliwości taktowania - 52 MHz podczas rozruchu, 80 MHz podczas normalnej pracy i 160 MHz po wzmocnieniu. Jeśli potrzebujesz dokładniejszego pomiaru czasu, zwłaszcza w dłuższych okresach, rozwiązaniem może być zewnętrzny zegar RTC. Moduły te mają również podtrzymanie bateryjne na wypadek utraty zasilania. RTC nie jest zbyt dokładny, ponieważ zlicza czas, który upłynął od jego ustawienia i chociaż może działać w przypadku większości aplikacji, może nie być wystarczająco dobry do utrzymywania krytycznego czasu. Możliwe jest uzyskanie dokładnego czasu z serwera czasu SNTP, z którego w razie potrzeby można aktualizować RTC w regularnych odstępach czasu.

Przykładem tych elementów jest moduł DS1307 Tiny RTC I2C (powyżej), który można kupić w serwisie eBay i u innych dostawców za mniej niż 2 GBP. Istnieją również inne, takie jak DS1302 i DS3231, które działają w podobny sposób i kosztują od 99 pensów w górę.

Moduł DS1307 korzysta z interfejsu I2C i dla ESP-01 należy go podłączyć jako:

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

SDA i SCL można podłączyć do dowolnego z pinów I/O na większych ESP8266 (odpowiednio zmień kod). Do tego modułu należy podłączyć tylko styki po lewej stronie.

Krok 1: Czas Google

Czas Google
Czas Google

Istnieje wiele przykładów pobierania czasu z Google i wygląda to mniej więcej tak. Po uruchomieniu programu GoogleTime.lua otrzymujesz taki wynik:

dofile("GoogleTime.lua")> Czas: piątek, 15 grudnia 2017 11:19:45 GMT

Problem z tą metodą polega na tym, że otrzymujesz czas w formacie ciągu i musisz podzielić ciąg na poszczególne bity na godziny, minuty, sekundy itp. RTC akceptuje czas w specjalnym formacie, tj. Znacznik czasu UNIX. W kategoriach laika jest to liczba sekund, które upłynęły od czwartku 1 stycznia 1970 roku do dnia dzisiejszego i godziny. Epoka UNIX (1970/01/01 00:00:00) jest używana przez większość komputerowych systemów operacyjnych, a czas, który upłynął, jest przechowywany jako podpisana 32-bitowa liczba. Oznacza to, że system ten będzie działał do 19 stycznia 2038 r., kiedy liczba ta stanie się zbyt duża, aby można ją było przechowywać w ten sposób. Jednym z rozwiązań jest zapisanie liczby jako 64 bity, ale na razie wystarczy metoda 32-bitowa.

Aby ustawić czas na 9 lipca 2015 r., 18:29:49 w wewnętrznym RTC, użyj tego wiersza kodu:

rtctime.set(1436430589, 0)

Dwa parametry to sekundy i mikro sekundy.

Więcej informacji można znaleźć w dokumentacji NodeMCU.

Krok 2: Serwery czasu SNTP

Serwery czasu SNTP
Serwery czasu SNTP

Simple Network Time Protocol (SNTP) jest dostarczany z wielu źródeł w Internecie, a wiele krajów na całym świecie ma tę usługę.

Program SNTPTime2.lua ustawia czas na wewnętrznym RTC. Musisz mieć moduły rtctime i sntp w swojej kompilacji podczas flashowania ESP8266. Program pobiera czas z serwera w sekundach i mikrosekundach i ustawia wewnętrzny RTC na rtctime.set(sec, usec).

Program wyświetla następnie datę i godzinę w różnych formatach.

Istnieje wiele serwerów SNTP na całym świecie, a niektóre z nich są następujące:

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

Wszystkie powyższe wiersze kodu można podstawić do programu SNTPTime2.lua.

Pod poniższymi adresami znajduje się więcej serwerów SNTP, które ponownie można wykorzystać w programie.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google udostępnia również serwery czasu pod tymi adresami:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Musisz pamiętać, aby uzyskać czas z kraju, w którym się znajdujesz, lub możesz go zmodyfikować dla różnych stref czasowych na świecie. Również w niektórych krajach obowiązuje czas letni, więc być może będziesz musiał sobie z tym poradzić.

Krok 3: Pobieranie czasu z modułu RTC

Pobieranie czasu z modułu RTC
Pobieranie czasu z modułu RTC

Program GetRTCTime.lua odczytuje czas z wewnętrznego zegara RTC.

Pierwsza część odczytuje czas i wyświetla go w sekundach i mikrosekundach.

Druga część konwertuje go na format bardziej czytelny dla człowieka.

przy wywołaniu tm = rtctime.epoch2cal(rtctime.get()) zwraca:

  • rok - 1970 ~ 2038
  • pon - miesiąc 1 ~ 12 w bieżącym roku
  • dzień - dzień 1 ~ 31 w bieżącym miesiącu
  • godzina
  • min
  • sek
  • dzień - dzień 1 ~ 366 w bieżącym roku
  • wday - dzień 1 ~ 7 w bieżącym tygodniu (niedziela to 1)

Każdy element może być dostępny jako tm["dzień"], tm["rok"]…

Więcej informacji można znaleźć w dokumentacji NodeMCU.

DisplaySNTPtime.lua to bardziej rozbudowany sposób wyświetlania daty i czasu na wyświetlaczu OLED LCD 128 x 64, ponieważ jest łatwy do podłączenia i może być używany z tymi programami.

Krok 4: Pamięć użytkownika RTC

Niewielką odmianą od utrzymywania czasu jest to, że wewnętrzny zegar czasu rzeczywistego w ESP8266 ma 128 x 32-bitowe adresy pamięci, do których programista może uzyskać dostęp. Są szczególnie przydatne, ponieważ mogą przetrwać cykl głębokiego snu ESP8266. Od programisty zależy kontrolowanie ich wykorzystania i upewnienie się, że nie zostaną przypadkowo nadpisane.

Dołączyłem RTCmem.lua, prosty program, który demonstruje jego użycie. Musisz mieć w swojej kompilacji moduł rtcmem.

Krok 5: Zewnętrzne moduły RTC

Zewnętrzne moduły RTC
Zewnętrzne moduły RTC

Zewnętrzne moduły RTC łączą się z ESP8266 przez interfejs I2C, który wykorzystuje tylko dwa piny I/O i dzięki temu współpracuje z ESP-01, jak również większością innych urządzeń ESP8266.

Adres modułu RTC to 0x68 i jest dostępny za pomocą normalnych poleceń I2C. Należy jednak pamiętać, że dane w rejestrach RTC przechowywane są w formacie BCD (baza 16), więc Twoje programy muszą sobie z tym poradzić. Czas i data przechowywane są w 7 rejestrach w ramach RTC. W wewnętrznym zegarze czasu rzeczywistego konwersje BCD są obsługiwane przez moduł rtctime.

SetExtRTC.lua konwertuje dane do BCD i ustawia czas.

ReadExtRTC.lua odczytuje dane czasu i drukuje je. UWAGA: dane są drukowane w systemie szesnastkowym.

Nie spędziłem dużo czasu na formatowaniu wyświetlacza, ponieważ możesz mieć własne pomysły na to, co chcesz zrobić z datą i godziną. Jest to podstawowy silnik w najprostszej postaci, dzięki czemu możesz go dalej rozwijać, jeśli chcesz.

Krok 6: Rejestrowanie danych

Rejestracja danych
Rejestracja danych

Jeśli przyjrzysz się uważnie modułom RTC, zauważysz, że mają one wbudowany układ EEPROM AT24C32 lub podobny, lub możesz użyć płytki 24C256, jak wyżej. Większość z tych układów EEPROM ma podobne piny jak powyżej. Pochodzą z różnymi ilościami pamięci, ale wszystkie są dostępne w ten sam sposób. Ponieważ AT24C32 jest już przylutowany do płytki, może być używany bezpośrednio z I2C zewnętrznego zegara czasu rzeczywistego.

Jeśli masz tylko układ scalony 24C256 lub podobny, możesz go ustawić na płytce do chleba, podłączyć A1, A2 i A3 do Gnd, Vcc do 3,3 V i SDA i SCL do I2C, WP można pozostawić pływający. Niektóre układy scalone EEPROM działają tylko przy napięciu 5 V, więc najpierw sprawdź odpowiedni arkusz danych.

ByteWR.lua zapisuje 1 bajt danych do komórki pamięci 0x00 EEPROM i odczytuje ją z powrotem.

Desiderata.lua zapisuje kilka linijek ze słynnego tekstu do pamięci EEPROM.

eeRead.lua odczytuje dane z EEPROM i drukuje je.

UWAGA: Te programy powinny działać również z innymi płytami EEPROM.

Krok 7: Wniosek

Próbowałem pokazać, jak działa RTC i EEPROM przy rejestracji danych. To tylko początek dalszego rozwoju. Do magistrali I2C można podłączyć różne urządzenia, takie jak czujniki światła, czujniki ciśnienia barometrycznego, czujniki temperatury i wilgotności oraz zapisywać dane w pamięci EEPROM.

Zalecana: