İçindekiler:

NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile: 7 Adım
NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile: 7 Adım

Video: NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile: 7 Adım

Video: NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile: 7 Adım
Video: FLProg9: RTC Çalar Saat | ESP32 DüğümMCU | Arduino Görsel Gömülü Programlama 2024, Temmuz
Anonim
NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile
NODEMCU Lua ESP8266, Gerçek Zamanlı Saat (RTC) ve EEPROM ile

Bir veri günlüğü tutmak istiyorsanız doğru zamanı almak çok önemlidir. İnternetteki kaynaklardan zaman almanın çeşitli yolları vardır.

Size zaman ayırmak için neden ESP8266'yı kullanmadığınızı sorabilirsiniz. Yapabilirsiniz, kendi dahili RTC'si (Gerçek Zamanlı Saat) vardır, ancak ESP8266'nın 3 farklı çalışma saat frekansı vardır - önyükleme yaparken 52MHz, normal çalışma sırasında 80MHz ve artırılmışsa 160MHz. Özellikle daha uzun periyotlarda daha doğru zaman tutmaya ihtiyacınız varsa, harici bir RTC bir çözüm sağlayabilir. Bu modüllerde ayrıca elektrik kesintisi durumunda yedek pil bulunur. Bir RTC, kurulduğundan beri geçen süreyi saydığından ve çoğu uygulama için geçerli olmasına rağmen, kritik zaman tutma için yeterince iyi olmayabilir. Gerekirse, RTC'nin düzenli aralıklarla güncellenebileceği bir SNTP zaman sunucusundan doğru bir zaman almak mümkündür.

DS1307 Tiny RTC I2C Modülü (yukarıda) bu öğelere bir örnektir ve Ebay'den ve diğer tedarikçilerden 2 sterlinin altına satın alınabilir. DS1302 ve DS3231 gibi benzer şekilde çalışan ve 99p'den yukarıya mal olan başkaları da var.

DS1307 modülü bir I2C arayüzü kullanır ve bir ESP-01 için şu şekilde bağlanmalıdır:

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

SDA ve SCL, daha büyük ESP8266'lardaki I/O pinlerinden herhangi birine bağlanabilir (kodu buna göre değiştirin). Bu modüle sadece sol taraftaki pinlerin bağlanması gerekir.

1. Adım: Google Saati

Google Saati
Google Saati

Google'dan zaman almanın ve bunun gibi görünmenin birçok örneği var. GoogleTime.lua programını çalıştırdığınızda şöyle bir sonuç alırsınız:

dofile("GoogleTime.lua")> Saat: Cuma, 15 Aralık 2017 11:19:45 GMT

Bu yöntemle ilgili sorun, zamanı dize biçiminde almanız ve dizeyi saat, dakika, saniye vb. için ayrı bitlerine bölmeniz gerekmesidir. RTC, zamanı özel bir biçimde, yani UNIX zaman damgasında kabul eder. Layman'ın terimleriyle bu, 1 Ocak 1970 Perşembe gününden günümüze ve zamana kadar geçen saniye sayısıdır. UNIX Epoch (1970/01/01 00:00:00) çoğu bilgisayar işletim sistemi tarafından kullanılır ve geçen süre, imzalı 32 bitlik bir sayı olarak saklanır. Bu, bu sistemin, sayının bu şekilde depolanamayacak kadar büyük olacağı 19 Ocak 2038'e kadar çalışacağı anlamına gelir. Bir çözüm, sayıyı 64 bit olarak saklamaktır, ancak şimdilik 32 bit yöntemi yeterli olacaktır.

Dahili RTC'de saati 2015 9 Temmuz 18:29:49 olarak ayarlamak için şu kod satırını kullanırsınız:

rtctime.set(1436430589, 0)

2 parametre saniye ve mikro saniyedir.

NodeMCU Belgelerini okuyarak daha fazla bilgi bulabilirsiniz.

Adım 2: SNTP Zaman Sunucuları

SNTP Zaman Sunucuları
SNTP Zaman Sunucuları

Basit Ağ Zaman Protokolü (SNTP), İnternet'teki birçok kaynaktan sağlanmaktadır ve dünyadaki birçok ülke bu hizmete sahiptir.

SNTPTime2.lua programı, dahili RTC'deki zamanı ayarlar. ESP8266'nızı flaş ettiğinizde yapınızda rtctime & sntp modüllerinin olması gerekir. Program sunucudan zamanı saniye ve mikro saniye olarak alır ve dahili RTC'yi rtctime.set(sec, usec) ile ayarlar.

Program daha sonra tarih ve saati farklı formatlarda görüntüler.

Dünya çapında birçok SNTP Sunucusu vardır ve bazıları aşağıdaki gibidir:

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

Yukarıdaki tüm kod satırları, SNTPTime2.lua programına ikame edilebilir.

Aşağıdaki adreslerde yine programda kullanılabilecek daha fazla SNTP Sunucusu bulunmaktadır.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google ayrıca şu adreslerde zaman sunucuları sağlar:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Bulunduğunuz ülkeden saati almayı hatırlamanız gerekir, aksi takdirde farklı dünya saat dilimleri için değiştirmeniz gerekebilir. Ayrıca bazı ülkelerde yaz saati uygulaması vardır, bu nedenle bununla da ilgilenmeniz gerekebilir.

