Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

saat modul etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
saat modul etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Mayıs 2021 Salı

DS1307 RTC Modülü ile Arduino

 

DS1307 RTC Modülü ile Arduino


Hepimiz projelerimiz için kullandığımız çoğu MCU'nun zamandan bağımsız olduğunu biliyoruz; basitçe çevrelerindeki zamanın farkında değillerdir. Projelerimizin çoğu için sorun değil, ancak arada bir zamanı tutmanın başlıca endişe kaynağı olduğu bir fikirle karşılaştığınızda, DS1307 RTC modülü bir kurtarıcıdır. Veri kaydı, saat oluşturma, zaman damgası, zamanlayıcılar ve alarmlar içeren projeler için mükemmeldir.



DS1307 RTC yongası

Modülün merkezinde Maxim - DS1307'den düşük maliyetli, oldukça hassas bir RTC çipi bulunuyor Tüm zaman işleyişi işlevlerini yönetir ve seçtiğiniz herhangi bir mikro denetleyici ile kolayca arayüzlenebilen basit bir iki kablolu I2C arabirimine sahiptir.

Çip saniye, dakika, saat, gün, tarih, ay ve yıl bilgilerini saklar. Ayın sonundaki tarih, artık yıl düzeltmeleri dahil (2100'e kadar geçerli) 31 günden daha az olan aylar için otomatik olarak ayarlanır. Saat, AM / PM göstergesiyle 24 saat veya 12 saat biçiminde çalışır.

Bu kartın diğer harika özelliği, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini veren ve programlı olarak etkinleştirilebilen SQW pini ile birlikte gelir.DS1307, zaman tutmak için harici bir 32kHz kristal ile birlikte gelir. Bu kristallerle ilgili sorun, dış sıcaklığın salınım frekanslarını etkileyebilmesidir. Sıklıktaki bu değişiklik önemsizdir, ancak kesinlikle artar.









Bu bir sorun gibi görünebilir, ama değil. Aslında bu, saatin ayda yaklaşık beş dakika kadar kapalı kalmasıyla sonuçlanır.

Yedek batarya

DS1307, bir pil girişi içerir ve cihazın ana gücü kesildiğinde doğru zaman işleyişi sağlar.

Yerleşik güç algılama devresi, güç kesintilerini tespit etmek için VCC'nin durumunu sürekli olarak izler ve otomatik olarak yedek kaynağa geçer. Dolayısıyla, elektrik kesintileri konusunda endişelenmenize gerek yok, MCU'nuz yine de zamanı takip edebilir.

DS1307 Modülünde CR2032 Pil Tutucu

Kartın alt tarafında 20mm 3V lityum çakmaklar için bir pil tutucu bulunur. Herhangi bir CR2032 pil uygun olabilir.

47mAh kapasiteli tam şarjlı bir CR2032 pil kullanıldığını ve çipin minimum 300nA tükettiğini varsayarsak, pil harici bir 5V güç kaynağı olmadan RTC'nin minimum 17.87 yıl çalışmasını sağlayabilir.

47mAh / 300nA = 156666.67 saat = 6527.78 gün = 17.87 yıl

Yerleşik 24C32 EEPROM

DS1307 RTC modülü, sınırlı okuma-yazma döngülerine sahip Atmel'in 32 baytlık 24C32 EEPROM yongasıyla birlikte gelir. Ayarları veya gerçekten herhangi bir şeyi kaydetmek için kullanılabilir.

DS1307 Modülünde 24C32 EEPROM Çip

24C32 EEPROM, iletişim için I2C arayüzünü kullanır ve DS1307 ile aynı I2C veriyolunu paylaşır.

Yerleşik 24C32 EEPROM, kablolu bir I2C adresine sahiptir ve 0x50 HEX olarak ayarlanmıştır.

Eğitimin sonunda 24C32 EEPROM üzerinde okuma / yazma için kod verilmiştir.



Modülün Gizli Özelliği - DS18B20DS1307 RTC modülümüzde genellikle fark edilmeyen bir hüküm vardır. DS18B20 sıcaklık sensörünü kurmamıza izin verir.Pil tutucunun hemen yanındaki üst köşedeki 3 delik (U1 olarak etiketlenmiştir) DS18B20'nin takılı olduğu yerdir.
DS1307 Modülünde DS18B20 için provizyon

DS18B20'yi kurduğunuzda, DS pininden sıcaklık okumaları alabileceksiniz Bu okumalar ayrıca koddaki sıcaklık temelli zaman kaymasını telafi etmek için kullanılabilir.

DS18B20'yi lehimlemek için ipek ekranı takip edin. Ayrıca VCC ve DS arasında bir 4.7K dirence ihtiyacınız olabilir.

DS1307 RTC Modülü Pinout

DS1307 RTC modülü, kendisini dış dünyaya arayüzleyen toplam 7 pime sahiptir. Bağlantılar aşağıdaki gibidir:

DS1307 RTC Modülü Pinout

SQW pin, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini çıkarır ve programlı olarak etkinleştirilebilir.

DS Modülünüzde pil tutucusunun hemen yanında (U1 olarak etiketlenen) bir DS18B20 sıcaklık sensörü takılıysa, pinin çıkış sıcaklığı okumaları olduğu varsayılır.

SCL I2C arayüzü için saat girişidir ve seri arayüzde veri hareketini senkronize etmek için kullanılır.

SDA I2C seri arabirimi için veri girişi / çıkışıdır.

VCCpin, modül için güç sağlar. 3.3V ile 5.5V arasında herhangi bir yerde olabilir.

GND bir toprak pimidir.

BAT cihaza giden ana güç kesildiğinde doğru zaman işleyişi sağlamak için herhangi bir standart 3V lityum hücre veya diğer enerji kaynağı için bir yedek besleme girişidir.

DS1307 RTC modülü

RTC'yi Arduino'ya bağlayalım.

Bağlantılar oldukça basit. VCC pinini Arduino'daki 5V çıkışına bağlayarak başlayın ve GND'yi toprağa bağlayın.

Şimdi I2C iletişimi için kullanılan pinlerde kaldık. Her Arduino Board'un uygun şekilde bağlanması gereken farklı I2C pinlerine sahip olduğunu unutmayın. R3 düzenine sahip Arduino kartlarında, SDA (veri hattı) ve SCL (saat hattı), AREF pinine yakın pin başlıkları üzerindedir. A5 (SCL) ve A4 (SDA) olarak da bilinirler.

Bir Mega'nız varsa, iğneler farklıdır! Dijital 21 (SCL) ve 20 (SDA) kullanmak isteyeceksiniz. Hızlı anlamak için aşağıdaki tabloya bakın.

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo / Mikro32

Aşağıdaki şema, her şeyi nasıl bağlayacağınızı gösterir.

Arduino ile kablolama DS1307 RTC modülü
Arduino ile kablolama DS1307 RTC modülü
RTClib kitaplığını yükleme

Bir RTC modülüyle iletişim kurmak bir sürü iştir. Neyse ki, RTClib kitaplığı tüm karmaşıklıkları gizlemek için yazılmıştır, böylece RTC verilerini okumak için basit komutlar verebiliriz.Kitaplığı kurmak için Sketch> Dahil Et> Kitaplıkları Yönet'e gidin… Kitaplık Yöneticisinin kitaplıklar dizinini indirmesini ve kurulu kitaplıkların listesini güncellemesini bekleyin.Arduino Kitaplığı Kurulumu - Arduino IDE'de Kitaplıkları Yönetmeyi Seçme









Aramanızı ' rtclib ' yazarak filtreleyin Birkaç giriş olmalı. Adafruit by RTClib'i arayın. Bu girişe tıklayın ve ardından Yükle'yi seçin.

RTClib Arduino kütüphanesini kurma

Arduino Kodu - Tarih ve Saat Okuma

Aşağıdaki taslak, DS1307 RTC modülünde tarih ve saati nasıl ayarlayacağınız / okuyacağınız konusunda size tam bir anlayış verecektir ve daha pratik deneyler ve projeler için temel oluşturabilir.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () 
{
  Serial.begin(9600);
  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC lost power, lets set the time!");
	
	// Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
	
    // Following line sets the RTC with an explicit date & time
    // for example to set January 27 2017 at 12:56 you would call:
    // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
  }
}

