#include <DS1307RTC.h>
#include <LiquidCrystal_I2C.h> 

struct Alarm {
  uint8_t hour;
  uint8_t minute;
  void const (* const function)();
};

uint8_t const ledPin = 9;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS1307RTC rtc;


void alarm1() {
  Serial.println("Alarm 1");
}

void alarm2() {
  Serial.println("Alarm 2");
}

Alarm alarms[] = {{0, 0, alarm1}, {0, 0, alarm2}};


void setAlarm() {
  char line[10];
  Serial.readBytesUntil('\r', line, sizeof(line));

  char* ptr = line;
  size_t id = strtol(ptr, &ptr, 10);
  alarms[id].hour = strtol(ptr + 1, &ptr, 10);
  alarms[id].minute = strtol(ptr + 1, &ptr, 10);
}

void showTime(time_t const now) {
  char line[17];
  sprintf(line, "%02i:%02i:%02i        ", 
    hour(now), minute(now), second(now));
  lcd.setCursor(0, 0);
  lcd.print(line);

  sprintf(line, "%02i-%02i-%04i     %i",
     day(now), month(now), year(now), weekday(now));
  lcd.setCursor(0, 1);
  lcd.print(line);
}


void setup() {
  Serial.begin(9600);
  Serial.println("Please set the alarms.");

  pinMode(ledPin, OUTPUT);

  lcd.init();
  lcd.backlight();
}

void loop() {
  if (Serial.available()) {
    setAlarm();
  }

  time_t now = rtc.get();
  for (Alarm const& alarm: alarms) {
    if (alarm.hour == hour(now) and alarm.minute == minute(now)) {
      alarm.function();
    }
  }

  showTime(now);
}
GND5VSDASCLSQWRTCDS1307+