DS1307 ve OLED Ekranı Kullanan ESP32 Gerçek Zamanlı Saat (RTC)

Ds1307 Ve Oled Ekrani Kullanan Esp32 Gercek Zamanli Saat Rtc



ESP32 yerleşik bir RTC modülüyle birlikte gelir, ancak bu yalnızca güç olduğunda çalışır. Elektrik kesilirse saat sıfırlanır ve doğru zamanı tutamaz. Dolayısıyla, zamanı takip etmek veya zamana dayalı herhangi bir cihazı kontrol etmek istiyorsanız DS1307 RTC sensörünü deneyin. Bununla birlikte, ESP32 kartınıza bir yedek pil bağlamayı düşünüyor olabilirsiniz, ancak bu, elektrik kesintiniz varsa yapılacak en iyi senaryo değildir. En iyi alternatif, minimum bir yıl dayanabilen dahili pille birlikte gelen DS1307 sensörünü kullanmaktır.

İşleri açıklığa kavuşturmak için, ESP32'nin dahili Gerçek Zamanlı Saati (RTC), ana işlemci kapalıyken veya derin uykudayken bile zamanı takip edebilir. Fazla güç kullanmadan veya ana işlemciyi etkilemeden zamanı takip etmek için ESP32 RTC'yi kullanabilirsiniz. Ancak çalışması için hala güce ihtiyaç vardır; dahili RTC'nin çalışması için çok fazla değil ancak minimum miktarda güç gerekir.

Böylece elimizde yalnızca harici RTC modülünü kullanma çözümü kalıyor. ESP32 kartını DS1307 RTC modülüne arayüzleme adımlarına göz atalım.







İçindekiler:

1. RTC DS1307 Modülü Nedir?

DS1307, saati ve tarihi doğru bir şekilde takip edebilen düşük güçlü bir cihazdır. İkili kodlu ondalık (BCD) biçimini kullanır. Size zamanı saniye, dakika ve hatta saat ve gün gibi ayrıntılı bir biçimde söyleyebilir. Tarihi ay ve yıl gibi tam formatta da yazdırabilirsiniz. Ayrıca 2100'e kadar artık yılın ne zaman olduğunu da bilir. DS1307 ile iletişim kurmak için I2C protokolünü kullanabilirsiniz.





DS1307, harici bir 5V kaynak olmadan yaklaşık bir yıl boyunca ona güç verebilecek yerleşik bir pile sahiptir. Bu pil yedeklemesini kullanarak, ana güç kapalıyken bile zamanı koruyabilir. Ayrıca bazı verileri depolamak için 56 bayt SRAM'a sahiptir. DS1307, Arduino veya ESP32 kartıyla birleştirildiğinde birçok uygulamaya sahip kullanışlı bir cihazdır. Örneğin, bu veriler veri kaydı, alarm sistemleri veya endüstriyel kontrolde yardımcı olabilir. Güvenilir zaman işleyişine ihtiyacınız varsa DS1307 harika bir seçenektir.





RTC DS1307 Modül Özellikleri

RTC DS1307 modülü, RTC IC, bir EEPROM, bir kristal osilatör ve yedekleme için bir pil tutucusundan oluşur.



Aşağıda bu parçaların detayları yer almaktadır:

DS1307 RTC entegresi : DS1307 RTC IC, I2C protokolünü kullanarak saat ve tarihi takip eden 8 pinli bir çiptir. 500nA'dan az, çok az güç kullanır. Saati saniye, dakika ve saat olarak, tarihi ise gün, ay ve yıl olarak görüntüleyebilir. Ayrıca 24 saatlik ve 12 saatlik formatlar arasında geçiş yapabilir.

24C32 EEPROM entegresi : 24C32 EEPROM IC, Atmel'in ayarları, saati ve tarihi saklayan 32 baytlık bir çipidir. Ayrıca I2C protokolünü kullanır.

32.768kHz Kristal : 32,768kHz kristal osilatör, DS1307 RTC IC için saat frekansını sağlar.