void loop () 
{
    DateTime now = rtc.now();
    
    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.println("Unix Time: ");
    Serial.print("elapsed ");
    Serial.print(now.unixtime());
    Serial.print(" seconds/");
    Serial.print(now.unixtime() / 86400L);
    Serial.println(" days since 1/1/1970");
    
    // calculate a date which is 7 days & 30 seconds into the future
    DateTime future (now + TimeSpan(7,0,0,30));
    
    Serial.println("Future Date & Time (Now + 7days & 30s): ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(1000);
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde DS1307 Çıkışı
Seri Monitörde DS1307 Çıkışı

Kod Açıklaması:

Taslak, modülle iletişim kurmak için wire.h & RTClib.h kitaplıklarını dahil ederek başlar. Daha sonra bir RTClib kitaplığı nesnesi oluşturuyoruz ve daysOfTheWeekgün bilgilerini depolamak için 2D karakter dizisi tanımlıyoruz .

Kodun kurulum ve döngü bölümlerinde, RTC modülüyle etkileşim kurmak için aşağıdaki işlevleri kullanırız.

begin () işlevi, RTC modülünün bağlı olmasını sağlar.

isrunning () işlevi, çipin zaman izini kaybedip kaybetmediğini kontrol etmek için DS1307'nin dahili I2C kayıtlarını okur. İşlev yanlış döndürürse, tarih ve saati ayarlayabiliriz.

Adjust () işlevi tarih ve saati ayarlar. Bu aşırı yüklenmiş bir işlevdir.

  • Aşırı yüklenmiş bir yöntem DateTime(F(__DATE__), F(__TIME__)), eskizin derlendiği tarih ve saati ayarlar.
  • İkinci aşırı yüklenmiş yöntem DateTime(YYYY, M, D, H, M, s), RTC'yi kesin bir tarih ve saatle ayarlar. Örneğin, 27 Ocak 2017'yi saat 12: 56'ya ayarlamak için şunları arayabilirsiniz:rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));

now () işlevi geçerli tarih ve saati döndürür. Dönüş değeri genellikle veri türü DateTime değişkeninde saklanır.

year () işlevi geçerli yılı döndürür.

month () işlevi geçerli ayı döndürür.

day () işlevi geçerli günü döndürür.

dayOfTheWeek () işlevi haftanın geçerli gününü döndürür. Bu işlev genellikle yukarıdaki programda tanımlandığı gibi gün bilgilerini depolayan bir 2D karakter dizisinin dizini olarak kullanılır.daysOfTheWeek

hour () işlevi mevcut saati döndürür.

dakika () işlevi geçerli dakikayı döndürür.

second () işlevi geçerli saniyeyi döndürür.

unixtime () işlevi saniye cinsinden unix zamanını döndürür. Unix zamanı, zamandaki bir noktayı tanımlamak için kullanılan bir sistemdir. 00: 00: 00'dan beri geçen saniye sayısıdır (Koordineli Evrensel Saat olarak bilinir - 1 Ocak 1970 Perşembe).

TimeSpan () işlevi, geçerli saate / zamandan zaman eklemek / çıkarmak için kullanılır. Gün, saat, dakika ve saniye ekleyebilir / çıkarabilirsiniz. Aynı zamanda aşırı yüklenmiş bir işlevdir.

  • now() + TimeSpan(seconds) geçerli saate eklenen saniye ile gelecekteki zamanı döndürür.
  • now() - TimeSpan(days,hours, minutes, seconds) geçmiş zamanı döndürür.

Arduino Kodu - 24C32 EEPROM'da Okuma / Yazma

DS1307 RTC modülü ile bonus olarak 32 bayt Elektrikle Silinebilir ROM elde edersiniz. Cihazın ana gücü kesilse bile içeriği silinmeyecektir.

Aşağıdaki program 24C32 EEPROM'dan bir mesaj yazar ve sonra okur. Bu programı ayarları veya şifreleri veya herhangi bir şeyi kaydetmek için kullanabilirsiniz.

#include <Wire.h>

void setup()
{
    char somedata[] = "lastminuteengineers.com"; // data to write
    Wire.begin(); // initialise the connection
    Serial.begin(9600);
    Serial.println("Writing into memory...");
	
	// write to EEPROM
    i2c_eeprom_write_page(0x57, 0, (byte *)somedata, sizeof(somedata));

    delay(100); //add a small delay
    Serial.println("Memory written");
}

void loop()
{
    Serial.print("Reading memory: ");
    int addr=0; //first address
	
	// access the first address from the memory
    byte b = i2c_eeprom_read_byte(0x57, 0);

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x57, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);
}

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
        Wire.write(data[c]);
    Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,length);
    int c = 0;
    for ( c = 0; c < length; c++ )
        if (Wire.available()) buffer[c] = Wire.read();
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde 24C32 EEPROM Çıkışı

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.





