#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
// לחצנים
#define BTN_SET 4
#define BTN_CONTROL 2
#define BTN_END 10
#define POT_PIN A1 // פוטנציומטר
// זמן נוכחי
int h = 0, m = 0, s = 0;
// זמן השכמה
int alarmH = 7, alarmM = 0;
int wakeBefore = 0;
int setState = 0;
// ניהול סאונדים
bool alarmTriggered = false;
bool song1Started = false;
bool song2Started = false;
bool song3Started = false;
bool song4Started = false;
bool song5Started = false;
int currentSong = 0;
unsigned long songStartTime = 0;
// ניהול לחיצה
bool buttonPressed = false;
// זוכר אם המשתמש בחר במסלול רגוע
bool calmMode = false;
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(BTN_SET, INPUT_PULLUP);
pinMode(BTN_CONTROL, INPUT_PULLUP);
pinMode(BTN_END, INPUT_PULLUP);
rtc.begin();
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
h = now.hour();
m = now.minute();
s = now.second();
int nowMin = h * 60 + m;
int alarmMin = alarmH * 60 + alarmM;
int startMin = alarmMin - wakeBefore;
// 1. זמן ההשכמה הגיע – התחל ספירה ל־10 שניות
if (!alarmTriggered && nowMin == alarmMin) {
alarmTriggered = true;
songStartTime = millis();
// אם נלחץ כפתור – זוכר את הבחירה למסלול רגוע
if (digitalRead(BTN_CONTROL) == LOW) {
calmMode = true;
}
}
// 2. לאחר 10 שניות – הפעל שיר 1
if (alarmTriggered && !song1Started && millis() - songStartTime >= 10000) {
song1Started = true;
playSong(1);
}
// 3. שיר 1 → שיר 2
if (currentSong == 1 && song1Started) {
if (digitalRead(BTN_CONTROL) == LOW && !buttonPressed) {
buttonPressed = true;
calmMode = true;
playSong(2);
} else if (millis() - songStartTime >= 10000) {
playSong(2);
}
}
// 4. שיר 2 → שיר 3 או 4
if (currentSong == 2 && song2Started) {
if (digitalRead(BTN_CONTROL) == LOW && !buttonPressed) {
buttonPressed = true;
playSong(3); // רגוע
} else if (millis() - songStartTime >= 10000) {
if (calmMode) {
playSong(3); // המשך רגוע
} else {
playSong(4); // אגרסיבי
}
}
}
// 5. שיר 3/4 → שיר 5 בלחיצת END
if ((currentSong == 3 || currentSong == 4) && (song3Started || song4Started)) {
if (digitalRead(BTN_END) == LOW) {
playSong(5);
}
}
// איפוס לחיצה
if (digitalRead(BTN_CONTROL) == HIGH) {
buttonPressed = false;
}
// מעבר בין מצבי הגדרה
if (digitalRead(BTN_SET) == LOW) {
delay(200);
setState++;
if (setState > 4) setState = 0;
}
// קריאה מהפוטנציומטר
int potValue = analogRead(POT_PIN);
if (setState == 1) {
alarmH = map(potValue, 0, 1023, 0, 23);
} else if (setState == 2) {
alarmM = map(potValue, 0, 1023, 0, 59);
} else if (setState == 3) {
wakeBefore = map(potValue, 0, 1023, 0, 59);
}
// LCD שורה 1
lcd.setCursor(0, 0);
if (setState == 0) {
lcd.print("Set alarm ");
} else if (setState == 1) {
lcd.print("Set hour: ");
printTwoDigits(alarmH); lcd.print(" ");
} else if (setState == 2) {
lcd.print("Set min: ");
printTwoDigits(alarmM); lcd.print(" ");
} else if (setState == 3) {
lcd.print("Set awake: ");
lcd.print(wakeBefore); lcd.print("m ");
} else if (setState == 4) {
lcd.print("Alarm ");
printTwoDigits(alarmH); lcd.print(":");
printTwoDigits(alarmM);
lcd.print(", ");
lcd.print(wakeBefore); lcd.print("m ");
}
// LCD שורה 2 – זמן נוכחי
lcd.setCursor(0, 1);
lcd.print("Time ");
printTwoDigits(h); lcd.print(":");
printTwoDigits(m); lcd.print(":");
printTwoDigits(s);
lcd.print(" ");
delay(100);
}
// הדפסת מספר עם אפס מוביל
void printTwoDigits(int number) {
if (number < 10) lcd.print("0");
lcd.print(number);
}
// ניגון שיר
void playSong(int songNum) {
currentSong = songNum;
songStartTime = millis();
switch (songNum) {
case 1:
song1Started = true;
Serial.println("🎵 Play rustling leaves sound");
break;
case 2:
song2Started = true;
Serial.println("🎵 Play bird chirping sound");
break;
case 3:
song3Started = true;
Serial.println("🎵 Play harp sound melody");
break;
case 4:
song4Started = true;
Serial.println("🎵 Play beeping truck reverse sound");
break;
case 5:
song5Started = true;
Serial.println("🎵 Playing 'Happy' – motion detected");
break;
}
}