Batarya tutucu : Pil tutucusu CR2032 pili tutar. 3V lityum madeni para hücresidir. DS1307 RTC IC'ye sürekli güç sağlar.

DS18B20 Sensör Temini : DS18B20 sensör provizyonu, DS18B20 sıcaklık sensörünü lehimlemenize ve kullanmanıza olanak tanır. Önceden lehimlenmemiştir. Delik paketini lehimleyebilir ve sıcaklığı modülün DS pininden alabilirsiniz.

Aşağıdaki listede DS1307 RTC sensörünün bazı hızlı özellikleri verilmektedir:

  • Çalışma gerilimi: 4,5–5,5 V, tipik olarak 5 V
  • Anlık tüketim : 1,5 mA'den az
  • Kesinlik : 0–40 °C, kristale bağlıdır
  • Pil : CR2032 (3 V para)
  • Hafıza : 56 bayt kalıcı RAM
  • Arayüz : İki kablolu (I2C) seri arayüz
  • Çıktı : 1Hz çıkış pini
  • Programlanabilir kare dalga çıkışı : Pil yedekleme modunda 500 nA'dan az tüketir
  • Elektrik kesintisi tespiti : Otomatik elektrik kesintisi tespiti ve anahtar devresi
  • Güç algılama devresi : Elektrik kesintisi durumunda otomatik olarak yedek beslemeye geçebilir
  • Artık yıl telafisi : 2100 yılına kadar geçerlidir

RTC DS1307 Modül Bağlantısı

Modülün farklı işlevlere sahip birkaç pimi vardır.

  • VCC Modüle güç sağlamak için 3,3V ile 5,5V arasında DC voltajına ihtiyaç duyan pindir.
  • GND alçak gerilim veya topraklama pinidir.
  • SDA Ve SCL I2C veri yolu üzerinden veri ve saat sinyallerini ileten pinlerdir.
  • DS RTC modülü üzerinde varsa DS1307 sensörü ile sıcaklığı ölçen pindir.
  • Kare nasıl programladığınıza bağlı olarak 1 Hz, 4 kHz, 8 kHz veya 32 kHz frekansında kare dalga sinyali üreten pindir.
  • BİR ana güç kapalıyken zamanı doğru tutmak için 3V pil kullanan pindir.

2. RTC DS1307 ve OLED Ekranın ESP32 ile Arayüzlenmesi

ESP32'yi DS1307 ve OLED Ekran ile arayüzlemek için ESP32 kartının yerleşik I2C pinlerini kullanabilirsiniz. Hem DS1307 hem de OLED ekran I2C tabanlı cihazlardır. Daha sonra I2C veri yolu üzerinden I2C ana yardımcı protokolünü kullanarak iletişim kurabilir.

ESP32'nin DS1307 ve OLED ekranla arayüzlenmesine geçmeden önce, ilk olarak bazı gerekli kütüphaneleri kurmanız gerekir.

Gerekli Kütüphanelerin Kurulumu

Biri RTC modülü ve diğeri OLED ekran için olmak üzere iki kütüphaneye ihtiyacınız olacak. OLED'i bir RTC modülüyle kullanarak şaşırtıcı ve etkileşimli saat önizlemeleri oluşturabilirsiniz. Saati ekranda gösterme planınız yoksa bu kütüphane kurulumunu atlayabilirsiniz.

İhtiyaç duyacağınız iki kütüphane şunlardır:

  • RTClib'i (Adafruit tarafından) bir RTC'den zaman ayarlamak ve almak için kullanılan bir Arduino IDE kütüphanesidir. Ayrıca tarihleri, saatleri ve süreleri değiştirmek için sınıflar da sağlar. Bu kitaplığı kullanarak DS1307 ve DS3231 gibi gerçek zamanlı saat (RTC) modüllerine arayüz oluşturabilir ve bunları programlayabilirsiniz.
  • S SD1306 (Adafruit tarafından) Arduino için OLED ekranları Arduino veya başka herhangi bir mikro denetleyici kartıyla arayüzleyip programlayabileceğiniz bir kütüphanedir.

