#include <Wire.h>
#include <Servo.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// user constants
const int ALARM_HOUR = 16;
const int ALARM_MINUTE = 56;
// pin constants
const int BTN_PIN = 12;
const int BUZZ_PIN = 11;
const int LED_PIN = 10;
const int SERVO_PIN = 9;
// Servo
int angle = 0;
int angleIncrement = 22;
// Kontroll så den ikke trigges flere ganger
bool alarmTriggered = false;
Servo servo;
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 🔁 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.init();
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);
}