DS1307 ile saat yapımı

athenas0arrows

Aktif Üye
Katılım
25 Kasım 2020
Mesajlar
330
Hurda malzemelerden elime geçen 7 segment 4 digit display ve kutusunu saate çevirdim saat ilk ayarlandığında gayet güzel zaman tutuyor ama güç kesintisi olduğunda RTC de pil takılı olmasına rağmen saat ilk ayar yaptığım yerde kalıyor RTC saati kendi içerisinde saymıyor bu sorunu nasıl çözebilirim
RTC kodu:
#include "SevSeg.h"

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

SevSeg Display;

unsigned int number;

unsigned long currentMillis;

unsigned int Hour;

unsigned long previousMillis = 0;

const long interval = 500;

void setup()

{

  pinMode(8, INPUT_PULLUP);  // button1 is connected to pin 8

  pinMode(9, INPUT_PULLUP); // button2 is connected to pin 9

  byte numDigits = 4;

  byte digitPins[] = {10, 11, 12, 13};

  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};

  bool resistorsOnSegments = true;

  bool updateWithDelaysIn = true;

  byte hardwareConfig = COMMON_ANODE;

  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

  Display.setBrightness(100);

  bool parse=false;

  bool config=false;



 if (getDate(__DATE__) && getTime(__TIME__))

 

  {

    parse = true;

    // and configure the RTC with this info

    if (RTC.write(tm))

    {

      config = true;

    }

  }

}

void loop()

{

  tmElements_t tm;

 

if (RTC.read(tm))

  {

    Hour = tm.Hour;

    if (tm.Hour > 23) Hour = 0;

  

  }

  number = Hour * 100 + tm.Minute;

  Display.setNumber(number,2);

  Display.refreshDisplay();

}

bool getTime(const char *str)

{

  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}

bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++)

  {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}
 
Hurda malzemelerden elime geçen 7 segment 4 digit display ve kutusunu saate çevirdim saat ilk ayarlandığında gayet güzel zaman tutuyor ama güç kesintisi olduğunda RTC de pil takılı olmasına rağmen saat ilk ayar yaptığım yerde kalıyor RTC saati kendi içerisinde saymıyor bu sorunu nasıl çözebilirim
RTC kodu:
#include "SevSeg.h"

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

SevSeg Display;

unsigned int number;

unsigned long currentMillis;

unsigned int Hour;

unsigned long previousMillis = 0;

const long interval = 500;

void setup()

{

  pinMode(8, INPUT_PULLUP);  // button1 is connected to pin 8

  pinMode(9, INPUT_PULLUP); // button2 is connected to pin 9

  byte numDigits = 4;

  byte digitPins[] = {10, 11, 12, 13};

  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};

  bool resistorsOnSegments = true;

  bool updateWithDelaysIn = true;

  byte hardwareConfig = COMMON_ANODE;

  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

  Display.setBrightness(100);

  bool parse=false;

  bool config=false;



 if (getDate(__DATE__) && getTime(__TIME__))

 

  {

    parse = true;

    // and configure the RTC with this info

    if (RTC.write(tm))

    {

      config = true;

    }

  }

}

void loop()

{

  tmElements_t tm;

 

if (RTC.read(tm))

  {

    Hour = tm.Hour;

    if (tm.Hour > 23) Hour = 0;

 

  }

  number = Hour * 100 + tm.Minute;

  Display.setNumber(number,2);

  Display.refreshDisplay();

}

bool getTime(const char *str)

{

  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}

bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++)

  {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}
satır 61 yüzünden öyle oluyor bir kez ayarladıktan sonra o satırı silmelidin
 
C:
#include "SevSeg.h"

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

SevSeg Display;

unsigned int number;

unsigned long currentMillis;

unsigned int Hour;

unsigned long previousMillis = 0;

const long interval = 500;

void setup()