Bu kitaplıkların her ikisini de Arduino IDE'ye indirip yüklemek için önce Kütüphane Müdürü RTClib kütüphanesini arayın ve tıklayın. Düzenlemek :

Yalnızca kitaplığı veya bağımlılıklarını yükleme seçeneğine sahip olacaksınız. Tıkla Tümünü Yükle Kütüphaneyi tamamen kurmak için düğmesine basın. Bu sayede kütüphanenin bağımlılıklarına bağlı olan kodu değiştirdiğinizde herhangi bir hata almayacaksınız.

Benzer şekilde SSD1306 kitaplığını arayın. Bu kütüphane bir OLED ekran için gereklidir. Tıklamak Düzenlemek Devam etmek için.

Bu sefer aynı onay mesajını da alacaksınız. Tıkla Tümünü Yükle seçenek.

Artık hem OLED hem de DS1307 kitaplıkları kuruldu ve kullanıma hazır. Ancak bundan önce OLED ekranın I2C adresini bulun.

3. OLED Ekranın I2C Adresini Bulma

I2C adresi, I2C veriyolundaki her cihaz için benzersiz bir tanımlayıcıdır. Ana cihazın belirli bir köle cihaza veri göndererek iletişim kurmasını sağlar. I2C adresinin amacı aynı veri yolu üzerindeki birden fazla cihaz arasındaki çakışmaları ve karışıklığı önlemektir.

Bir I2C cihazının adresini almak için Veriyolunu tarayan ve adresleri yazdıran basit çizim bulduğu cihazlar arasında. Alternatif olarak, varsayılan veya yapılandırılabilir adresini görmek için cihazın veri sayfasını kontrol edebilirsiniz.

Burada bizim durumumuzda I2C tarayıcı kodunu çalıştırdıktan sonra, Arduino IDE terminalinde OLED ekranının aşağıdaki I2C adresi görüntülenir.

Çoğu zaman sizin de aynı sonucu alma şansınız yüksektir 0x3C OLED ekranınızın adresi.

4. OLED ve RTC DS1307 Modülünün ESP32 ile Arayüzlenmesi

1. Hem DS1307 modülünün hem de SDA ve SCL pinlerini bağlayın. I2C pinlerine OLED ekran ESP32'nin. Genellikle, bunlar GPIO 21 ve GPIO 22'dir , ancak gerekirse kodda başka pinler de atayabilirsiniz.

2. DS1307'nin VCC ve GND'sini ve OLED ekranını ESP32'nin 3,3V ve GND pinlerine bağlayın.

3. Gerçek zamanlı saate yedek güç sağlamak için DS1307 modülüne bir CR2032 düğme pil takın.

4. Bu eğitimdeki örnek kodu ESP32 kartınıza yükleyin. Özel çıktılar için kodu değiştirin.

Yüklemenin ardından bir saat, ayarlanan saatten başlayacak ve saati OLED ekranında gösterecektir.

5. Devre Şeması

DS1307'li ESP32'nin devre şeması basittir; bağlanması gereken yalnızca dört kablo vardır. Hem OLED hem de DS1307 sensörlerinin I2C kablolarını SDA ve SCL kısaltabilirsiniz. Benzer şekilde, bu sensörlerin her ikisine de güç vermek için ESP32 kartının 3V3 ve GND pinleri kullanılabilir. İhtiyaç halinde ayrı bir kaynaktan da güç alabilirsiniz.

Not : ESP32'nin akım limiti aşılmadığı takdirde RTC DS1307'ye ESP32'nin 3,3V pininden güç vermek güvenlidir. Ancak güvenli bir sitede olmak istiyorsanız RTC modülü için ayrı bir güç kaynağı kullanabilir veya çalışma aralığı 3,3 ila 5,5 VDC arasında olan düşük güçlü DS3231 sensörünü deneyebilirsiniz.

Aşağıdaki resimde ESP32'nin RTC DS1307 sensörüyle bağlantısı gösterilmektedir.

Benzer şekilde saati görüntülemek için OLED ekranını bağlamak istiyorsanız aynı I2C pinlerini ve ESP32 kartının güç pinlerini kullanabilirsiniz.