2 Mayıs 2021 Pazar

DS1307 RTC Modülü - OLED de Tarih/Saat ve Arduino

 

DS1307 RTC Modülü - OLED de Tarih/Saat ve Arduino

Bu eğitimde, bir DS1307 RTC modülünün arayüzünü öğreneceğiz. Öncelikle bu sorulara bakacağız; RTC (Gerçek zamanlı saat) nedir? Neden gerçek zamanlı saat kullanılır? Bir RTC modülü, I2C iletişim veri yolunda Arduino ile nasıl iletişim kurar? Arduino ve DS1307 RTC modülünü kullanarak dijital saat nasıl yapılır? İkinci olarak, sonda pinout, pin yapılandırma detayları, Arduino ile arayüzleme devresi ve örnek kodu tartışacağız.















Bu makaleye geçmeden önce, temel bir Arduino programlama bilgisine ve Arduino IDE'nin nasıl kullanılacağına sahip olmalısınız. LCD'yi Arduino ile nasıl arayüzleyeceğinizi ve Arduino'nun giriş / çıkış portlarını nasıl kullanacağınızı bilmelisiniz. 

RTC veya Gerçek Zamanlı Saat nedir?

Adından da anlaşılacağı gibi, zamanın kaydını tutmak ve zamanı göstermek için gerçek zamanlı bir saat kullanılır. Bilgisayarlar, dijital akıllı saatler, veri kaydediciler gibi birçok dijital elektronik cihazda ve zamanı takip etmeniz gereken durumlarda kullanılır. Gerçek zamanlı bir saatin en büyük faydalarından biri, güç kaynağı mevcut olmasa bile zamanın kaydını tutmasıdır.

