#include <LiquidCrystal_I2C.h> //library untuk LCD --> SCL=D1; SDA=D2
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //20 blocks, 4 lines
const uint8_t ROWS = 4;
const uint8_t COLS = 3;

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

uint8_t rowPins[ROWS] = {32, 33, 25, 26}; //connect to the row pinouts of the keypad
uint8_t colPins[COLS] = {27, 14, 12}; //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //input parameter keypad

char customKey; //Variabel untuk menampung input keypad
int setting = 0; //Variabel angka setting
int realTime;//variable angka realtime sensor
int i = 0; //deteksi sequence keypad
int a = 0; //deteksi sequence operasi pertama
int b = 0; //deteksi sequence seleksi heater
int lastState = HIGH; // seting awal nilai pembaca waktu akhir timer
#define offTimer 15
#define heater1 4 //tanda operasi heater grup1
#define heater2 16 //tanda operasi heater grup2
#define heaterEnd 17 //lampu 3 dan bunyi alarm tanda heater selesai
#define onTimer 5 // perintah timer On (0v)/relay4 NO to terminal H3CR 6 com netral
                  // perintah timer reset/ relay4 NC to terminal H3CR 6 com netral
void setup(){
  pinMode(heater1, OUTPUT);
  pinMode(heater2, OUTPUT);
  pinMode(heaterEnd, OUTPUT);
  pinMode(onTimer, OUTPUT);
  pinMode(offTimer, INPUT_PULLUP);//dipencet = LOW, default = HIGH
  digitalWrite(heater1, HIGH);//heater grup1 kondisi awal off
  digitalWrite(heater2, HIGH);//heater grup2 kondisi awal off
  digitalWrite(heaterEnd, HIGH);//lampu dan alarm heater selesai kondisi off
  digitalWrite(onTimer, HIGH);//Timer default / instalasi reset
  lcd.init(); //memulai LCD 
  Serial.begin(9600);
  lcd.backlight();
    // Print a message to the LCD.
  lcd.setCursor(0, 0);   // set the cursor to column 0, line 0
  lcd.print("|====SMART OVEN====|"); //Display a intro message
  lcd.setCursor(0, 1);   
  lcd.print("|<< GKM EMS 2023 >>|"); 
  lcd.setCursor(0, 2);
  lcd.print("|        By:       |");
  lcd.setCursor(0, 3);
  lcd.print("|======SUHINAR=====|");
  delay(3000); //Wait for display to show info
  lcd.clear(); //Then clean it
  lcd.print("Setting T :_   C");
  lcd.setCursor(0,3);
  lcd.print("*Limit T Max = 399 C");
//program baca keypad dan input setting
//=======================================
while (i<4){
  customKey = customKeypad.getKey(); //Baca input keypad
  if (i<1){ //digit pertama dibatasi untuk mengendalikan angka max 3ratusan
  switch(customKey){ //Jika
    case '0' ... '3': //Nilai 0 - 3, maka
    lcd.setCursor(11,0);
      setting = setting * 10 + (customKey - '0');
      lcd.print(setting); //Tampilkan angka
      i++;
      break;}
    }
  else if (i>0 && i<3){
  switch(customKey){ //Jika
    case '0' ... '9': //Nilai 0 - 9, maka
    lcd.setCursor(11,0);
      setting = setting * 10 + (customKey - '0');
      lcd.print(setting); //Tampilkan angka
      i++;
      if(i == 3){
      lcd.setCursor(0,1);
      lcd.print("TEKAN TOMBOL [#]");
      break;}
       }
      }
  else if(i==3){
  switch(customKey){
    case '#':
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Setting T :    C");
     lcd.setCursor(11,0);
     lcd.print(setting);
    digitalWrite(onTimer, LOW);//Timer mulai menghitung
    digitalWrite(heater1, LOW);//nyalakan heater 1
    delay(1000);
    digitalWrite(heater2, LOW);//nyalakan heater 2
     i++;
     a=0;
     b=0;
    break;}
      }
    }
}//close setup

//===================PROGRAM RESETTING=============================
void deteksiResetting(){
customKey = customKeypad.getKey(); //Baca input keypad
if (customKey == '*'){
 int setting = 0; //Variabel angka setting
 int realTime;//variable angka realtime sensor
 int i = 0; //deteksi sequence keypad
 int a = 0; //deteksi sequence operasi pertama
 int b = 0; //deteksi sequence seleksi heater
 int lastState = HIGH; // seting awal nilai pembaca waktu akhir timer
 digitalWrite(heater1, HIGH);//heater grup1 kondisi awal off
 delay (2000);
 digitalWrite(heater2, HIGH);//heater grup2 kondisi awal off
 digitalWrite(heaterEnd, HIGH);//lampu dan alarm heater selesai kondisi off
 digitalWrite(onTimer, HIGH);//Timer default / instalasi reset
 lcd.setCursor(0,0);
 lcd.print("Setting T :_   C");
 lcd.setCursor(0,3);
 lcd.print("*Limit T Max = 399 C");
//program baca keypad dan input setting
//=======================================
while (i<4){
  customKey = customKeypad.getKey(); //Baca input keypad
  if (i<1){ //digit pertama dibatasi untuk mengendalikan angka max 3ratusan
  switch(customKey){ //Jika
    case '0' ... '3': //Nilai 0 - 3, maka
    lcd.setCursor(11,0);
      setting = setting * 10 + (customKey - '0');
      lcd.print(setting); //Tampilkan angka
      i++;
      break;}
    }
  else if (i>0 && i<3){
  switch(customKey){ //Jika
    case '0' ... '9': //Nilai 0 - 9, maka
    lcd.setCursor(11,0);
      setting = setting * 10 + (customKey - '0');
      lcd.print(setting); //Tampilkan angka
      i++;
      if(i == 3){
      lcd.setCursor(0,1);
      lcd.print("TEKAN TOMBOL [#]");
      break;}
       }
      }
  else if(i==3){
  switch(customKey){
    case '#':
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Setting T :    C");
     lcd.setCursor(11,0);
     lcd.print(setting);
    digitalWrite(onTimer, LOW);//Timer mulai menghitung
    digitalWrite(heater1, LOW);//nyalakan heater 1
    delay(1000);
    digitalWrite(heater2, LOW);//nyalakan heater 2
     i++;
     a=0;
     b=0;
    break;}
      }
    }
 }
}
//================================================================

void loop(){
//======baca sensor======
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(13);
int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("Tekan (*) for RESET");
deteksiResetting();
//=======MODE1=============
 while (a==0){
  //======baca sensor======
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(13);
int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("Tekan (*) for RESET");
deteksiResetting();
//=======================
  if (realTime >= (setting + 1)){
  a++;
  digitalWrite(heater1, HIGH);//matikan 2 heater
  delay (1000);
  digitalWrite(heater2, HIGH);}
//=====deteksi timer=======
int value = digitalRead((offTimer));
 if (lastState != value) {
    lastState = value;
    if (value == LOW) {
      while (value == LOW){
      digitalWrite(heaterEnd, LOW); //nyalakan alarm
      Serial.println("pressed");
      digitalWrite(heater1, HIGH);
      delay (1000);
      digitalWrite(heater2, HIGH);
      //lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("  WAKTU HABIS !!!!");
 //======baca sensor======
  const float BETA = 3950; // should match the Beta Coefficient of the thermistor
  int analogValue = analogRead(13);
  int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("MATIKAN CONTROL OVEN");}
  }
 }
}
//================================
  
//=======MODE2=============
 while (a>0){
//===seleksi heater1=======
 if (b==0){  
  //======baca sensor======
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(13);
int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  deteksiResetting();
  lcd.setCursor(0,3);
  lcd.print("Tekan (*) for RESET");
deteksiResetting();  
//=======================
  if (realTime >= (setting - 5) && realTime <= setting){
  digitalWrite(heater1, LOW);//heater1 nyala
  digitalWrite(heater2, HIGH);}
  if (realTime < (setting - 5)){
  digitalWrite(heater1, LOW);//2 heater nyala
  delay (1000);
  digitalWrite(heater2, LOW);}
  if (realTime >= (setting + 1)){
  b++;
  digitalWrite(heater1, HIGH);//2 heater mati
  delay (1000);
  digitalWrite(heater2, HIGH);}
//=====deteksi timer=======
int value = digitalRead(15);
  if (lastState != value) {
    lastState = value;
      if (value == LOW) {
      while (value == LOW){
      digitalWrite(heaterEnd, LOW); //nyalakan alarm
      Serial.println("pressed");
      digitalWrite(heater1, HIGH);
      delay (1000);
      digitalWrite(heater2, HIGH);
      //lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("  WAKTU HABIS !!!!");
 //======baca sensor======
  const float BETA = 3950; // should match the Beta Coefficient of the thermistor
  int analogValue = analogRead(13);
  int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("MATIKAN CONTROL OVEN");}
  } 
 }
}
//===seleksi heater2=======
  if (b>0){  
  //======baca sensor======
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(13);
int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("Tekan (*) for RESET");
  deteksiResetting();
//=======================
  if (realTime >= (setting - 5) && realTime <= setting){
  digitalWrite(heater1, HIGH);
  digitalWrite(heater2, LOW);} //heater2 nyala
  if (realTime < (setting - 5)){
  digitalWrite(heater1, LOW);//2 heater nyala
  delay (1000);
  digitalWrite(heater2, LOW);}
  if (realTime >= (setting + 1)){
  b=0;
  digitalWrite(heater1, HIGH);//2 heater mati
  delay (1000);
  digitalWrite(heater2, HIGH);}
//=====deteksi timer=======
int value = digitalRead(15);
  if (lastState != value) {
    lastState = value;
      if (value == LOW) {
      while (value == LOW){
      digitalWrite(heaterEnd, LOW); //nyalakan alarm
      Serial.println("pressed");
      digitalWrite(heater1, HIGH);
      delay (1000);
      digitalWrite(heater2, HIGH);
      //lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("  WAKTU HABIS !!!!");
      //======baca sensor======
  const float BETA = 3950; // should match the Beta Coefficient of the thermistor
  int analogValue = analogRead(13);
  int realTime = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  lcd.setCursor(0,1);
  lcd.print("T terukur :");
  lcd.print(realTime);
  lcd.setCursor(15,1);
  lcd.print("C");
  lcd.setCursor(0,3);
  lcd.print("MATIKAN CONTROL OVEN");}
  } 
 }
}
}
//===========================
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
ntc1:GND
ntc1:VCC
ntc1:OUT