Arduino 4 Digit 7 Segment DS1302 RTC Saat

Elimdeki 4 digit 7 segment display led'i değerlendireyim dedim. Ortaya iki proje çıktı:
--- Saat
--- Display parlaklık ayarlı saat (pot ile)


İnternette biraz araştırma yaptım.  ornekyazilim.com linkinde uygun bir proje gördüm. Hemen malzemeleri hazırladım. Montaja geçtim. Kabloları bağladım. Kodları Arduino Uno'ya yükledim. Sonuç sıfır. Led gösterge saçmalıyor. 7-8 denemeden sonra çalıştırabildim. Problem breadbord bağlantılarında ve jumper kablolardaymış. Dikkat etmek lazım breadbordlar problem çıkarabiliyor. Devre kesinlikle çalışıyor. 

Gerekli malzemeler:
Arduino Uno
DS1302 RTC modülü
4 digit 7 segment display
breadboard
jumper kablo

Elinizdeki Led ortak anotlu ise program kodlarını doğrudan kullanabilirsiniz.
Eğer ortak katotluysa
byte hardwareConfig = COMMON_ANODE;    satırını
byte hardwareConfig = COMMON_CATHODE;   şeklinde değiştirin.
Kütüphane dosyası içinde yazıyor. Kütüphane dosyalarının içini incelemek iyi oluyor.

DS1302'nin pinlerini Arduino  Uno'nun A0, A1, A2 pinlerine; clk, dat, rst sırasına göre bağlayın.



RTC VCC >> Arduino 5v pini
RTC GND >> Arduino GND pini
RTC CLK >> Arduino A0 pini
RTC DAT >> Arduino A1 pini
RTC RST >> Arduino A2 pini

Led göstergenin Arduino'ya olan bağlantılarını dikkatli gerçekleştirin. Hemen pes etmeyin. Özellikle elinizdeki displayin digit ve segment pinlerini araştırın. Elinizdeki model farklı olabilir. Çünkü internette verilen kodlarda segment ve digit pinler farklı farklı.
Eğer sizin de göstergeniz saçmalarsa mutlaka bağlantıları tekrar tekrar gözden geçirin.
Kütüphane dosyalarını eklemeyi unutmayın.

Saat ve tarih ayarının olduğu satırı ilk yüklemenizde aktif hale getirin. Sistem doğru çalıştıktan sonra bu iki satırı tekrar kapatın. Yoksa sisteme her enerji verdiğinizde saat ayar satırındaki ayarlarla yeniden başlar. DS1302'yi her seferinde yeniden set etmiş olursunuz.



saatin 00:00 şeklinde görünmesini isterseniz  (03:45 gibi):

bool leadingZeros = false;   satırını    ( 3:45)
bool leadingZeros = true;   şeklinde değiştirin.    (03:45)

Display'in parlaklığını değiştirmek isterseniz:

sevseg.setBrightness(90); komutundaki  değeri 0-100 arasında değiştirmelisiniz. 
Fakat yaptığım denemelerde parlaklığın azalmadığını gözledim. 
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);  
satırı içindeki  resistorsOnSegments  ifadesini silince
sevseg.setBrightness(90); komutuna girdiğim değere göre parlaklığın değiştiğini gözledim.


ARDUINO IDE KODLARI:

#include <DS1302.h>
#include "SevSeg.h"
Time t;
DS1302 rtc(A2, A1, A0);   //rst,dat,clk
SevSeg sevseg;
void setup()
{
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setDOW(MONDAY); 
 // ilk yüklemede alttaki ayar satırlarını aktive edin. Sistem doğru çalışıyorsa alttaki satırları kapatıp kodu tekrar yükleyin.
 // yoksa her enerji verdiğinizde aşağıdaki ayarları yükleyecektir:
 // rtc.setTime(16, 25, 30);   //Saati ayarlıyoruz.  saat,dakika,saniye
 // rtc.setDate(13,04, 2020);  //Tarihi ayarlıyoruz.  gün,ay, yıl
  byte numDigits = 4;
  byte digitPins[] = {9, 10, 11, 12};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 13};
  bool resistorsOnSegments = false;
  byte hardwareConfig = COMMON_ANODE;
  bool updateWithDelays = false;
  bool leadingZeros = false; // başta sıfır göster >>  true, gösterme >> false
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
   sevseg.setBrightness(90);  // ekran parlaklık ayarı
  Serial.begin(9600);
}
void loop()
{
 t = rtc.getTime();
 int saat = t.hour*100; //4 haneli olması için saati 100 le çarpıyoruz
 int dakika = t.min; //dakikayı direk alıyoruz.
 int yazdir = saat+dakika; //direk toplayarak saat ifadesini alıyoruz.
 sevseg.setNumber(yazdir,2); //,2 nin anlamı . ifadesini nereye konulacağını belirtmek

 sevseg.refreshDisplay(); //displayi yeniliyoruz..

 // seriport ekranından doğruluğunu izlemek isterseniz aşağıdakisatırları aktive edin:
 // Serial.print(t.hour);Serial.print(":");Serial.print(t.min);Serial.print("   ");
 // Serial.print(t.date);Serial.print("/");Serial.print(t.mon);Serial.print("/");Serial.print(t.year);Serial.println();
}


Devreyi biraz daha kurcalamak istedim. Display parlaklığını potansiyometre ile değiştirmek istedim. Devreye yalnızca bir tane potansiyometre ekleyerek aşağıdaki program kodlarını oluşturdum. Yukarıda verdiğim kodlardan 5 satır fazla. sevseg.setBrightness(90); komutunu artık potansiyometre ile kontrol ediyoruz.



POT İLE PARLAKLIK KONTROLLÜ ARDUINO IDE KODLARI:

#include <DS1302.h>
#include "SevSeg.h"
Time t;
DS1302 rtc(A2, A1, A0);   //rst,dat,clk
SevSeg sevseg;
#define potPin A5 //  5k potansiyometre   5v  A5 GND şeklinde devreye eklenecek,orta bacağı A5'e
int potdeger=0;   

void setup()
{
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setDOW(MONDAY);    //haftanın günü(ingilizce girmelisiniz)
 // ilk yüklemede alttaki ayar satırlarını aktive edin. Sistem doğru çalışıyorsa alttaki satırları kapatıp kodu tekrar yükleyin.
 // yoksa her enerji verdiğinizde aşağıdaki ayarları yükleyecektir:  
 // rtc.setTime(11, 58, 00);   //Saati ayarlıyoruz.
 // rtc.setDate(13,04, 2020);  //Tarihi ayarlıyoruz.
  byte numDigits = 4;
  byte digitPins[] = {9, 10, 11, 12};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 13};
  bool resistorsOnSegments = false; 
  byte hardwareConfig = COMMON_ANODE; 
  bool updateWithDelays = false;
  bool leadingZeros = true; 
  //sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  //üst satırdaki  resistorsOnSegments komutu silindi aşağıdaki gibi oldu
  //silmemizdeki amaç alttaki  sevseg.setBrightness(0);  komutundaki değeri değiştirerek
  // displayin parlaklığını ayarlamak için. Alacağı değerler 0-100 arası
   sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, updateWithDelays, leadingZeros);
   sevseg.setBrightness(0);
  Serial.begin(9600);
}
void loop()
{  
 potdeger=analogRead(potPin);
 Serial.println(potdeger/10);
 sevseg.setBrightness(potdeger/10);   //potdeğerini parlaklığa aktarıyoruz.

 t = rtc.getTime();
 int saat = t.hour*100; //4 haneli olması için saati 100 le çarpıyoruz
 int dakika = t.min; //dakikayı direk alıyoruz.
 int yazdir = saat+dakika; //direk toplayarak saat ifadesini alıyoruz.
 sevseg.setNumber(yazdir,2); //,2 nin anlamı . ifadesini nereye konulacağını belirtmek

 sevseg.refreshDisplay(); //displayi yeniliyoruz..


 // seriport ekranından doğruluğunu izlemek isterseniz aşağıdaki satırları aktive edin:
 // Serial.print(t.hour);Serial.print(":");Serial.print(t.min);Serial.print("   ");
 // Serial.print(t.date);Serial.print("/");Serial.print(t.mon);Serial.print("/");Serial.print(t.year);Serial.println();
}

Kaynak: ornekyazilim.com sitesine teşekkürler.


KULLANILAN PROGRAMLAYICI: Arduino 1.8.10  




Yorumlar