Şimdi soru, bir elektronik cihaz, bir güç kaynağı kullanmadan gerçek zamanlı saat gibi nasıl çalışabilir. Çünkü neredeyse tüm RTC modülleri, yıllarca çalışabilen küçük madeni para boyutu 20mm 3V lityum düğme pillerle birlikte gelir. Genellikle CR2032 bobin hücreleri kullanılır.

DS1307 RTC IC

DS1307 RTC modülünün merkezinde 8 pinli DS1307 yongası bulunur. Saniyeleri, dakikaları, saatleri, günleri, ayları ve yılları takip etmek için kullanılan gerçek zamanlı bir saat sağlar. Bizim durumumuzda olduğu gibi Arduino kullandığımız gibi diğer cihazlarla iletişim kurmak için I2C iletişim protokolünü kullanır. Arduino, I2C iletişim protokolünü kullanarak DS1307'den saat ve tarih değerlerini okur. Ayrıca yedek batarya yardımı ile elektrik kesintisi durumunda tam zamanın kaydını tutma özelliğine de sahiptir. Diğer bazı elektronik bileşenleri kullanarak gerçek zamanlı bir saat yapmak için kullanılır.

DS1307 Çip Pin Çıkışı

Aşağıdaki şekil DS1307 IC'nin pinout diyagramını göstermektedir.