{

  pinMode(8, INPUT_PULLUP);  // button1 is connected to pin 8

  pinMode(9, INPUT_PULLUP); // button2 is connected to pin 9

  byte numDigits = 4;

  byte digitPins[] = {10, 11, 12, 13};

  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};

  bool resistorsOnSegments = true;

  bool updateWithDelaysIn = true;

  byte hardwareConfig = COMMON_ANODE;

  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

  Display.setBrightness(100);

  //bool parse=false; REMOVED AHMET

  //bool config=false; REMOVED AHMET


/* REMOVED AHMET
 if (getDate(__DATE__) && getTime(__TIME__))
  {

    parse = true;

    if (RTC.write(tm))

    {

      config = true;

    }
    */

  }

//} REMOVED AHMET


void loop()

{

  tmElements_t tm;

 

if (RTC.read(tm))

  {

    Hour = tm.Hour;

    if (tm.Hour > 23) Hour = 0;

 

  }

  number = Hour * 100 + tm.Minute;

  Display.setNumber(number,2);

  Display.refreshDisplay();

}

bool getTime(const char *str)

{

  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}

bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++)

  {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}
 
Bu çok daha basit bir software ile yapılabilir kulağı biraz arkasından tutmuş yazan.
 
DS1307 modül mü kullandın? Kullandıysan hangi modül? Yoksa devreyi kendin mi yaptın? Öyle ise devre şemasını ekleyebilir misin?
 
DS1307 modül mü kullandın? Kullandıysan hangi modül? Yoksa devreyi kendin mi yaptın? Öyle ise devre şemasını ekleyebilir misin?
Kullandığım modül bu saatin geri kalanı için şemayı çizip ekliyorum
Ekran görüntüsü 2023-07-31 205429.png
 
WhatsApp Görsel 2023-07-30 saat 22.26.02.jpg


Displayler 1980 normande tv den elime geçti bende hiç bozmadım
WhatsApp Görsel 2023-07-31 saat 21.13.22.jpg


displayler common anode kullanılan mikrodenetleyici Arduino pro mini
WhatsApp Görsel 2023-07-31 saat 21.15.44.jpg


pro mininin 9 nolu pini DP segmenti için ayrılmış saat ve dakika arasına üst üste gelecek şekilde 2 adet 3mm kırmızı led yerleştireceğim bu hali ile saat dakika birbirine çok yakın duruyor bütün dağınıklığı display'İn durduğu kutu içerisine sokmayı düşünüyorum
 
RTC tarafı ile ilgili bir problem göremiyorum ben. LCD ile ilgili potansiyel sorunlar var yalnız. Kütüphaneye segmentlerde direnç var demişsin, ama segmentlerde direnç yok. BC547 ler ON olunca 5V un neredeyse tamamı, hiçbir akım sınırlama olmaksızın segment LED lerine gidiyor.

Bu tip problemleri araştırırken öncelikle problemi ortaya çıkaran en basit programı oluşturman lazım. LCD kütüphanesini ve kodlarını çıkar. Sadece RTC kodu kalsın. RTC'den okuma yapsın sadece. En son programladığın saat bilgisini okuyabiliyor musun bakalım.
 
Bir de transistör base lerine 100 Ohm direnç bağlamışsın. Bu çok düşük bir değer. Baz'lardan kısa süreliğine 50 mA akım geçiyor. Şu anda çalışıyor tabiki, ama bu şekilde limitleri üzerinde çalıştırmamak lazım. Bütün segmentlere şöyle 22 Ohm gibi direnç, transistör base'lerine de 1 kΩ gibi bir direnç koyarsan komponentler rahat çalışır.
 
RTC tarafı ile ilgili bir problem göremiyorum ben. LCD ile ilgili potansiyel sorunlar var yalnız. Kütüphaneye segmentlerde direnç var demişsin, ama segmentlerde direnç yok. BC547 ler ON olunca 5V un neredeyse tamamı, hiçbir akım sınırlama olmaksızın segment LED lerine gidiyor.

