#define BLYNK_TEMPLATE_ID "TMPL6JwgLDMI7"
#define BLYNK_TEMPLATE_NAME "Drug Reminder"
#define BLYNK_AUTH_TOKEN "pRYgAXPfIGj03OtY9VyibxafAgdVM9YX"

#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <TimeLib.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// การเชื่อมต่อ Wi-Fi
char ssid[] = "KOWIT";
char pass[] = "";

// การตั้งค่า pin
#define BUZZER_PIN 14
#define button 13

// ตัวแปรเวลาและสถานะการแจ้งเตือน
int alarmHour1 , alarmMinute1;
int alarmHour2 , alarmMinute2;
int alarmHour3 , alarmMinute3;
int alarmHour4 , alarmMinute4;
int alarmHour5 , alarmMinute5;
int alarmHour6 , alarmMinute6;
int alarmHour7 , alarmMinute7;
int alarmHour8 , alarmMinute8;

int led[8] = {23, 22, 21, 19, 5, 17, 4, 15};

bool alarmTriggered1 = false;
bool alarmTriggered2 = false;
bool alarmTriggered3 = false;
bool alarmTriggered4 = false;
bool alarmTriggered5 = false;
bool alarmTriggered6 = false;
bool alarmTriggered7 = false;
bool alarmTriggered8 = false;

bool isBuzzing = false; // ใช้เพื่อตรวจสอบสถานะของ Buzzer

bool buttonState = false;

// การตั้งค่า NTP
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 7 * 3600); // GMT+7

// ตัวจับเวลา
BlynkTimer timer;