DS1307 pin çıkışı

Şimdi her bir iğnenin işlevselliğini tek tek görelim.

  • X1 ve X2, kristal osilatörler için kullanılır. Genellikle DS1307 ile kullanılan kristal osilatör değeri 32.768k Hz'dir.
  • VBAT: Bir CR2032 bobin hücresini yedek güç olarak bağlayın. Değeri 3-5 volt arasında olmalıdır. 5 volttan fazla voltaj DS1307'yi kalıcı olarak yakabilir. Elektrik kesintisi durumunda zamanı takip etmek için bir yedek pil kullanılır.
  • Vcc ve GND güç kaynağı pinleridir
  • SDA ve SCL, I2C iletişim veri yolu üzerinden diğer cihazlarla iletişim kurmak için kullanılır .
  • SQW pini, 1Hz, 4kHz, 8kHz veya 32kHz gibi farklı frekanslarda kare dalgalar sağlar. Çıkış dalgasının frekansı, bir I2C veriyolu üzerinden DS1307'ye bir sinyal gönderilerek seçilebilir.

Bu IC'yi doğrudan Arduino ile kullanmak istiyorsanız, DS1307'ye bağlanmak için harici bileşenler kullanmanız gerekir. Aşağıdaki devre şeması, gerekli tüm bileşenlerin DS1306 ile bağlantılarını gösterir:

gerçek zamanlı saat DS1307 devre şeması
Gerçek Zamanlı Saat DS1307 Devre Şeması

Ancak DS1307 yongasını tek başına kullanmak ve kendi PCB tasarımınızı yapmak yerine çok düşük maliyetle kullanıma hazır bir DS1307 RTC modülü alabilirsiniz.

DS1307 RTC Modülü

DS1307 RTC modülü, bir DS3107 yongasının doğru işlevselliği için gerekli tüm yerleşik bileşenlere sahiptir. Bunun da ötesinde, 20 mm 3V lityum düğme pil bağlamak için bir tutucu içerir. Bu tutucu herhangi bir CR2032 pil içerebilir. Şimdi bu modülün bileşenlerini tek tek tartışalım:

DS1307 RTC modülünün merkezinde daha önce tartıştığımız bir çip var. Bu çip saniyelerin, dakikaların, saatlerin, günlerin ve ayların kaydını tutar. Her ayın sonunda, bu çip saniyelerini: dakika: saat ve tarihi otomatik olarak ayarlar. Saat göstergesini 12 saatlik AM ve PM veya 24 saatlik formatta yapılandırmak da mümkündür.

DS1307 RTC modülü bileşenleri

32kHz Kristal Osilatör

Daha önce tartışıldığı gibi, DS1307 yongası çalışması için (zaman tutma) 32KHz harici bir kristal osilatöre ihtiyaç duyar. Bu nedenle, RTC modülü 32KHz'lik bir harici kristal osilatör ile birlikte gelir.

Ancak bu 32KHz kristal osilatörle ilgili bir sorun var, bu da çevresel sıcaklıktaki bir değişikliğin kristal osilatörün salınım frekansını etkilemesidir. 32KHz harici kristal osilasyon frekansındaki bu değişiklik ihmal edilebilir düzeydedir. Ancak uzun vadede bir hata gösterir. Ayda 2-3 dakikalık bir saat sapması verir.

Yerleşik 24C32 EEPROM

DS1307 RTC modülü ayrıca yerleşik 24C32 EEPROM içerir. Bu EEPROM 32 bayt depolayabilir ve sınırlı okuma-yazma işlemlerine sahip olabilir. Alarm tabanlı projeler için bir RTC modülü kullanmak istediğimizde zaman kazanmak için bu hafızayı kullanabiliriz. Örneğin, her gün 08: 00'e bir alarm ayarlamak istiyoruz. Bu zaman değerini EEPROM'a kaydedebiliriz ve zaman bu kaydedilen değerle eşleştiğinde bir alarm başlar.