6. Kod

Aşağıdaki kodu kullanarak RTC üzerinde güncel tarih ve saati ayarlayacağız. Saati ayarladıktan sonra kod, Arduino IDE terminalinde saati gösterecektir. Kodu yüklemeden önce mevcut tarih ve saatinizle güncellemeniz gerekir.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
karakter Week_days [ 7 ] [ 12 ] = { 'Pazar' , 'Pazartesi' , 'Salı' , 'Çarşamba' , 'Perşembe' , 'Cuma' , 'Cumartesi' } ;
geçersiz kurulum ( ) {
Seri.başlangıç ( 115200 ) ;
#ifndef ESP8266
sırasında ( ! Seri ) ;
#endif
eğer ( ! DS1307_RTC.begin ( ) ) {
Seri.println ( 'RTC bulunamadı' ) ;
sırasında ( 1 ) ;
}
DS1307_RTC.adjust ( TarihSaat ( F ( __TARİH__ ) , F ( __ZAMAN__ ) ) ) ;
}
geçersiz döngü ( ) {
Şimdiki TarihSaat = DS1307_RTC.now ( ) ;
Seri.baskı ( şimdi.yıl ( ) , Aralık ) ;
Seri.baskı ( '/' ) ;
Seri.baskı ( şimdi.ay ( ) , Aralık ) ;
Seri.baskı ( '/' ) ;
Seri.baskı ( şimdi gün ( ) , Aralık ) ;
Seri.baskı ( '(' ) ;
Seri.baskı ( Hafta içi [ now.dayOfTheWeek ( ) ] ) ;
Seri.baskı ( ')' ) ;
Seri.baskı ( şimdi.saat ( ) , Aralık ) ;
Seri.baskı ( ':' ) ;
Seri.baskı ( şimdi.dakika ( ) , Aralık ) ;
Seri.baskı ( ':' ) ;
Seri.baskı ( şimdi.ikinci ( ) , Aralık ) ;
Seri.println ( ) ;
gecikme ( 1000 ) ;
}

Bu kod şunu kullanır: RTClib kütüphanesi tarih ve saati takip eden DS1307 gerçek zamanlı saat modülüyle arayüz oluşturmak için.

kurmak fonksiyon baud hızının başlatılmasıyla başladı. Daha sonra bu bölümde bilgisayarın tarih ve saatini DS1307 sensörü ile senkronize etme fonksiyonunu tanımladık. Bu, kod derleme zamanını RTC sensörüne yükleyecektir.

Şunu kullanabilirsiniz: döngü RTC'den tarih ve saati alma işlevi. Daha sonra bunu seri monitörde şu şekilde görüntüleyebilirsiniz: yıl/ay/gün (haftanın günü) saat:dakika:saniye. Kodun çok hızlı çalışmaması için her döngüden sonra bir saniyelik gecikme eklemeyi unutmayın.

OLED Ekranda Geçerli Saati Görüntüleme

Aynı saati OLED ekranda görüntülemek için OLED ekrana ekstra bir kod parçası eklememiz gerekiyor. Verilen kodu yüklemeniz yeterli. Bu kod, geçerli saati OLED ekranınızda gösterecektir.

