#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27 // adresa zariadenia 0x27
#define LCD_COLUMNS 16 // pocet stlpcov displeja
#define LCD_LINES 2  // pocet riadkov

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
float val = 0;
int volt = A0; // číslo pinu pre meranie napätia
int lastVal = 0;
int poziciasipky = 6;
bool zvysovanie = false;
byte sipkap[8]={    //definicia vlastny znak sipka doprava
  B10000,
  B01000,
  B00100,
  B00010,
  B00010,
  B00100,
  B01000,
  B10000,
};

byte sipkal[8]={   //definicia vlastny znak sipka dolava
  B00001,
  B00010,
  B00100,
  B01000,
  B01000,
  B00100,
  B00010,
  B00001,
};

byte sipkapl[8]={  //definicia vlastny znak sipky proti sebe
  B00000,
  B10000,
  B01100,
  B10000,
  B00010,
  B01100,
  B00010,
  B00000,
};
byte nothing[] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};

void setup() {

lcd.init();  // inicializacia lcd
lcd.backlight(); // zapnutie podsvietenia
lcd.createChar(0, sipkap);  // vytvorenie vlastneho znaku pre sipku vpravo
lcd.createChar(1, sipkal);  // vytvorenie vlastneho znaku pre sipku vlavo
lcd.createChar(2, sipkapl);  // vytvorenie vlastneho znaku pre sipky proti sebe
lcd.createChar(3, nothing);
lcd.clear();
}

void loop(){
val = analogRead(volt);  // prečítať hodnotu pinu A0
val = val/1024*5.0;      // konvertovanie hodnoty pinu do napätie
lcd.setCursor(0,0);       // nastavenie kurzoru na stĺpec 0, riadok 0
lcd.print("Napatie: ");    // napis na prvy riadok
lcd.setCursor(10,0);       // nastavenie kurzoru na stĺpec 10, riadok 0
lcd.print(val);              // zobraziť napätie na LCD
lcd.setCursor(15,0);         // nastavenie kurzoru na stĺpec 15, riadok 0
lcd.print('V');              // zobrazit "V" na LCD


int roz = val - lastVal;     //rozdiel hodnot
if (roz > 0) {                //ak rastie
zvysovanie = true;         //rastie
lcd.setCursor(0,1);
lcd.print("                ");
for(int i = 0; i <= 15; i++) {      //cyklus vykresluje sipky zlava doprava
lcd.setCursor(i, 1);                //kurzor i-stlpec, 1 riadok
lcd.write(0);                   //vykreslenie sipky
delay(100);                   // cas zobrazenia sipky
lcd.setCursor(i, 1);              //kurzor i-stlpec, 1 riadok
lcd.write(3);                   //vykreslenie prazneho znaku
}
}else if (roz < 0) {        //ak klesa
lcd.setCursor(0,1);
lcd.print("                ");
for(int i = 15; i >= 0; i--) {
lcd.setCursor(i, 1);             //kurzor i-stlpec, 1 riadok
lcd.write(1);                 //vykreslenie sipky
delay(100);                     // cas zobrazenia sipky
lcd.setCursor(i, 1);             //kurzor i-stlpec, 1 riadok
lcd.write(3);                 //vykreslenie prazneho znaku
}
  } else { 
  lcd.setCursor(8,1);      //nadstavi poziciu a vypise na predchadzajucom mieste sipky oproti sebe
  lcd.write(3); 
  lcd.setCursor(8,1);
  lcd.write(2); 
  }

  lastVal = val;  // Aktualizácia predchádzajúcej hodnoty
delay(1000);                   // počkať 1000 ms
  }