Bu EEPROM çipleri ayrıca I2C veriyolu üzerinden mikrodenetleyiciler veya Arduino ile iletişim kurar. Dolayısıyla, DS1307 ile aynı I2C veriyolunu paylaşır. Aynı I2C veriyolunda onlarla iletişim kurmak için EEPROM (o 0x50 Hex) ve DS1307 yongasına farklı bağımlı adresler atanır.

Yedek pil

Bir RTC modülünün arka tarafında, CR2032 bobin hücresini bağlamak için bir tutucu vardır. Bu yedek pil, DS1307'ye bağlı ana güç kaynağı arızalandığında bile zamanı doğru tutmak için kullanılır. Bu çip, ana gücü algılayan bir güç algılama devresi içerir ve ana güç kapandığında yedek bobin hücresine geçer.

DS1307 RTC modülü yedek pili ve DS18B20 sensörü

Yedekleme modunda, DS1307 yalnızca 300nA akım tüketir. Bu, madeni para pilini temel alan bir yedek pilin 17 yıldan daha uzun süre çalışabileceği anlamına gelir. Çünkü genellikle CR2032 pilinin kapasitesi 47mAh'dir ve yonga, pilden güç aldığında yalnızca 300nA tüketir.
Life_time = 47mAh / 300nA = 156666 saat = 6527 gün = 17+ yıl

DS18B20 Sensörü

Bu modülde harici bir DS18B20 dijital termometreyi bağlamak için boş bir yuva vardır. Sağ alt köşedeki üç boş pin çıkışı, DS18B20 sensörü için bir yer tutucudur ve sensörün çıkışı, RTC modülünün DS pininden alınabilir.

DS1307 RTC Modülü Pinout

Aşağıdaki şekil, pim şemasını göstermektedir. Bu modül, ikisi güç kaynağı pini ve ikisi I2C iletişim veriyolu için SCL ve SDA pinleri olmak üzere toplam 7 pini açığa çıkarır. Tüm bu pinlerin işlevselliğini önceki bölümlerde görmüştük.

DS1307 RTC Modülü pin çıkışı

DS1307 ve Arduino Kablolama Şeması

Öncelikle DS1307 RTC modülü ve Arduino ile bu bağlantı şemasına göre bağlantı yapın:

Arduino ile arayüz oluşturan DS1307 RTC Modülü
Arduino UNODS1307 RTC Modülü
5VVCC
GNDGND
A4SDA
A5SCL

DS1307 Kitaplığını Arduino IDE'ye Kurun

Bir DS1307 RTC modülünü programlamak için Arduino'nun I2C iletişim pinlerini kullanıyoruz. I2C iletişimini anlamıyorsanız, bu raporu okuyabilirsiniz:

  • I2C İletişim Arduino

Ancak sıfırdan bir kod yazmak için bir alıştırma gerektirir. Neyse ki, bir RTC modülünden zaman ölçümleri almak için geri arama işlevlerini uygulayan bir Arduino RTClib kitaplığı mevcuttur. Bu kitaplık, I2C iletişimi üzerinden bir RTC modülüyle etkileşim kurmanın tüm karmaşıklığını gizler. DS1307'den veri okumak için RTClib tarafından uygulanan basit geri arama işlevlerini kullanabiliriz. 

Bu nedenle, Arduino ile bir DS1307 RTC modülünü programlamak için Arduino IDE'de bulunan RTClib kütüphanesini kullanacaksınız. Bu kütüphaneyi uygulamak için öncelikle Arduino'nun kütüphane yöneticisine giderek bu kütüphaneyi Arduino IDE'ye kurmamız gerekiyor. Arduino IDE'yi açın, Araçlar> Kitaplıkları Yönet'e gidin.

DS3231 kitaplığını Arduino IDE'ye yükleyin

Bundan sonra, bu pencere kütüphane yöneticisi penceresi görünecektir. Arama çubuğuna yazarak "RTClib" i arayın. DS1307 için birçok seçenek göreceksiniz. Ancak bu eğitimde kullanacağımız, Adafruit tarafından RTClib'dir. Adafruit tarafından RTClib'i seçin ve yükle düğmesine tıklayın. 

