// 200A CT je 1A : 2v/200=0.01324 V
// logic shifter : 0.01324 prevedie  0.00876821192052980132450331125828v
// Esp32 - 4095bit 3.3v
// LCD - SCL pin 22 ......SDA pin 21
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

const unsigned long interval = 100;
unsigned long predcas = 0;
int ssr1 = 0;
unsigned int Ssr = 5;
float vytazovanie = 55.2;
float nasobic;
float tlup;
float tldown;
int vytazperc;

void setup() {
  lcd.init();
  lcd.clear();
  lcd.backlight();
  
  pinMode(Ssr, OUTPUT);
  Serial.begin(115200);
}


void loop() {
  // vypocet prudovej sondy 200A
  float sensor1 = analogRead(34);
  float voltage1 = sensor1 * (3.3 / 4095.0);
  if (voltage1 < 1.65)
    voltage1 = 1.65;
  float prud = (voltage1 - 1.65) / 0.00876821192052980132450331125828;

  //vypocet napatia baterie
  float sensor2 = analogRead(35);
  float voltage2 = (sensor2 * 3.3) / 4095.0;
  float baterka = voltage2 / (2200.0 / (47000.0 + 2200.0));
  int baterkaperc = (baterka - 44.4) * (100 - 0) / (57.8 - 44.4) + 0;
  //vypocet vykonu baterie
  unsigned int vykon = baterka * prud;
  if (baterka < vytazovanie)
     vykon = 0; 
  // nastavenie percent vytazovania - (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  int vytazperc = (vytazovanie - 44.4) * (100 - 0) / (57.8 - 44.4) + 0;
  int ssrperc = (ssr1 - 0) * (100 - 0) / (255 - 0) + 0;


  //SSR 0-5V
  if (ssr1 <= 0)
    ssr1 = 1;
  if (ssr1 >= 254)
    ssr1 = 254;
  if (vykon > 0)
    ++ssr1;
  if (vykon <= 0)
    --ssr1;
  if (baterka < vytazovanie)
    ssr1 = 0;
  if (baterka > vytazovanie + 0.5)
    ssr1 = 255;
  analogWrite(Ssr, ssr1);



  // nastavenie vytazovania baterie
  float tlup = analogRead(32);
  float tldown = analogRead(33);
  unsigned long aktualnycas = millis();
  if (aktualnycas - predcas >= interval)
  {
    if (tlup == 4095)
      vytazovanie = (++nasobic * 0.1) + 54.0;
    if (tldown == 4095)
      vytazovanie = (--nasobic * 0.1) + 54.0;
      predcas = aktualnycas;
  }
  lcd.setCursor(0,3); 
  lcd.print("Rele:");
  lcd.print(ssrperc);
  lcd.print("%    ");
  
  lcd.setCursor(0,2); 
  lcd.print("Vykon:");
  lcd.print(vykon);
  lcd.print("W   ");
  
  lcd.setCursor(0,0); 
  lcd.print("Vytazovak:");
  lcd.print(vytazperc);
  lcd.print("%   ");
  
  lcd.setCursor(0,1); 
  lcd.print("Baterka:");
  lcd.print(baterkaperc);
  lcd.print("%    ");
  
  Serial.print("Vytazovanie : ");
  Serial.print(vytazperc);
  Serial.println("%");

  Serial.print("vytazovanie : ");
  Serial.print(vytazovanie);
  Serial.println("V");

  Serial.print("Ssr : ");
  Serial.print(ssr1);
  Serial.println(".");

  Serial.print("Vykon : ");
  Serial.print(vykon);
  Serial.println("W");

  Serial.print("Baterka : ");
  Serial.print(baterka);
  Serial.println("V");

  Serial.print("Baterka : ");
  Serial.print(baterkaperc);
  Serial.println("%");

  Serial.print("Voltage1 : ");
  Serial.print(voltage1);
  Serial.println("V");

  Serial.print("Prud : ");
  Serial.print(prud);
  Serial.println("A");
  
}