#include <LiquidCrystal.h>
#include <math.h>

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const int Analog = A0;
const int MAX_VOLTAGE = 4.3;
const int BAR_WIDTH = 14;
const int numReadings = 5;
int readings[numReadings];
int index = 0;
int total = 0;
int average = 0;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Volume: ");
  lcd.setCursor(11, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("[              ]");
  for (int i = 0; i < numReadings; i++) {
    readings[i] = 0;
  }
}

void loop() {
  total -= readings[index];
  readings[index] = analogRead(Analog);
  total += readings[index];
  index++;
  if (index >= numReadings) {
    index = 0;
  }
  average = total / numReadings;
  float voltage = (average * MAX_VOLTAGE) / 1023.0;
  float log_voltage = log10(voltage + 1);
  float max_log_voltage = log10(MAX_VOLTAGE + 1);
  int percentage = (int)((log_voltage / max_log_voltage) * 100);
  percentage = constrain(percentage, 0, 100);
  int barLength = (percentage * BAR_WIDTH) / 100;
  lcd.setCursor(8, 0);
  lcd.print(percentage);
  lcd.print("%  ");
  lcd.setCursor(0, 1);
  lcd.print("[              ]");
  for (int i = 1; i <= BAR_WIDTH; i++) {
    lcd.setCursor(i, 1);
    if(i <= barLength){
      lcd.write(0xFF);
    } else{
      lcd.write(0xFE);
    }
  }
  delay(200);
}
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:GND.2
uno:RESET.2
uno:0
uno:1
uno:13
uno:3.3V
uno:AREF
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
uno:A6
uno:A7
uno:5V
uno:RESET
uno:GND.1
uno:VIN
uno:12.2
uno:5V.2
uno:13.2
uno:11.2
uno:RESET.3
uno:GND.3
lcd:VSS
lcd:VDD
lcd:V0
lcd:RS
lcd:RW
lcd:E
lcd:D0
lcd:D1
lcd:D2
lcd:D3
lcd:D4
lcd:D5
lcd:D6
lcd:D7
lcd:A
lcd:K
r1:1
r1:2
pot1:GND
pot1:SIG
pot1:VCC
r2:1
r2:2
r3:1
r3:2
vcc1:VCC
gnd1:GND