#include <LiquidCrystal.h>
#include <Keypad.h>
#include <EEPROM.h>

#define FAN 13
#define ISITICI 6
#define SENSOR A5


LiquidCrystal lcd(12, 11, 10, 9, 8, 7);


static bool secim_modu = false;
char girilen_deger;
uint32_t sicaklik_verisi;
uint32_t sicaklik_verisi_guncelleme;
bool lcd_temizleme;
bool basamak_secim_modu = false;
String girilen_tuslar = "";
int girilen_tus_typecast;
static bool girilen_sayi_kaydedici_durumu;
bool lcd_guncelleme;
bool lcd_mod_clear;
bool lcd_fan_set_temizleme;
uint8_t EEPROM_adres = 0;
uint8_t EEPROM_adres_isitici = 30;
int EEPROM_okunan;
static String girilen_tuslar_global;
bool EEPROM_fandeger_kontrol = false;
uint8_t Hysteresis_bandi = 10;
bool fan_set;
bool EEPROM_deger_kontrol_isitici;
uint8_t EEPROM_okunan_isi;
bool isitici_set_ekran;
bool isitici_set_text = false;
char kontrol_key;
bool key_flag;
//uint32_t girilen_deger;

const byte keypad_satir_sayisi = 4;
const byte keypad_sutun_sayisi = 4;
byte satir_pinleri[keypad_satir_sayisi] = {5, 4, 3, 2};
byte sutun_pinleri[keypad_sutun_sayisi] = {A3, A2, A1, A0};
char keys[keypad_satir_sayisi][keypad_sutun_sayisi] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

Keypad keypad = Keypad(makeKeymap(keys), satir_pinleri, sutun_pinleri, keypad_satir_sayisi, keypad_sutun_sayisi);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(ISITICI, OUTPUT);
  pinMode(FAN, OUTPUT);
  sicaklik_verisi_guncelleme = sicaklik_verisi;

  lcd.setCursor(0, 0);
  lcd.print("SICAKLIK KONTROL");
  lcd.setCursor(4, 1);
  lcd.print("PROJESI");
  delay(100);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("MOD SECIM #");
  lcd.setCursor(0, 1);
  lcd.print("EEPROM KAYIT *");
  delay(100);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("* Basilmadan Mod");
  lcd.setCursor(4, 1);
  lcd.print("Degismez");
  delay(100);
  lcd.clear();




}

void loop() {


  char key = keypad.getKey();
  sicaklik_verisi = map(analogRead(SENSOR), 0, 1023, 0, 50);
  if (key) {
    Serial.println(key);
  }


  if (key == '#' /*&& girilen_sayi_kaydedici_durumu == false*/) {
    secim_modu = !secim_modu;
    lcd_mod_clear = true;
    //girilen_sayi_kaydedici_durumu = true;

  }
  if (sicaklik_verisi == !sicaklik_verisi_guncelleme) {
    lcd_guncelleme = true;
    sicaklik_verisi = sicaklik_verisi_guncelleme;
  }


  if (secim_modu == true) {
    if (lcd_mod_clear == true) {
      lcd.clear();
      lcd_mod_clear = false;
    }

    if (fan_set == false && isitici_set_ekran == false) {
      lcd.setCursor(5, 0);
      lcd.print("FAN SET");

    }


    if (key >= '0' && key <= '9' ) {

      girilen_tuslar = sayi_kaydir(girilen_tuslar, key);
      lcd.setCursor(7, 1);
      lcd.println(girilen_tuslar);
      if (girilen_tuslar) {
        girilen_tuslar_global = girilen_tuslar;
      }

      if ((girilen_tuslar.length() + 1) > 2) {
        girilen_tuslar = "";


      }

    }


    if (key == '*' && fan_set == false && isitici_set_ekran == false) { // SAYI SECIM EKRANI
      lcd_temizleme = true;
      lcd_fan_set_temizleme = true;
      
      girilen_tus_typecast = atoi(girilen_tuslar_global.c_str());
      EEPROM_fandeger_kontrol = true;

      EEPROM.put(EEPROM_adres, atoi(girilen_tuslar_global.c_str()));

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("DEGER KAYDEDILDI");
      delay(1000);
      
      fan_set = true;
      
      isitici_set_ekran = true;
      
    }
    if (isitici_set_ekran == true && fan_set == true &&  isitici_set_text == false) {
      lcd.clear();
      Serial.println("1 executed");
      lcd_fan_set_temizleme = false;
      Serial.println("2 executed");
      lcd.setCursor(3, 0);
      lcd.println("ISITICI SET");
      isitici_set_text = true;



    }
   if(isitici_set_text == true && key =='*' && key_flag == false){ //PARAZİT ÖNLEME
    key_flag = true;
    key = "";


   }


    if (key == '*' && fan_set == true && isitici_set_text == true) { // SAYI SECIM EKRANI
      //lcd_temizleme = true;
      //girilen_sayi_kaydedici_durumu = !girilen_sayi_kaydedici_durumu;
      girilen_tus_typecast = atoi(girilen_tuslar_global.c_str());
      EEPROM_deger_kontrol_isitici = true;

      EEPROM.put(EEPROM_adres_isitici, atoi(girilen_tuslar_global.c_str()));
      Serial.println("3 executed");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("DEGER KAYDEDILDI");
      delay(1000);


      isitici_set_ekran = false;
      isitici_set_text = false;
      fan_set = false;
      isitici_set_ekran = false;
      key_flag = false;
      EEPROM_deger_kontrol_isitici = true;

    secim_modu = false;
    }


  } else {  // ANA EKRAN
    lcd.setCursor(0, 0);
    lcd.print("SICAKLIK:");
    if (lcd_guncelleme = true) {
      lcd.setCursor(10, 0);
      lcd.print(sicaklik_verisi);
      lcd_guncelleme = false;
    }
    lcd.setCursor(0, 1);
    lcd.print("FAN:");
    lcd.setCursor(8, 1);
    lcd.print("ISI.:");


    if (EEPROM_deger_kontrol_isitici == false) {
      lcd.setCursor(14, 1);
      lcd.print("XX");

    }


    if (EEPROM_fandeger_kontrol == false) {
      lcd.setCursor(5, 1);
      lcd.print("XX");

    } else {
      lcd.setCursor(5, 1);
      EEPROM.get(EEPROM_adres, EEPROM_okunan);
      lcd.print(EEPROM_okunan);
      lcd.setCursor(14, 1);
      EEPROM.get(EEPROM_adres_isitici, EEPROM_okunan_isi);
      lcd.print(EEPROM_okunan_isi);
    }

if(EEPROM_okunan > EEPROM_okunan_isi){
  lcd.setCursor(0,0);
  lcd.println("HATALI SET");
  lcd.setCursor(0,0);
  lcd.println("SISTEM INAKTIF");
  digitalWrite(FAN,LOW);
  digitalWrite(ISITICI,LOW);

}


    // EEPROM.get(EEPROM_adres, EEPROM_okunan);
    //lcd.print(EEPROM_okunan);
    if (lcd_temizleme == true) {
      lcd.clear();
      lcd_temizleme = false;
    }


    //HYSTERESİS KONTROLÜ FAN
    float hysteresis_asil_deger = EEPROM_okunan * (Hysteresis_bandi / 100.0);
    if (EEPROM_fandeger_kontrol == true) {
      if (sicaklik_verisi > EEPROM_okunan + hysteresis_asil_deger) {
        digitalWrite(FAN, LOW);
        
      } else if (sicaklik_verisi < EEPROM_okunan - hysteresis_asil_deger) {

        digitalWrite(FAN, HIGH);
        
      } else {
        digitalWrite(FAN, LOW);
      
      }
    }
  }



 //HYSTERESİS KONTROLÜ ISITICI
    float hysteresis_asil_deger = EEPROM_okunan_isi * (Hysteresis_bandi / 100.0);
    if (EEPROM_deger_kontrol_isitici == true) {
      if (sicaklik_verisi > EEPROM_okunan_isi + hysteresis_asil_deger) {
        digitalWrite(ISITICI, LOW);
        
      } else if (sicaklik_verisi < EEPROM_okunan_isi - hysteresis_asil_deger) {

        digitalWrite(ISITICI, HIGH);
        
      } else {
        digitalWrite(ISITICI, LOW);
      
      }
    }
  
}


String sayi_kaydir(String onceki_hane, char yeni_hane) {
  if (onceki_hane.length() < 16) {
    return onceki_hane + yeni_hane;
  } else {
    return onceki_hane.substring(1) + yeni_hane;
  }
}