#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define ledWlacz 0
#define ledWylacz 1
uint32_t caseTime,aktualnyCaseTime;
 
LiquidCrystal_I2C lcd(0x27, 20, 4);



const int zarowka1 = 7;
const int zarowka2 = 6;
const int zarowka3 = 5;
const int zarowka4 = 4;
const int zarowka5 = 3;
const int zarowka6 = 2;
const int analogIn = A0;

int mVperAmp = 66;
int RawValue = 0;
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
uint32_t ostatniPomiar = 0;
uint32_t czasPomiarowy = 2;
uint32_t zapamietanyCzas = 0;
uint32_t aktualnyCzas = 0,poprzedniCzas,sekundy;
const int wylacz = 2000;
const int wlacz12 = 3000;
const int wylacz12 = 13000;
const int wlacz34 = 15000;
const int wylacz34 = 25000;
const int wlacz56 = 27000;
const int wylacz56 = 37000;
const int wlacz123456 = 39000;
const int wylacz123456 = 49000;
unsigned long resetInterval = 51000;
unsigned long startTime = 0;
bool  znacznikSekundy=0;
enum StanZarowek {
  WYLACZONE,
  WLACZ_ZAROWKI_12,
  WYLACZ_ZAROWKI_12,
  WLACZ_ZAROWKI_34,
  WYLACZ_ZAROWKI_34,
  WLACZ_ZAROWKI_56,
  WYLACZ_ZAROWKI_56,
  WLACZ_ZAROWKI_123456,
  WYLACZ_ZAROWKI_123456
};

StanZarowek aktualnyStan = WYLACZONE;

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Pomiar prądu i napięcia!");
  startTime = millis();
  pinMode(zarowka1, OUTPUT);
  pinMode(zarowka2, OUTPUT);
  pinMode(zarowka3, OUTPUT);
  pinMode(zarowka4, OUTPUT);
  pinMode(zarowka5, OUTPUT);
  pinMode(zarowka6, OUTPUT);
}

void loop() {
  
  aktualnyCzas = millis();
  if(aktualnyCzas-poprzedniCzas>1000) //minelaSekunda
  {
    sekundy++;
    poprzedniCzas=aktualnyCzas;
    znacznikSekundy=1;
  }
  if(znacznikSekundy and sekundy%czasPomiarowy==0) pomiarPradu(); //tylko gdy jest nowa sekunda i reszta dzielenia przez czasPomiarowy=0, czyli co 2s

  if (znacznikSekundy) obsugaZarowek(); //tylko gdy jest nowa sekunda
  


  // RESET MILLIS CO 51 SEKUND:
//  if (elapsedTime >= resetInterval) {
//    startTime = aktualnyCzas;
//    Serial.println("Czas zresetowany.");
//    aktualnyStan = WYLACZONE;
//  }

 // no jasne :D delay(10); // Dodaj krótką pauzę dla stabilności
 znacznikSekundy=0;
}

void obsugaZarowek()
{
 // ZAPALANIE ŻARÓWEK:
  switch (aktualnyStan) {
    case WYLACZONE:
      caseTime=2;

       
        digitalWrite(zarowka1, ledWylacz);
        digitalWrite(zarowka2, ledWylacz);
        digitalWrite(zarowka3, ledWylacz);
        digitalWrite(zarowka4, ledWylacz);
        digitalWrite(zarowka5, ledWylacz);
        digitalWrite(zarowka6, ledWylacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan);  Serial.println(" Zarowki wylaczone");
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WLACZ_ZAROWKI_12;
      }   
       
      break;
    case WLACZ_ZAROWKI_12:
      caseTime=2;

      
       
        digitalWrite(zarowka1, LOW);
        digitalWrite(zarowka2, LOW);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 1 i 2 zapalone.");
         
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WYLACZ_ZAROWKI_12;
      }      
      break;

    case WYLACZ_ZAROWKI_12:
       caseTime=1;
    
        digitalWrite(zarowka1, ledWylacz);
        digitalWrite(zarowka2, ledWylacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 1 i 2 zgaszone.");
        
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WLACZ_ZAROWKI_34;
      }        
      break;

    case WLACZ_ZAROWKI_34:
        caseTime=5;
    
        digitalWrite(zarowka3, ledWlacz);
        digitalWrite(zarowka4, ledWlacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 3 i 4 zapalone.");

      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WYLACZ_ZAROWKI_34;
      }           
       
      break;

    case WYLACZ_ZAROWKI_34:
          caseTime=2;
      
        digitalWrite(zarowka3, ledWylacz);
        digitalWrite(zarowka4, ledWylacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 3 i 4 zgaszone.");
         
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WLACZ_ZAROWKI_56;
      }         
      break;

    case WLACZ_ZAROWKI_56:
           caseTime=2;
      
        digitalWrite(zarowka5, ledWlacz);
        digitalWrite(zarowka6, ledWlacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 5 i 6 zapalone.");

     if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WYLACZ_ZAROWKI_56;
      } 
      
      break;

    case WYLACZ_ZAROWKI_56:
             caseTime=2;
      
        digitalWrite(zarowka5, ledWylacz);
        digitalWrite(zarowka6, ledWylacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 5 i 6 zgaszone.");
        
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WLACZ_ZAROWKI_123456;
      }        
      break;

    case WLACZ_ZAROWKI_123456:
             caseTime=2;
       
        digitalWrite(zarowka1, ledWlacz);
        digitalWrite(zarowka2, ledWlacz);
        digitalWrite(zarowka3, ledWlacz);
        digitalWrite(zarowka4, ledWlacz);
        digitalWrite(zarowka5, ledWlacz);
        digitalWrite(zarowka6, ledWlacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Wszystkie zarowki zapalone.");
         
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WYLACZ_ZAROWKI_123456;
      } 
             
      break;

    case WYLACZ_ZAROWKI_123456:
              caseTime=2;
        
        digitalWrite(zarowka1, ledWylacz);
        digitalWrite(zarowka2, ledWylacz);
        digitalWrite(zarowka3, ledWylacz);
        digitalWrite(zarowka4, ledWylacz);
        digitalWrite(zarowka5, ledWylacz);
        digitalWrite(zarowka6, ledWylacz);
        Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Wszystkie zarowki zgaszone.");
         
      if (++aktualnyCaseTime>=caseTime)
      {
        aktualnyCaseTime=0;
        aktualnyStan=WYLACZONE;
      }
          
      break;
  }
}  


void pomiarPradu()
{
    ostatniPomiar = aktualnyCzas;
    RawValue = analogRead(analogIn);
    Voltage = (RawValue / 1024.0) * 5000;
    Amps = ((Voltage - ACSoffset) / mVperAmp);
    Serial.print("\t Amps = ");
    Serial.println(Amps, 3);
    displayCurrent(Amps);
  }

// WYŚWIETLANIE PRĄDU NA LCD 4x20:
void displayCurrent(float Amps) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Prad: ");
  lcd.print(Amps);
  lcd.print(" A");
}