DS3231 RTC modül kitaplığını Arduino IDE'ye yükleyin

Kur düğmesine tıkladığınızda, RTClib'in şu anda Arduino IDE'nizde yüklü olmayan diğer kitaplık bağımlılıklarını gerektirebileceğine dair bir mesaj alabilirsiniz. Kur butonuna tıklayarak tüm bağımlılıkları kurmanızı tavsiye ederiz. Aksi takdirde, RTClib düzgün çalışmayacaktır.

DS3231 kitaplık yazılımı bağımlılık kitaplıkları

Arduino Kodu

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_DS1307 DS1307_RTC;

char Week_days[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  Serial.begin(57600);

#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

  if (! DS1307_RTC.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

  if (DS1307_RTC.lostPower()) {
    Serial.println("RTC lost power, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    DS1307_RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // DS1307_RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
  // DS1307_RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  // DS1307_RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

void loop () {
    DateTime now = DS1307_RTC.now();

    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(Week_days[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, 6 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

    Serial.print("Temperature: ");
    Serial.print(DS1307_RTC.getTemperature());
    Serial.println(" C");

    Serial.println();
    delay(3000);
}

DS1307 ve Arduino ile OLED

Şimdi OLED ekranında zamanı ve verileri görüntülemek istiyorsanız, bu şemaya göre bağlantı yapın. SSD1306 OLED'i aynı I2C veri yolu ile bağlayın. 

DS1307 ve Arduino ile OLED

Arduino Kodu OLED ve DS1307

Araçlar> Kitaplık Yöneticisi'ne giderek Arduino IDE'ye Adafruit SSD1306 OLED kitaplığını kurduğunuzdan emin olun.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, 4);
RTC_DS1307 RTC;
void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(1000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 11);
  // Display static text
  display.println("Digital Clock");
  display.display(); 
  delay(1000);
  display.clearDisplay();
}

void loop() {
   display.setTextSize(1);
  DateTime now = RTC.now();
  display.setCursor(40,30);
   display.setTextSize(1);
   display.print(now.day());
 display.print('/');
 display.print(now.month());
 display.print('/');
 display.print(now.year());
 display.print(' ');
 display.setCursor(40, 40);
if (now.hour()<10)
 display.print('0');
 display.print(now.hour());
 display.print(':');
if (now.minute()<10)
 display.print('0');
 display.print(now.minute());
 display.print(':');
if (now.second()<10)
 display.print('0');
 display.print(now.second());
delay(1000);
display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(10, 4);
  // Display static text
  display.println("Digital Clock");
  display.display(); 
  delay(1000);
}

DS1307 Proteus Simülasyonu

Bu bölümde, DS1307 RTC modülünün tüm harici bileşenleri kullanarak bir proteus simülasyonunu göreceğiz ve 16 × 2 LCD'de zaman ve verilerin değerini göstereceğiz.


Proteus Devresi 

Aşağıdaki devre, bir Arduino ile harici bileşenlerle birlikte DS1307 yongasının bağlantılarını gösterir. DS1307'nin SCL ve SDA pinleri Arduino'nun SCL ve SDA pinleri ile bağlanır. Arduino hakkında bir bilgi edinmek için Arduino ile LCD arayüz ve diğer temel makalelerle ilgili yukarıda belirtilen makaleyi zaten incelediyseniz, aşağıdaki devreyi kolayca anlayabilirsiniz.


Arduino Kodu

Bu Arduino çizimi, 16 × 2 LCD'de saat ve tarih değerini gösterir.

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 RTC;

void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(20, 4);

pinMode(8,OUTPUT);

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop () {
DateTime now = RTC.now();
lcd.setCursor(0, 0);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(' ');
lcd.setCursor(0, 1);
if (now.hour()<10)
lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute()<10)
lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second()<10)
lcd.print('0');
lcd.print(now.second(), DEC);
delay(1000);
}

Yukarıdaki kodun sonucu aşağıda verilmiştir:

Gerçek zaman saati ve Arduino sonucunu kullanan DIgital saatin devre şeması

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.