Bu tip problemleri araştırırken öncelikle problemi ortaya çıkaran en basit programı oluşturman lazım. LCD kütüphanesini ve kodlarını çıkar. Sadece RTC kodu kalsın. RTC'den okuma yapsın sadece. En son programladığın saat bilgisini okuyabiliyor musun bakalım.
@Ahmet 'in düzenlediği kod ile güncel saati alabiliyorum güç kesintisi olsa bile RTC pili ile zamanı unutmadan sayabiliyor koddaki pullup direnci olan kısmı kaldırdım

Güncel RTC kodu:
#include "SevSeg.h"

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

SevSeg Display;

unsigned int number;

unsigned long currentMillis;

unsigned int Hour;

unsigned long previousMillis = 0;

const long interval = 500;

void setup()

{

 
  byte numDigits = 4;

  byte digitPins[] = {10, 11, 12, 13};

  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};

  bool resistorsOnSegments = true;

  bool updateWithDelaysIn = true;

  byte hardwareConfig = COMMON_ANODE;

  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

  Display.setBrightness(100);

  //bool parse=false; REMOVED AHMET

  //bool config=false; REMOVED AHMET


/* REMOVED AHMET
 if (getDate(__DATE__) && getTime(__TIME__))
  {

    parse = true;

    if (RTC.write(tm))

    {

      config = true;

    }
    */

  }

//} REMOVED AHMET


void loop()

{

  tmElements_t tm;

 

if (RTC.read(tm))

  {

    Hour = tm.Hour;

    if (tm.Hour > 23) Hour = 0;

 

  }

  number = Hour * 100 + tm.Minute;

  Display.setNumber(number,2);

  Display.refreshDisplay();

}

bool getTime(const char *str)

{

  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}

bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++)

  {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}
 
Bir de transistör base lerine 100 Ohm direnç bağlamışsın. Bu çok düşük bir değer. Baz'lardan kısa süreliğine 50 mA akım geçiyor. Şu anda çalışıyor tabiki, ama bu şekilde limitleri üzerinde çalıştırmamak lazım. Bütün segmentlere şöyle 22 Ohm gibi direnç, transistör base'lerine de 1 kΩ gibi bir direnç koyarsan komponentler rahat çalışır.
Transistör base dirençleri 1Kohm ile değiştirdim segmentlere ise 22 ohm dirençleri ekledim
 
@Ahmet 'in düzenlediği kod ile güncel saati alabiliyorum güç kesintisi olsa bile RTC pili ile zamanı unutmadan sayabiliyor koddaki pullup direnci olan kısmı kaldırdım

Güncel RTC kodu:
#include "SevSeg.h"

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

tmElements_t tm;

SevSeg Display;

unsigned int number;

unsigned long currentMillis;

unsigned int Hour;

unsigned long previousMillis = 0;

const long interval = 500;

void setup()

{

 
  byte numDigits = 4;

  byte digitPins[] = {10, 11, 12, 13};

  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};

  bool resistorsOnSegments = true;

  bool updateWithDelaysIn = true;

  byte hardwareConfig = COMMON_ANODE;

  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

  Display.setBrightness(100);

  //bool parse=false; REMOVED AHMET

  //bool config=false; REMOVED AHMET


/* REMOVED AHMET
 if (getDate(__DATE__) && getTime(__TIME__))
  {

    parse = true;

    if (RTC.write(tm))

    {

      config = true;

    }
    */

  }

//} REMOVED AHMET


void loop()

{

  tmElements_t tm;

 

if (RTC.read(tm))

  {

    Hour = tm.Hour;

    if (tm.Hour > 23) Hour = 0;

 

  }

  number = Hour * 100 + tm.Minute;

  Display.setNumber(number,2);

  Display.refreshDisplay();

}

bool getTime(const char *str)

{

  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}

bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++)

  {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}