Adım 3: RTC Modülünden Zamanı Alma

RTC Modülünden Zaman Alma
RTC Modülünden Zaman Alma

GetRTCTime.lua programı, dahili RTC'den zamanı okur.

İlk kısım zamanı okur ve saniye ve mikrosaniye cinsinden görüntüler.

İkinci kısım, onu daha insan tarafından okunabilir bir biçime dönüştürür.

tm = rtctime.epoch2cal(rtctime.get()) çağrılırken şunu döndürür:

  • yıl - 1970 ~ 2038
  • pazartesi - cari yılda 1 ~ 12 ay
  • gün - mevcut ayda 1 ~ 31. gün
  • saat
  • dk
  • saniye
  • gün - cari yılda 1 ~ 366 gün
  • wday - geçerli haftadaki 1 ~ 7. gün (Pazar 1'dir)

Her öğeye tm["gün"], tm["yıl"]… şeklinde erişilebilir.

NodeMCU Belgelerini okuyarak daha fazla bilgi bulabilirsiniz.

DisplaySNTPtime.lua, kolayca bağlanabildiğinden ve bu programlarla kullanılabildiğinden, LCD 128 x 64 OLED ekranda tarih ve saati göstermenin daha ayrıntılı bir yoludur.

Adım 4: RTC Kullanıcı Belleği

ESP8266'daki dahili RTC'nin, programcı tarafından erişilebilen 128 x 32 bit bellek adreslerine sahip olması, zaman tutmadan küçük bir sapmadır. ESP8266'nın derin uyku döngüsünde hayatta kalabildikleri için özellikle yararlıdırlar. Kullanımlarını kontrol etmek ve yanlışlıkla üzerine yazılmamasını sağlamak programcıya kalmıştır.

Kullanımını gösteren basit bir program olan RTCmem.lua'yı ekledim. Derlemenizde rtcmem modülünün olması gerekir.

Adım 5: Harici RTC Modülleri

Harici RTC Modülleri
Harici RTC Modülleri

Harici RTC modülleri, ESP8266'ya yalnızca iki G/Ç pini kullanan I2C arabirimi aracılığıyla bağlanır ve bu nedenle ESP-01 ve diğer ESP8266 cihazlarının çoğuyla çalışır.

RTC modülü adresi 0x68'dir ve normal I2C komutları kullanılarak erişilir. Ancak akılda tutulması gereken bir şey var, RTC kayıtlarındaki veriler BCD formatında (taban 16) saklanır, dolayısıyla programlarınız bununla ilgilenmek zorundadır. Saat ve tarih, RTC içindeki 7 kayıtta saklanır. Dahili RTC'de, BCD dönüşümleri rtctime modülü tarafından halledilir.

SetExtRTC.lua, verileri BCD'ye dönüştürür ve zamanı ayarlar.

ReadExtRTC.lua zaman verilerini okur ve yazdırır. NOT: veriler onaltılı olarak yazdırılır.

Tarih ve saatle ne yapmak istediğiniz konusunda kendi fikirleriniz olabileceğinden, ekranı biçimlendirmek için çok fazla zaman harcamadım. Bu, en basit haliyle temel motordur, böylece isterseniz daha da geliştirebilirsiniz.

6. Adım: Veri Kaydı

Veri kaydı
Veri kaydı

RTC modüllerine yakından bakarsanız, içlerinde yerleşik bir AT24C32 EEPROM IC veya benzeri olduğunu fark edeceksiniz veya yukarıdaki gibi bir 24C256 kartı kullanabilirsiniz. Bu EEPROM IC'lerin çoğu, yukarıdaki ile benzer pin çıkışlarına sahiptir. Çeşitli miktarlarda depolama ile gelirler, ancak hepsine aynı şekilde erişilir. AT24C32 zaten karta lehimlendiğinden, doğrudan harici RTC'nin I2C'sinden kullanılabilir.

Yalnızca 24C256 IC veya benzerine sahipseniz, bunu bir breadboard'a kurabilir, A1, A2 ve A3'ü Gnd'ye, Vcc'yi 3.3V'a ve SDA AND SCL'yi I2C'ye bağlayabilirsiniz, WP yüzer halde bırakılabilir. Bazı EEPROM IC'ler yalnızca 5V'de çalışır, bu nedenle önce ilgili veri sayfasını kontrol edin.

ByteWR.lua, EEPROM'un 0x00 bellek konumuna 1 bayt veri yazar ve geri okur.

Desiderata.lua, ünlü metinden EEPROM'a birkaç satır yazar.

eeRead.lua, EEPROM'dan verileri okur ve yazdırır.

NOT: Bu programlar diğer EEPROM kartlarıyla da çalışmalıdır.

7. Adım: Sonuç

Veri kaydı için RTC ve EEPROM'un nasıl çalıştığını göstermeye çalıştım. Bu, daha fazla gelişmeniz için sadece bir başlangıç. Işık sensörleri, barometrik basınç sensörleri, sıcaklık ve nem sensörleri gibi çeşitli cihazları I2C bus'a bağlayabilir ve verileri EEPROM'a kaydedebilirsiniz.

Önerilen: