#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
// Buton pin tanımlamaları
const int hourButtonPin = 10; // Saat ayarlama butonu
const int minuteButtonPin = 11; // Dakika ayarlama butonu
// 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
};
int currentHour;
int currentMinute;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
if (!rtc.isrunning()) {
Serial.println("RTC pilini takın!");
// İlk ayar için saati manuel olarak ayarlayın
rtc.adjust(DateTime(2024, 10, 9, 12, 0, 0)); // Yıl, ay, gün, saat, dakika, saniye
}
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(Z, OUTPUT);
pinMode(hourButtonPin, INPUT_PULLUP);
pinMode(minuteButtonPin, INPUT_PULLUP);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
}
void loop() {
DateTime now = rtc.now();
currentHour = now.hour();
currentMinute = now.minute();
// Butonları kontrol et
if (digitalRead(hourButtonPin) == LOW) {
currentHour++;
if (currentHour > 12) {
currentHour = 1; // 12 saatlik format
}
rtc.adjust(DateTime(now.year(), now.month(), now.day(), currentHour, now.minute(), now.second())); // RTC'yi ayarla
delay(300); // Debounce için bekle
}
if (digitalRead(minuteButtonPin) == LOW) {
currentMinute++;
if (currentMinute > 59) {
currentMinute = 0; // 60 dakikadan sonra sıfırla
}
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), currentMinute, now.second())); // RTC'yi ayarla
delay(300); // Debounce için bekle
}
// 7 segment display'lere dakika bilgilerini yaz
int tens = currentMinute / 10;
int ones = currentMinute % 10;
// Tens ve ones değerlerini shift register'a yaz
shiftOutDisplay(ones, tens);
// Saat LED'lerini güncelle
updateHourLED(currentHour);
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);
}