Neden yükleme tarihine dönüyordu?
__TIME___ VE __DATE___ komutları aslında biter değişken sen derleme yap butonuna bastığın anda bilgisayarın içindeki güncel tarih ve saat bilgisini bu değişkene yazıyor kütüphane.

O değişken içeriği hep aynı kaldığı ve her resetlenince orayı tekrar işlediği için oradan başlıyor.

Ben bununla günlerce uğraşmıştım ds1307 kütüphanesini kurcalayıp öğrendim böyle bişey olduğunu
 
Dün gece saat 00:00 olduğunda 1. digit kendisini komple kapattı diğer digitlerde doğru rakamlar vardı displayleri ve bağlantıyı test etmek için bir test kodu yazım her şey düzgün çalışıyor

common anode 7seg 4 digit display test code:
// COMMON ANODE 7 SEG 4 DİGİT DİSPLAY TEST CODE

int a = 2;     
int b = 3;     
int c = 4;   
int d = 5;   
int e = 6;     
int f = 7;   
int g = 8;

int digit_1 = 10;
int digit_2 = 11;
int digit_3 = 12;
int digit_4 = 13;


void setup() {               

pinMode(a, OUTPUT);     
pinMode(b, OUTPUT);   
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);     
pinMode(e, OUTPUT);     
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);

pinMode(digit_1 , OUTPUT);
pinMode(digit_2 , OUTPUT);
pinMode(digit_3 , OUTPUT);
pinMode(digit_4 , OUTPUT);

}


void loop() {

  digitalWrite(digit_1, HIGH);
  digitalWrite(digit_2, HIGH);
  digitalWrite(digit_3, HIGH);
  digitalWrite(digit_4, HIGH);


  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);       //Generating 0
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);

  delay(1000);
 
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);      //Generating 1
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);

  delay(1000);       
    
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);      //Generating 2
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);

  delay(1000);   
            
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);     //Generating 3
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);

  delay(1000);   

  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);     //Generating 4
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);   
          
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);    //Generating 5
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);         

  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);   //Generating 6
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);           

  digitalWrite(a, LOW );
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);     //Generating 7
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);

  delay(1000);           
 
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);    //Generating 8
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);             

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);    //Generating 9
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);
}
 

Ekler

  • Display test.mp4
    2.6 MB
Devredeki direnç değerleri ve genel olarak devrenin yapısı böyle statik olarak çalıştırmaya uygun değil. Taramalı olarak çalışmaya uygun. O yüzden bu şekilde test etme. Arduino çıkışları nasıl yanmadı ilginç. Acaba Arduino pinlerinde bir şekilde akım sınırlama özelliği mi var anlamadım.

Problem olduğunda ortak anot sinyallerine bakabilirsin, belki oradan bir ipucu elde edilebilir. Veya lojik analizör varsa tüm sinyallere aynı anda bakabilirsin. Ama böyle bir durumda ben olsam kütüphaneyi bırakır, tarama kodunu kendim yazar ve onu kullanırım. Bu kütüphaneler birçok senaryoyu kapsayacak şekilde genel yazılıyor. O yüzden de bir sürü bug olabiliyor.
 
Şimdi internette araştırınca çıkışlarda herhangi bir akım sınırlama olmadığı anlaşılıyor. Datasheet'te de bir akım sınırlamadan bahsedilmemiş, sadece limitler verilmiş. Uygun zamanda test edeceğim.
 
Şimdi internette araştırınca çıkışlarda herhangi bir akım sınırlama olmadığı anlaşılıyor. Datasheet'te de bir akım sınırlamadan bahsedilmemiş, sadece limitler verilmiş. Uygun zamanda test edeceğim.
Entegre paketi başına max 200ma pin başına max 40ma sürekli olarak 20ma verebilir yazılmış bazı kaynaklarda
 
devre kartı.jpg


PCB 'yi olabildiğince küçük tutmak istedim bütün her şey 7 SEG. display kutusuna sığdı (adaptör hariç) adaptör olarak eski telefon adaptörü kullandım 5V 450mA

