#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);
}