#include <SevSeg.h>
#include "Button.h"
#include "AlarmTone.h"
#include "Clock.h"
#include "config.h"
#include <LiquidCrystal_I2C.h>
const int COLON_PIN = 13; // Nokta için pin
const int SPEAKER_PIN = A3; // Hoparlör için pin
Button hourButton(A0); // Saat ayarlama butonu
Button minuteButton(A1); // Dakika ayarlama butonu
Button alarmButton(A2); // Alarm açma/kapama butonu
AlarmTone alarmTone; // Alarm sesi nesnesi
Clock clock; // Saat nesnesi
SevSeg sevseg; // 7 segment gösterge nesnesi
// Ekran durumlarını tanımlayan enum
enum DisplayState {
DisplayClock, // Saat gösterimi
DisplayAlarmStatus, // Alarm durumu gösterimi
DisplayAlarmTime, // Alarm zamanı gösterimi
DisplayAlarmActive, // Alarm aktif durumu
DisplaySnooze, // Sakinleşme durumu
};
DisplayState displayState = DisplayClock; // Başlangıç durumu
long lastStateChange = 0; // Son durum değişikliği zamanı
// Ekran durumunu değiştir ve zamanlayıcıyı sıfırla
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastStateChange = millis(); // Şu anki milisaniye değerini al
}
// Son durum değişikliği üzerinden geçen süreyi al
long millisSinceStateChange() {
return millis() - lastStateChange;
}
// Gösterge üzerindeki noktanın yanıp sönme durumunu ayarla
void setColon(bool value) {
digitalWrite(COLON_PIN, value ? LOW : HIGH);
}
// Mevcut zamanı göster
void displayTime() {
DateTime now = clock.now(); // Şu anki zamanı al
bool blinkState = now.second() % 2 == 0; // Her 2 saniyede bir yanıp sönme
sevseg.setNumber(now.hour() * 100 + now.minute()); // Saat ve dakikayı göster
setColon(blinkState); // Noktanın durumunu ayarla
}
// Saat durumu ve buton etkileşimlerini yönet
void clockState() {
displayTime();
if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) {
alarmButton.has_changed(); // Buton durumunu temizle
changeDisplayState(DisplayAlarmActive);
return;
}
if (hourButton.pressed()) {
clock.incrementHour(); // Saati arttır
}
if (minuteButton.pressed()) {
clock.incrementMinute(); // Dakikayı arttır
}
if (alarmButton.pressed()) {
clock.toggleAlarm(); // Alarmı aç/kapat
changeDisplayState(DisplayAlarmStatus);
}
}
// Mevcut alarm durumunu göster
void alarmStatusState() {
setColon(false); // Noktayı kapat
sevseg.setChars(clock.alarmEnabled() ? " on" : " off"); // Alarm durumu göster
if (millisSinceStateChange() > ALARM_STATUS_DISPLAY_TIME) {
changeDisplayState(clock.alarmEnabled() ? DisplayAlarmTime : DisplayClock);
}
}
// Ayarlanan alarm zamanını göster
void alarmTimeState() {
DateTime alarm = clock.alarmTime(); // Alarm zamanını al
sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1); // Alarm zamanını göster
if (millisSinceStateChange() > ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) {
changeDisplayState(DisplayClock); // Saat durumuna dön
return;
}
if (hourButton.pressed()) {
clock.incrementAlarmHour(); // Alarm saatini arttır
lastStateChange = millis(); // Zamanı güncelle
}
if (minuteButton.pressed()) {
clock.incrementAlarmMinute(); // Alarm dakikasını arttır
lastStateChange = millis(); // Zamanı güncelle
}
if (alarmButton.pressed()) {
changeDisplayState(DisplayClock); // Saat durumuna dön
}
}
// Alarm aktif durumunu yönet
void alarmState() {
displayTime();
if (alarmButton.read() == Button::RELEASED) {
alarmTone.play(); // Alarm sesi çal
}
if (alarmButton.pressed()) {
alarmTone.stop(); // Alarm sesini durdur
}
if (alarmButton.released()) {
alarmTone.stop(); // Alarm sesini durdur
bool longPress = alarmButton.repeat_count() > 0; // Uzun basılı olup olmadığını kontrol et
if (longPress) {
clock.stopAlarm(); // Alarmı durdur
changeDisplayState(DisplayClock); // Saat durumuna dön
} else {
clock.snooze(); // Sakinleşme modu
changeDisplayState(DisplaySnooze); // Sakinleşme durumuna geç
}
}
}
// Sakinleşme durumunu göster
void snoozeState() {
sevseg.setChars("****"); // Ekranda dört yıldız göster
if (millisSinceStateChange() > SNOOZE_DISPLAY_TIME) {
changeDisplayState(DisplayClock); // Saat durumuna dön
}
}
void setup() {
Serial.begin(115200); // Seri haberleşmeyi başlat
clock.begin(); // Saat nesnesini başlat
// Butonları başlat
hourButton.begin();
hourButton.set_repeat(500, 200); // Tekrar süresi
minuteButton.begin();
minuteButton.set_repeat(500, 200); // Tekrar süresi
alarmButton.begin();
alarmButton.set_repeat(1000, -1); // Tekrar süresi
alarmTone.begin(SPEAKER_PIN); // Alarm tonunu başlat
pinMode(COLON_PIN, OUTPUT); // Nokta pinini çıkış olarak ayarla
// Göstergeyi ayarla
byte digits = 4; // Gösterge sayısı
byte digitPins[] = {2, 3, 4, 5}; // Rakam pinleri
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; // Segment pinleri
bool resistorsOnSegments = false; // Segmentlerde direnç var mı?
bool updateWithDelays = false; // Güncellemeleri gecikmeli yap
bool leadingZeros = true; // Başta sıfır göster
bool disableDecPoint = true; // Ondalık noktayı kapat
sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90); // Parlaklığı ayarla
}
void loop() {
sevseg.refreshDisplay(); // Göstergeyi güncelle
switch (displayState) {
case DisplayClock:
clockState(); // Saat durumunu yönet
break;
case DisplayAlarmStatus:
alarmStatusState(); // Alarm durumunu yönet
break;
case DisplayAlarmTime:
alarmTimeState(); // Alarm zamanını yönet
break;
case DisplayAlarmActive:
alarmState(); // Alarm aktif durumunu yönet
break;
case DisplaySnooze:
snoozeState(); // Sakinleşme durumunu yönet
break;
}
}