//128x64 Ekran
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//U8G2_ST7920_128X64_F_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */);  // Remember to set R/W to 0
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 17 /* A3 */, /* CS=*/ 16 /* A2 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 13, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
//U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
// Röle devresi
const int onikiv PROGMEM = 3;
const int yirmialtiv PROGMEM = 4;
const int otuzikiv PROGMEM = 5;
const int fan_led PROGMEM = 2;
// End of constructor list
const int currentSensor PROGMEM = A5;
const int voltageSensor PROGMEM = A1;
float vOUT = 0.0;
static float vIN = 0.0;
const float R1 PROGMEM = 10000.0;
const float R2 PROGMEM = 1500.0;
float Vdata = 0;
float V, I;
float Cdata;
float value;
static char buffer[100];
// LM35 Sıcaklık Sensörü
const int lm35Pin PROGMEM = A7;
int lm35 = 0;
float sicaklik_gerilim = 0;
int sicaklik = 0;
////////////////////////
void setup(void) {
  Serial.begin(9600);
  pinMode(onikiv, OUTPUT);
  pinMode(yirmialtiv, OUTPUT);
  pinMode(otuzikiv, OUTPUT);
  pinMode(fan_led, OUTPUT);
  digitalWrite(onikiv, HIGH);
  digitalWrite(yirmialtiv, LOW);
  digitalWrite(otuzikiv, LOW);
  digitalWrite(fan_led, LOW);
  // initialize the LCD
  u8g2.begin();
}
//// ÇERÇEVE OLUŞTURMA FONKSİYONU/////////////
void drawF(int x, int y, int width, int height, int x2, int y2, int width2, int height2) {
  u8g2.drawFrame(x, y, width, height);
  u8g2.drawFrame(x2, y2, width2, height2);
}
/////////////////////////////////////////////
//// SICAKLIĞI EKRANA BASMA FONKSİYONU /////
void temp(int temp) {
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(90, 32, "Tem");
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(108, 31, "p");
  u8g2.setFont(u8g2_font_unifont_t_weather);
  u8g2.drawStr(113, 39, "\u0031");
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.setCursor(94, 40);
  u8g2.print(temp);
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.drawStr(107, 40, "C");
}
///////////////////////////////////////////
void loop(void) {
  // LM35 Sıcaklık Sensörü
  for (int i = 0; i < 350; i++) // daha kararlı ortalama bir sonuç almak için 50 kez okuma yapma
  {
    lm35 = lm35 + analogRead(lm35Pin);
    delay(1);
  }
  lm35 = lm35 / 350;
  sicaklik_gerilim = (5000.0 / 1023.0) * lm35;
  sicaklik = sicaklik_gerilim / 10.0;
  ///////////////////////////////////
  for (int i = 0; i < 300; i++) // daha kararlı ortalama bir sonuç almak için 300 kez okuma yapma
  {
    Cdata = Cdata + analogRead(currentSensor);
    Vdata = Vdata + analogRead(voltageSensor);
    delay(1);
  }
  Cdata = Cdata / 300;
  V = (Cdata / 1024.0) * 5000;
  I = ((V - 2484) / 66);
  //I = (2.5 - (Cdata * (5.0 / 1024.0)) )/0.066;
  Vdata = Vdata / 300;
  vOUT = (Vdata * 5.0) / 1024.0;
  vIN = (vOUT / (R2 / (R1 + R2)));
  u8g2.clearBuffer();
  //// Volt Çerçeve ////////////////////////
  drawF(0, 0, 85, 25, 1, 1, 83, 23);
  //////////////////////////////////////////
  //// Voltaj değerini ekrana yazdırma /////
  //drawPrnt(u8g2_font_VCR_OSD_tr, 21, 0, 5, 5, 21, "V", buffer, 1);
  int ival = vIN * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.drawStr(21, 0, 5);
  u8g2.setCursor(5, 21);
  u8g2.print(buffer);
  u8g2.setCursor(69, 21);
  u8g2.print(F("V"));
  ival = 0;
  /////////////////////////////////////////
  //// Akım Çerçeve ////////////////////////
  drawF(0, 26, 85, 25, 1, 27, 83, 23);
  //////////////////////////////////////////
  //// Amper değerini ekrana yazdırma //////
  double valueI = (I <= 0) ? 00.00 : I;
  ival = valueI * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.drawStr(69, 0, 5);
  u8g2.setCursor(5, 47);
  u8g2.print(buffer);
  u8g2.setCursor(69, 47);
  u8g2.print(F("A"));
  /////////////////////////////////////////
  //// CV ÇERÇEVE ////////////////////////
  drawF(0, 52, 42, 12, 1, 53, 40, 10);
  //////////////////////////////////////////
  //// CV DEĞERİNİ EKRANA YAZDIRMA ////////////////////////
  /*  u8g2.setFont(u8g2_font_micro_tr  );
    u8g2.setCursor(6, 61);
    u8g2.print("CV:12.52");*/
  //////////////////////////////////////////
  //// CC ÇERÇEVE ////////////////////////
  drawF(43, 52, 42, 12, 44, 53, 40, 10);
  //////////////////////////////////////////
  //// CC DEĞERİNİ EKRANA YAZDIRMA ////////////////////////
  /*u8g2.setFont(u8g2_font_micro_tr  );
    u8g2.setCursor(49, 61);
    u8g2.print("CC:02.52");*/
  //////////////////////////////////////////
  //// Kademe Çerçeve //////////////////////
  drawF(86, 0, 42, 21, 87, 1, 40, 19);
  if (vIN <= 11.00) {
    digitalWrite(yirmialtiv, LOW);
    digitalWrite(otuzikiv, LOW);
    delay(100);
    digitalWrite(onikiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(93, 17, "12 Volt");
  } else if ((vIN >= 11.10) && (vIN <= 25.00)) {
    digitalWrite(onikiv, LOW);
    digitalWrite(otuzikiv, LOW);
    delay(100);
    digitalWrite(yirmialtiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(92, 17, "26 Volt");
  } else if (vIN >= 25.10) {
    digitalWrite(onikiv, LOW);
    digitalWrite(yirmialtiv, LOW);
    delay(100);
    digitalWrite(otuzikiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(92, 17, "32 Volt");
  }
  //////////////////////////////////////////
  //// Temp Çerçeve ////////////////////////
  drawF(86, 22, 42, 22, 87, 23, 40, 20);
  if (sicaklik <= 38) {
    digitalWrite(fan_led, LOW);
    temp(sicaklik);
  } else if (sicaklik >= 45) {
    digitalWrite(fan_led, HIGH);;
    temp(sicaklik);
  } else {
    temp(sicaklik);
  }
  //////////////////////////////////////////
  //// Watt Çerçeve ////////////////////////
  drawF(86, 45, 42, 19, 87, 46, 40, 17);
  //////////////////////////////////////////
  //// Watt hesaplama ve ekrana yazdırma ///
  double value = (I * vIN < 0) ? 0.00 : I * vIN;
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.drawStr(119, 60, "W");
  u8g2.setFont(u8g2_font_chikita_tr);
  //u8g2.setFont(u8g2_font_profont10_tn);
  u8g2.setCursor(93, 58);
  u8g2.print(value);
  //////////////////////////////////////////
  u8g2.sendBuffer();
  //// Değerleri sıfırlama ////////////////
  Cdata = 0;
  I = 0;
  V = 0;
  Vdata = 0;
  vIN = 0;
  value;
  delay(500);
}