arkadan görünüm.jpg

Arkada Kısıma şimdilik kapak yapmadım ama yapacağım



önden görünüm.jpg


Projeyi yapacaklar için ;
1. kod ile RTC'ye seri port ekranından saat bilgisinin girilmesi gerekiyor (yıl ay gün saat dakika saniye) olarak
RTC ayarlama kodu:
#include <Wire.h>
#include <DS1307RTC.h>

void setup() {
  Wire.begin(); // I2C iletişimini başlat

  Serial.begin(9600);
  while (!Serial) {
    ; // Seri portun hazır olmasını bekle
  }

  // PC'den saat bilgisini al
  int year, month, day, hour, minute, second;
  Serial.println("Saat bilgisini girin (yy mm dd hh mm ss):");
  while (!Serial.available()) {
    ; // Veri gelene kadar bekle
  }
  year = Serial.parseInt();
  month = Serial.parseInt();
  day = Serial.parseInt();
  hour = Serial.parseInt();
  minute = Serial.parseInt();
  second = Serial.parseInt();

  // RTC'yi ayarla
  tmElements_t tm;
  tm.Year = year - 1970;
  tm.Month = month;
  tm.Day = day;
  tm.Hour = hour;
  tm.Minute = minute;
  tm.Second = second;

  RTC.write(tm);
}

void loop() {
  // RTC'den zamanı al ve seri portta göster
  tmElements_t rtcTime;
  if (RTC.read(rtcTime)) {
    Serial.print("RTC Zamanı: ");
    Serial.print(rtcTime.Year + 1970);
    Serial.print("-");
    Serial.print(rtcTime.Month);
    Serial.print("-");
    Serial.print(rtcTime.Day);
    Serial.print(" ");
    Serial.print(rtcTime.Hour);
    Serial.print(":");
    Serial.print(rtcTime.Minute);
    Serial.print(":");
    Serial.println(rtcTime.Second);
  }

  delay(1000); // 1 saniye bekle
}

RTC ayarlandıktan sonra 2. kodu yüklüyoruz RTC den alınan bilgileri displayde göstermek için

Saat kodu son hali:
#include "SevSeg.h"
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
SevSeg Display;
unsigned int number;
unsigned int Hour;

unsigned long previousMillis = 0;
const long interval = 450; // Flip-flop aralığı (ms)
bool flipFlopState = false; // Flip-flop durumu

void setup() {
  pinMode(A0, OUTPUT);

  byte numDigits = 4;
  byte digitPins[] = {10, 11, 12, 13};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
  bool resistorsOnSegments = true;
  bool updateWithDelaysIn = true;
  byte hardwareConfig = COMMON_ANODE;
  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  Display.setBrightness(100);

  Serial.begin(9600); // Seri portu başlat
  while (!Serial) {
    ; // Seri portun hazır olmasını bekle
  }
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    flipFlopState = !flipFlopState;
    digitalWrite(A0, flipFlopState);
  }

  tmElements_t rtcTime;

  if (Serial.available() >= 8) { // PC'den saat bilgisi al
    int year = Serial.parseInt();
    int month = Serial.parseInt();
    int day = Serial.parseInt();
    int hour = Serial.parseInt();
    int minute = Serial.parseInt();
    int second = Serial.parseInt();
    rtcTime.Year = year - 1970;
    rtcTime.Month = month;
    rtcTime.Day = day;
    rtcTime.Hour = hour;
    rtcTime.Minute = minute;
    rtcTime.Second = second;

    RTC.write(rtcTime); // RTC'ye saat bilgisini yaz
  }

  if (RTC.read(rtcTime)) {
    Hour = rtcTime.Hour;
    if (rtcTime.Hour > 23) Hour = 0;

    number = Hour * 100 + rtcTime.Minute;
    Display.setNumber(number, 4); // 4 basamaklı saat ve dakika
    Display.refreshDisplay();
  }
}
 
Son düzenleme:

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top