// ฟังก์ชันสำหรับควบคุม Buzzer
void checkAlarm() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi disconnected. Reconnecting...");
    WiFi.begin(ssid, pass);
    return;
  }

  timeClient.update();
  int currentHour = timeClient.getHours();
  int currentMinute = timeClient.getMinutes();

  Serial.printf("Current Time: %02d:%02d\n", currentHour, currentMinute);

  // ตรวจสอบเวลาแจ้งเตือนที่ 1
  if (currentHour == alarmHour1 && currentMinute == alarmMinute1) {
    if (!alarmTriggered1) { // หากยังไม่แจ้งเตือน
      Serial.println("Alarm 1 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[0], HIGH);
      alarmTriggered1 = true; // ตั้งค่าว่าแจ้งเตือนไปแล้ว
    }
  } else {
    alarmTriggered1 = false; // รีเซ็ตสถานะหากเวลาเปลี่ยนไป
  }

  // ตรวจสอบเวลาแจ้งเตือนที่ 2
  if (currentHour == alarmHour2 && currentMinute == alarmMinute2) {
    if (!alarmTriggered2) {
      Serial.println("Alarm 2 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[1], HIGH);
      alarmTriggered2 = true;
    }
  } else {
    alarmTriggered2 = false;
  }

  // ตรวจสอบเวลาแจ้งเตือนที่ 3
  if (currentHour == alarmHour3 && currentMinute == alarmMinute3) {
    if (!alarmTriggered3) {
      Serial.println("Alarm 3 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[2], HIGH);
      alarmTriggered3 = true;
    }
  } else {
    alarmTriggered3 = false;
  }

    // ตรวจสอบเวลาแจ้งเตือนที่ 4
  if (currentHour == alarmHour4 && currentMinute == alarmMinute4) {
    if (!alarmTriggered4) {
      Serial.println("Alarm 4 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[3], HIGH);
      alarmTriggered4 = true;
    }
  } else {
    alarmTriggered4 = false;
  }

      // ตรวจสอบเวลาแจ้งเตือนที่ 5
  if (currentHour == alarmHour5 && currentMinute == alarmMinute5) {
    if (!alarmTriggered5) {
      Serial.println("Alarm 5 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[4], HIGH);
      alarmTriggered5 = true;
    }
  } else {
    alarmTriggered5 = false;
  }

      // ตรวจสอบเวลาแจ้งเตือนที่ 6
  if (currentHour == alarmHour6 && currentMinute == alarmMinute6) {
    if (!alarmTriggered6) {
      Serial.println("Alarm 6 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[5], HIGH);
      alarmTriggered6 = true;
    }
  } else {
    alarmTriggered6 = false;
  }

      // ตรวจสอบเวลาแจ้งเตือนที่ 7
  if (currentHour == alarmHour7 && currentMinute == alarmMinute7) {
    if (!alarmTriggered7) {
      Serial.println("Alarm 7 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[6], HIGH);
      alarmTriggered7 = true;
    }
  } else {
    alarmTriggered7 = false;
  }

      // ตรวจสอบเวลาแจ้งเตือนที่ 8
  if (currentHour == alarmHour8 && currentMinute == alarmMinute8) {
    if (!alarmTriggered8) {
      Serial.println("Alarm 8 Triggered!");
      isBuzzing = true;
      tone(BUZZER_PIN, 1000);
      digitalWrite(led[7], HIGH);
      alarmTriggered8 = true;
    }
  } else {
    alarmTriggered8 = false;
  }
}

// ฟังก์ชันหยุดเสียง Buzzer ผ่าน Blynk
BLYNK_WRITE(V0) {
  int stopAlarm = param.asInt();
  if (stopAlarm == 1) { // หากกดปุ่มใน Blynk
    isBuzzing = false; // ปิดสถานะส่งเสียง
    noTone(BUZZER_PIN); // หยุดเสียง Buzzer
    Serial.println("Alarm stopped by user!");
    Blynk.virtualWrite(V0, 0); // รีเซ็ตปุ่มในแอป Blynk
  }
}

//clear led
BLYNK_WRITE(V5) {
  int clearLED = param.asInt();
  if (clearLED == 1) { // หากกดปุ่มใน Blynk
    digitalWrite(led[0], LOW);
    digitalWrite(led[1], LOW);
    digitalWrite(led[2], LOW);
    digitalWrite(led[3], LOW);
    digitalWrite(led[4], LOW);
    digitalWrite(led[5], LOW);
    digitalWrite(led[6], LOW);
    digitalWrite(led[7], LOW);
    Serial.println("clear LED!");
    Blynk.virtualWrite(V5, 0); // รีเซ็ตปุ่มในแอป Blynk
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 1
BLYNK_WRITE(V1) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour1 = t.getStartHour();
    alarmMinute1 = t.getStartMinute();
    Serial.printf("Alarm 1 set to: %02d:%02d\n", alarmHour1, alarmMinute1);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 2
BLYNK_WRITE(V2) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour2 = t.getStartHour();
    alarmMinute2 = t.getStartMinute();
    Serial.printf("Alarm 2 set to: %02d:%02d\n", alarmHour2, alarmMinute2);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 3
BLYNK_WRITE(V3) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour3 = t.getStartHour();
    alarmMinute3 = t.getStartMinute();
    Serial.printf("Alarm 3 set to: %02d:%02d\n", alarmHour3, alarmMinute3);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 4
BLYNK_WRITE(V4) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour4 = t.getStartHour();
    alarmMinute4 = t.getStartMinute();
    Serial.printf("Alarm 4 set to: %02d:%02d\n", alarmHour4, alarmMinute4);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 5
BLYNK_WRITE(V6) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour5 = t.getStartHour();
    alarmMinute5 = t.getStartMinute();
    Serial.printf("Alarm 5 set to: %02d:%02d\n", alarmHour5, alarmMinute5);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 6
BLYNK_WRITE(V7) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour6 = t.getStartHour();
    alarmMinute6 = t.getStartMinute();
    Serial.printf("Alarm 6 set to: %02d:%02d\n", alarmHour6, alarmMinute6);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 7
BLYNK_WRITE(V8) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour7 = t.getStartHour();
    alarmMinute7 = t.getStartMinute();
    Serial.printf("Alarm 7 set to: %02d:%02d\n", alarmHour7, alarmMinute7);
  }
}

// ฟังก์ชันตั้งเวลาแจ้งเตือนที่ 8
BLYNK_WRITE(V9) {
  TimeInputParam t(param);
  if (t.hasStartTime()) {
    alarmHour8 = t.getStartHour();
    alarmMinute8 = t.getStartMinute();
    Serial.printf("Alarm 8 set to: %02d:%02d\n", alarmHour8, alarmMinute8);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);

  pinMode(led[0], OUTPUT);
  pinMode(led[1], OUTPUT);
  pinMode(led[2], OUTPUT);
  pinMode(led[3], OUTPUT);
  pinMode(led[4], OUTPUT);
  pinMode(led[5], OUTPUT);
  pinMode(led[6], OUTPUT);
  pinMode(led[7], OUTPUT);

  pinMode(button, INPUT_PULLUP);

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timeClient.begin();

  timer.setInterval(1000L, checkAlarm); // ตรวจสอบทุกวินาที
}

void loop() {

  buttonState = digitalRead(button);
  if (buttonState == 0) { // หากกดปุ่มใน Blynk
    isBuzzing = false; // ปิดสถานะส่งเสียง
    noTone(BUZZER_PIN); // หยุดเสียง Buzzer
    Serial.println("Alarm stopped by user!");
    Blynk.virtualWrite(V0, 0); // รีเซ็ตปุ่มในแอป Blynk
  }

  Blynk.run();
  timer.run();
}

$abcdeabcde151015202530fghijfghij