Unutmayın burada 0,96 inç 128×64 I2C SSD OLED Ekran Modülünü kullanıyoruz. Başka bir boyut kullanıyorsanız kodu buna göre değiştirin. Ayrıca I2C adresini kontrol edin ve verilen kodda değiştirin. Bizim durumumuzda OLED ekran için 0x3C I2C adresimiz var.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 ekranı ( SCREEN_WIDTH, SCREEN_HEIGHT, & Tel, - 1 ) ;
RTC_DS1307RTC;
karakter günleri [ 7 ] [ 12 ] = { 'Pazar' , 'Pazartesi' , 'Salı' , 'Çarşamba' , 'Perşembe' , 'Cuma' , 'Cumartesi' } ;
geçersiz kurulum ( ) {
Seri.başlangıç ( 115200 ) ;
eğer ( ! RTC.begin ( ) ) {
Seri.println ( 'RTC bulunamadı' ) ;
sırasında ( 1 ) ;
}
RTC.adjust ( TarihSaat ( F ( __TARİH__ ) , F ( __ZAMAN__ ) ) ) ;
eğer ( ! ekran.başlangıç ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Seri.println ( F ( 'SSD1306 tahsisi başarısız oldu' ) ) ;
için ( ;; ) ;
}
gecikme ( 1000 ) ;
ekran.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BEYAZ ) ;
display.setİmleç ( 30 , yirmi ) ;
ekran.println ( 'Linux' ) ;
ekran.görüntü ( ) ;
gecikme ( 3000 ) ;
ekran.clearDisplay ( ) ;
}
geçersiz döngü ( ) {
Şimdiki TarihSaat = RTC.now ( ) ;
ekran.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setİmleç ( 0 , 0 ) ;
ekran.baskı ( şimdi gün ( ) ) ;
ekran.baskı ( '/' ) ;
ekran.baskı ( şimdi.ay ( ) ) ;
ekran.baskı ( '/' ) ;
ekran.baskı ( şimdi.yıl ( ) ) ;
ekran.println ( günler [ now.dayOfTheWeek ( ) ] ) ;
ekran.println ( '' ) ;
display.setİmleç ( 0 , 40 ) ;
eğer ( şimdi.saat ( ) < 10 )
ekran.baskı ( '0' ) ;
ekran.baskı ( şimdi.saat ( ) ) ;
ekran.baskı ( ':' ) ;
eğer ( şimdi.dakika ( ) < 10 )
ekran.baskı ( '0' ) ;
ekran.baskı ( şimdi.dakika ( ) ) ;
ekran.baskı ( ':' ) ;
eğer ( şimdi.ikinci ( ) < 10 )
ekran.baskı ( '0' ) ;
ekran.println ( şimdi.ikinci ( ) ) ;
ekran.görüntü ( ) ;
}

Kod, RTC ve ekran için kurduğumuz kütüphanelerle başladı. Bundan sonra ekran boyutunu ve görüntü adresini tanımlar. Diziyi hafta içi adlarıyla başlatır.

kurmak kısmı seri iletişimle başlar. RTC ve ekranın çalışıp çalışmadığını kontrol eder. Daha sonra 3 saniye boyunca görüntülenecek “Linuxhint” string metnini tanımladık. Bu yalnızca bir açılış veya başlangıç ​​mesajıdır; bu mesajı özel metninizle de değiştirebilirsiniz.

döngü işlevi DS1307 modülünün tarih ve saatini alır. Bundan sonra ekranı temizler ve tarih ve saati formatlanmış bir şekilde yazdırır. Kod ayrıca değerlerinin 10'dan küçük olması durumunda saat, dakika ve saniyelerin başına sıfırlar ekler.

7. Donanım

Kodu ESP32 kartına yükledikten sonra OLED ekranda aşağıdaki çıktıyı göreceksiniz. Donanım olarak OLED ekranı ve I2C RTC DS1307 modülünü kullandık. 30 pinli ESP32 kartı kullanılmaktadır. Başka herhangi bir ESP32 kartıyla da deneme yapabilirsiniz ancak I2C pinlerini doğru şekilde bağladığınızdan emin olun.

Çözüm

RTC DS1307, pil yedekleme desteğine sahip 56 baytlık bir SRAM'a sahiptir. I2C iletişim protokolünü kullanan 8 pinli bir cihazdır. DS1307 RTC modülünü ESP32 ile arayüzlemek için ESP32 kartının I2C pinlerini (GPIO 22 (SCL) ve GPIO 21 (SDA)) kullanabilirsiniz. Saati bir Arduino IDE konsoluna yazdırabilir veya saati görüntülemek için OLED veya I2C LCD gibi herhangi bir ekranı kullanabilirsiniz. DS1307 RTC modülü, çeşitli uygulamalarda saat ve tarihi takip etmek için kullanışlı bir cihazdır. Bazı ana uygulamalar arasında veri kaydediciler, dijital saatler ve akıllı saatler bulunur.