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

RTC_DS1307 rtc;

// Shift register pin tanımlamaları
const int dataPin = 7;   // DS
const int latchPin = 9;  // ST_CP
const int clockPin = 8;  // SH_CP

// CD74HC4067 pin tanımlamaları
const int S0 = 2;
const int S1 = 3;
const int S2 = 4;
const int S3 = 5;
const int Z = 6;         // CD74HC4067 ortak çıkış pini

// 7 segment display'ler için rakamları kodlayan dizi
const byte numToSegment[] = {
  B00111111, // 0
  B00000110, // 1
  B01011011, // 2
  B01001111, // 3
  B01100110, // 4
  B01101101, // 5
  B01111101, // 6
  B00000111, // 7
  B01111111, // 8
  B01101111  // 9
};

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();

  if (!rtc.isrunning()) {
    Serial.println("RTC pilini takın!");
  }

  // Shift register pinlerini çıkış olarak ayarlayın
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(Z, OUTPUT);

  // Seçim pinlerini çıkış olarak ayarlayın
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
}

void loop() {
  DateTime now = rtc.now();
  int minutes = now.minute();

  // 7 segment display'lere dakika bilgilerini yaz
  int tens = minutes / 10;
  int ones = minutes % 10;

  // Tens ve ones değerlerini shift register'a yaz
  shiftOutDisplay(ones, tens);
  
  // Saat LED'lerini güncelle
  updateHourLED(now.hour());

  delay(1000); // 1 saniye bekle
}

void shiftOutDisplay(int ones, int tens) {
  // Latch pinini LOW yaparak veri yazmaya başla
  digitalWrite(latchPin, LOW);

  // İlk 7 segment display (birler basamağı) için veri gönder
  shiftOut(dataPin, clockPin, MSBFIRST, numToSegment[ones]);

  // İkinci 7 segment display (ondalık basamağı) için veri gönder
  shiftOut(dataPin, clockPin, MSBFIRST, numToSegment[tens]);

  // Latch pinini HIGH yaparak veriyi sakla
  digitalWrite(latchPin, HIGH);
}

void shiftOut(int dataPin, int clockPin, int bitOrder, byte val) {
  // Veriyi bit bit gönder
  for (int i = 0; i < 8; i++) {
    if (bitOrder == MSBFIRST) {
      digitalWrite(dataPin, !!(val & (1 << (7 - i))));
    } else {
      digitalWrite(dataPin, !!(val & (1 << i)));
    }
    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);
  }
}

void updateHourLED(int hour) {
  // 12 saatlik formata çevirin (1-12 arasında)
  hour = hour % 12;
  if (hour == 0) {
    hour = 12; // Saat 12 için 12. kanala denk gelir
  }

  // CD74HC4067'yi doğru kanala yönlendir
  selectChannel(hour);
}

void selectChannel(int channel) {
  // Ortak çıkış pinini LOW yaparak LED'lerin kapalı olduğundan emin olun
  digitalWrite(Z, LOW);

  // CD74HC4067'nin seçim pinlerini ayarla
  digitalWrite(S0, channel & 0x01);
  digitalWrite(S1, (channel >> 1) & 0x01);
  digitalWrite(S2, (channel >> 2) & 0x01);
  digitalWrite(S3, (channel >> 3) & 0x01);

  // Seçilen kanalda LED'i yak
  digitalWrite(Z, HIGH);
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
mux1:I15
mux1:I14
mux1:I13
mux1:I12
mux1:I11
mux1:I10
mux1:I9
mux1:I8
mux1:I7
mux1:I6
mux1:I5
mux1:I4
mux1:I3
mux1:I2
mux1:I1
mux1:I0
mux1:COM
mux1:S3
mux1:S2
mux1:S1
mux1:S0
mux1:EN
mux1:VCC
mux1:GND
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg2:COM.1
sevseg2:COM.2
sevseg2:A
sevseg2:B
sevseg2:C
sevseg2:D
sevseg2:E
sevseg2:F
sevseg2:G
sevseg2:DP