#include <Wire.h> 
#include <SPI.h> 
#include <LiquidCrystal_I2C.h>
#include <Adafruit_ADS1X15.h>    

LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_ADS1115 ads;
int 
millisLCDInterval     = 500,
avgCountVS            = 20;       

float
inVoltageDivRatio     = 2.0111,    
outVoltageDivRatio    = 2.0111,    
VSI                   = 0.0000,     
VSO                   = 0.0000,     
VSI1                  = 0.0000,   
VSO1                  = 0.0000,     
VSI2                  = 0.0000,    
VSO2                  = 0.0000,     
VSI3                  = 0.0000,    
VSO3                  = 0.0000,   
voltageInput          = 0.0000,
voltageOutput         = 0.0000,
voltageInput1         = 0.0000,
voltageOutput1        = 0.0000,
voltageInput2         = 0.0000,
voltageOutput2        = 0.0000,
voltageInput3         = 0.0000,
voltageOutput3        = 0.0000,
loopTime              = 0.0000;

unsigned long 
currentLCDMillis      = 0,        
currentLCDBackLMillis = 0,         
prevLCDMillis         = 0,         
prevLCDBackLMillis    = 0,        
loopTimeStart         = 0,        
loopTimeEnd           = 0;

const int 
maxADCValue           = 4096;

const float 
referenceVoltage      = 3.3,
gain = 1.0; 

bool     
enableLCD             = 1;

void setup() {
//  pinMode(0, INPUT_ANALOG);
//  pinMode(1, INPUT_ANALOG);
//  pinMode(2, INPUT_ANALOG);
//  pinMode(3, INPUT_ANALOG); 
  pinMode(4, INPUT_ANALOG);
//  pinMode(5, INPUT_ANALOG);
//  pinMode(6, INPUT_ANALOG);
//  pinMode(7, INPUT_ANALOG);

  Serial.begin(1000000);

//  ads.setGain(GAIN_TWO);    
//  Wire.setClock(200000); // 100000 (standard mode) ,200000 (balance mode), 400000 (fast mode), [1000000 (fast mode plus) and 3400000 (high speed mode)]might cause some error
//  ads.begin(); //Initialize ADC
//  ads.setDataRate(RATE_ADS1115_860SPS); //8, 16, 32, 64, 128, 250, 475, 860 is max for ADS1115
//  lcd.begin();
//  lcd.backlight();

  delay(1000);
}

void padding100(int padVar){
  if(padVar<10){lcd.print("  ");}
  else if(padVar<100){lcd.print(" ");}
}
void padding10(int padVar){
  if(padVar<10){lcd.print(" ");}
}

void loop() {

  VSI = 0.0000;      
  VSO = 0.0000;   
  VSI1 = 0.0000;      
  VSO1 = 0.0000;   
  for(int i = 0; i<avgCountVS; i++){
//    VSI = VSI + ads.computeVolts(ads.readADC_SingleEnded(0));
//    VSO = VSO + ads.computeVolts(ads.readADC_SingleEnded(1));
//    VSI1 = VSI1 + ads.computeVolts(ads.readADC_SingleEnded(2));
//    VSO1 = VSO1 + ads.computeVolts(ads.readADC_SingleEnded(3));
    VSI  = VSI  + (analogRead(4)/float(maxADCValue))*referenceVoltage;
//    VSO  = VSO  + (analogRead(5)/float(maxADCValue))*referenceVoltage;
//    VSI1 = VSI  + (analogRead(4)/float(maxADCValue))*referenceVoltage;
//    VSO1 = VSO  + (analogRead(6)/float(maxADCValue))*referenceVoltage;
  }
//  voltageInput   = (VSI/avgCountVS)*inVoltageDivRatio;
//  voltageOutput  = (VSO/avgCountVS)*outVoltageDivRatio;
//  voltageInput1  = (VSI1/avgCountVS)*inVoltageDivRatio;
//  voltageOutput1 = (VSO1/avgCountVS)*outVoltageDivRatio;

  voltageInput   = (VSI/avgCountVS);
//  voltageOutput  = (VSO/avgCountVS);
//  voltageInput1  = (VSI1/avgCountVS);
//  voltageOutput1 = (VSO1/avgCountVS);

  loopTimeStart = micros();                                      
  loopTime = (loopTimeStart-loopTimeEnd)/1000.000;                 
  loopTimeEnd = micros();  
                                         
  currentLCDMillis = millis();
  if(currentLCDMillis-prevLCDMillis>=millisLCDInterval){  
  prevLCDMillis = currentLCDMillis;   
    
//  lcd.setCursor(0,0); lcd.print(voltageInput,3);  lcd.print("V");padding100(voltageInput1);
//  lcd.setCursor(8,0); lcd.print(voltageOutput,3);   lcd.print("V");padding10(voltageInput);
//  lcd.setCursor(0,1); lcd.print(voltageInput1,3);  lcd.print("V");padding100(voltageInput1);
//  lcd.setCursor(8,1); lcd.print(voltageOutput1,3);   lcd.print("V");padding10(voltageInput);
  
  Serial.print(" VI:");    Serial.print(voltageInput,4); 
//  Serial.print(" VO:");    Serial.print(voltageOutput,4);
//  Serial.print(" VI1:");   Serial.print(voltageInput1,4); 
//  Serial.print(" VO1:");   Serial.print(voltageOutput1,4);
  Serial.print(" LoopT:"); Serial.print(loopTime,4);Serial.print("ms");  
  Serial.println("");}
//  delay(10);
}