#include <Wire.h>
#include <Servo.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
// user constants
const int ALARM_HOUR = 23;
const int ALARM_MINUTE = 44;
// pin constants
const int BTN_PIN = 6;
const int BUZZ_PIN = 5;
const int LED_PIN = 4;
const int SERVO_PIN = 3;
const int RS = 12, EN = 11, D4 = 10, D5 = 9, D6 = 8, D7 = 7;
// Servo
int angle = 0;
int angleIncrement = 22;
// Kontroll så den ikke trigges flere ganger
bool alarmTriggered = false;
Servo servo;
RTC_DS1307 rtc;
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
// 🔁 Servo roterer 22 grader
void moveServo() {
angle += angleIncrement;
if (angle > 176) angle = 0;
servo.write(angle);
}
// 🔔 Alarm (LED + buzzer til knapp trykkes)
void runAlarm() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TA MEDISIN!");
while (digitalRead(BTN_PIN) == HIGH) {
digitalWrite(LED_PIN, HIGH);
//digitalWrite(BUZZ_PIN, HIGH);
tone(BUZZ_PIN, 440, 300);
delay(300);
digitalWrite(LED_PIN, LOW);
//digitalWrite(BUZZ_PIN, LOW);
delay(300);
}
// Slå av
digitalWrite(LED_PIN, LOW);
//digitalWrite(BUZZ_PIN, LOW);
lcd.clear();
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
//lcd.backlight();
if (!rtc.begin()) {
Serial.begin(9600);
Serial.println("RTC feil");
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(2026, 3, 20, 12, 0, 0));
}
pinMode(BTN_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
//pinMode(BUZZ_PIN, OUTPUT);
servo.attach(SERVO_PIN);
servo.write(angle);
}
void loop() {
DateTime now = rtc.now();
// Vis tid
lcd.setCursor(0, 0);
lcd.print("Tid: ");
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
lcd.setCursor(0, 1);
lcd.print("Dato: ");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
// Sjekk alarm
if (now.hour() == ALARM_HOUR && now.minute() == ALARM_MINUTE && !alarmTriggered) {
alarmTriggered = true;
moveServo();
runAlarm();
}
// Reset alarm neste minutt
if (now.minute() != ALARM_MINUTE) {
alarmTriggered = false;
servo.write(0);
}
delay(500);
}