// ----------- ใช้งาน จอ ILI9341  -----------
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "Humidity.h"
#include "Humidity1.h"
#include "Humidity2.h"

#define TFT_DC 4
#define TFT_CS 2
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// ----------- ใช้งาน DS1307   -----------
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
// ------- ประกาศตัวแปรแทนขา I/O --------
#define SW1 13
#define SW2 27
#define SW3 32
#define SW4 25
#define BUZ 12
#define Re 14
// -------- ประกาศใช้ตัสแปรตั้งเวลา NO  ----------
bool st_SetH = 0;
bool st_SetM = 0;
bool st_SetS = 0;
byte SetH;
byte SetM;
byte SetS;
// -------- ประกาศใช้ตัสแปรตั้งเวลา OFF  ----------
bool st_SetH1 = 0;
bool st_SetM1 = 0;
bool st_SetS1 = 0;
byte SetH1;
byte SetM1;
byte SetS1;
/* ******************************************************************** */
void setup() {
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SW3, INPUT_PULLUP);
  pinMode(SW4, INPUT_PULLUP);
  pinMode(BUZ, OUTPUT);
  pinMode(Re, OUTPUT);

  Serial.begin(115200);
  Serial.println("Hello, ESP32!");

  tft.begin();
  tft.setRotation(1);


  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  tft.drawRGBBitmap(0, 0, (uint16_t *)dragonBitmap, DRAGON_WIDTH, DRAGON_HEIGHT);
};
/* ******************************************************************** */
void loop() {
  DateTime now = rtc.now();
  tft.setCursor(100, 20);
  tft.setTextColor(ILI9341_WHITE, ILI9341_BLUE);
  tft.setTextSize(2);
  tft.println(String(now.day(), DEC));
  tft.setCursor(190, 20);
  tft.println(String(now.month(), DEC));
  tft.setCursor(260, 20);
  tft.println(String(now.year(), DEC));
  tft.setCursor(200, 220);
  tft.println(String(now.hour(), DEC) + ":" + String(now.minute(), DEC) + ":" + String(now.second(), DEC) + "   ");
  tft.setCursor(140, 100);
  tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println(String(SetH) + ":" + String(SetM) + ":" + String(SetS) + " ");
  tft.setCursor(140, 170);
  tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println(String(SetH1) + ":" + String(SetM1) + ":" + String(SetS1) + " ");

  Serial.print("Cerrent Time " + String(now.hour(), DEC) + ":" + String(now.minute(), DEC) + ":" + String(now.second(), DEC) + "   ");
  Serial.print("Timer ON " + String(SetH) + ":" + String(SetM) + ":" + String(SetS) + "   ");
  Serial.println("Timer OFF " + String(SetH1) + ":" + String(SetM1) + ":" + String(SetS1) + "   ");

  // -----------   Set timer on  ---------
  if (digitalRead(SW3) == 0) {  // กด SW3 ตั้งเวลา
    delay(2000);
    if (digitalRead(SW3) == 0) {  // กด SW3 ค้างไว้ 2 วิ
      tft.drawRGBBitmap(0, 0, (uint16_t *)dragonBitmap1, DRAGON_WIDTH1, DRAGON_HEIGHT1);
      st_SetH = 1;
      tone(BUZ, 400, 100);
      Serial.println("-----------------------------");
      Serial.println("-       SET TIMER ON      -");
      Serial.println("-----------------------------");
      Serial.println("->SET HOURS");
      // ------- ตั้งเวลา Hours (ชม.) --------
      while (st_SetH == 1) {
        tft.setCursor(220, 80);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetH);
        tft.setCursor(220, 140);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetM);
        tft.setCursor(220, 200);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetS);
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetH = SetH + 1;
          if (SetH >= 24) SetH = 24;
          Serial.println("HOURS: " + String(SetH));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {  // ลดค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW2) == 0) delay(10);
          SetH = SetH - 1;
          if (SetH == 255) SetH = 0;
          Serial.println("HOURS: " + String(SetH));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW3) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW3) == 0) {
            tone(BUZ, 400, 100);
            st_SetH = 0;  // ออกจาก while ชม.
            st_SetM = 1;  // เข้า while นาที
            Serial.println("[SET HOURS IS OK]");
          }
        }
      }
      // -----------   Set Minute (นาที)  ---------
      Serial.println("->SET  MINUTE");
      while (st_SetM == 1) {
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetM = SetM + 1;
          if (SetM >= 60) SetM = 60;
          Serial.println("MINUTE: " + String(SetM));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {  // ลดค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW2) == 0) delay(10);
          SetM = SetM - 1;
          if (SetM == 255) SetM = 0;
          Serial.println("MINUTE: " + String(SetM));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW3) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW3) == 0) {
            tone(BUZ, 400, 100);
            st_SetM = 0;
            st_SetS = 1;  // ออกจาก while นาที.
                          // st_SetM = 1;  // เข้า while นาที
            Serial.println("SET  MINUTE IS OK");
          }
        }
      }
      // --------------------------------------
      // -----------   Set Second(วินาที)  ---------
      Serial.println("-> SET SECOUND");
      while (st_SetS == 1) {
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetS = SetS + 1;
          if (SetS >= 60) SetS = 60;
          Serial.println("SECOUND: " + String(SetS));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {  // ลดค่า ชม. ครั้งละ 1
          tone(BUZ, 400, 50);
          while (digitalRead(SW2) == 0) delay(10);
          SetS = SetS - 1;
          if (SetS == 255) SetS = 0;
          Serial.println("SECOUND: " + String(SetS));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS);
          delay(50);
        }
        if (digitalRead(SW3) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW3) == 0) {
            tone(BUZ, 400, 100);
            tft.drawRGBBitmap(0, 0, (uint16_t *)dragonBitmap, DRAGON_WIDTH, DRAGON_HEIGHT);
            st_SetS = 0;  // ออกจาก while นาที.
                          // st_SetS = 1;  // เข้า while นาที
            Serial.println("SET SECOUND IS OK");
          }
        }
      }
    }          // if เช็คการกด SW3 ค้าง
  }            // if กด SW3 2 วิ
  delay(100);  // this speeds up the simulation
  if (now.hour() == SetH && now.minute() == SetM && now.second() == SetS) {
    digitalWrite(Re, HIGH);
    delay(100);
  }

  // -----------   Set timer off  ---------

  if (digitalRead(SW4) == 0) {  // กด SW3 ตั้งเวลา
    delay(2000);
    if (digitalRead(SW4) == 0) {  // กด SW3 ค้างไว้ 2 วิ
      tft.drawRGBBitmap(0, 0, (uint16_t *)dragonBitmap2, DRAGON_WIDTH2, DRAGON_HEIGHT2);
      st_SetH1 = 1;
      tone(BUZ, 500, 100);
      Serial.println("-----------------------------");
      Serial.println("-       SET TIMER OFF      -");
      Serial.println("-----------------------------");
      Serial.println("->SET HOURS");
      // ------- ตั้งเวลา Hours (ชม.) --------
      while (st_SetH1 == 1) {
        tft.setCursor(220, 80);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetH1);
        tft.setCursor(220, 140);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetM1);
        tft.setCursor(220, 200);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(3);
        tft.println(SetS1);
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 500, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetH1 = SetH1 + 1;
          if (SetH1 >= 24) SetH1 = 24;
          Serial.println("HOURS: " + String(SetH1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {  // ลดค่า ชม. ครั้งละ 1
          tone(BUZ, 500, 50);
          while (digitalRead(SW2) == 0) delay(10);
          SetH1 = SetH1 - 1;
          if (SetH1 == 255) SetH1 = 0;
          Serial.println("HOURS: " + String(SetH1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW4) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW4) == 0) {
            tone(BUZ, 500, 100);
            st_SetH1 = 0;  // ออกจาก while ชม.
            st_SetM1 = 1;  // เข้า while นาที
            Serial.println("[SET HOURS IS OK]");
          }
        }
      }
      // -----------   Set Minute (นาที)  ---------
      Serial.println("->SET  MINUTE");
      while (st_SetM1 == 1) {
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 500, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetM1 = SetM1 + 1;
          if (SetM1 >= 60) SetM1 = 60;
          Serial.println("MINUTE: " + String(SetM1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {
          tone(BUZ, 500, 50);  // ลดค่า ชม. ครั้งละ 1
          while (digitalRead(SW2) == 0) delay(10);
          SetM1 = SetM1 - 1;
          if (SetM1 == 255) SetM1 = 0;
          Serial.println("MINUTE: " + String(SetM1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW4) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW4) == 0) {
            tone(BUZ, 500, 100);
            st_SetM1 = 0;
            st_SetS1 = 1;  // ออกจาก while นาที.
                           // st_SetM = 1;  // เข้า while นาที
            Serial.println("SET  MINUTE IS OK");
          }
        }
      }
      // --------------------------------------
      // -----------   Set Second(วินาที)  ---------
      Serial.println("-> SET SECOUND");
      while (st_SetS1 == 1) {
        if (digitalRead(SW1) == 0) {  // เพิ่มค่า ชม. ครั้งละ 1
          tone(BUZ, 500, 50);
          while (digitalRead(SW1) == 0) delay(10);
          SetS1 = SetS1 + 1;
          if (SetS1 >= 60) SetS1 = 60;
          Serial.println("SECOUND: " + String(SetS1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW2) == 0) {  // ลดค่า ชม. ครั้งละ 1
          tone(BUZ, 500, 50);
          while (digitalRead(SW2) == 0) delay(10);
          SetS1 = SetS1 - 1;
          if (SetS1 == 255) SetS1 = 0;
          Serial.println("SECOUND: " + String(SetS1));
          tft.setCursor(220, 80);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetH1);
          tft.setCursor(220, 140);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetM1);
          tft.setCursor(220, 200);
          tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
          tft.setTextSize(3);
          tft.println(SetS1);
          delay(50);
        }
        if (digitalRead(SW4) == 0) {  // ยืนยันตั้งค่า ชม.
          delay(1000);
          if (digitalRead(SW4) == 0) {
            tone(BUZ, 500, 100);
            tft.drawRGBBitmap(0, 0, (uint16_t *)dragonBitmap, DRAGON_WIDTH, DRAGON_HEIGHT);
            st_SetS1 = 0;  // ออกจาก while นาที.
                           // st_SetS = 1;  // เข้า while นาที
            Serial.println("SET SECOUND IS OK");
          }
        }
      }
    }          // if เช็คการกด SW3 ค้าง
  }            // if กด SW3 2 วิ
  delay(100);  // this speeds up the simulation
  if (now.hour() == SetH1 && now.minute() == SetM1 && now.second() == SetS1) {
    digitalWrite(Re, LOW);
    delay(100);
  }
};
NOCOMNCVCCGNDINLED1PWRRelay Module
GND5VSDASCLSQWRTCDS1307+