// Kitaplık Yöneticisi'nden kurulacak:
// "LiquidCrystal I2C"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Ölçülen gerilimin girdiği analog pin
const int INPUT_PIN = A0;
// Arduino'nun 5V'u: multimetren varsa
// 5V pininde ölçtüğünü yaz, sonuç düzelir
const float VREF = 5.00;
// Ortalaması alınan okuma sayısı
const int SAMPLES = 16;
// Ölçümler arası süre (ms)
const unsigned long READ_EVERY = 300;
// I2C adresi çoğunda 0x27, bazısında 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Çubuğun beş parçası: 1-5 sütunu dolu
// kutular, LCD'ye özel karakter olarak
void makeBars() {
for (int level = 0; level < 5; level++) {
// Soldan level+1 sütunu dolu satır
byte row = 0;
for (int col = 0; col <= level; col++) {
row |= 0x10 >> col;
}
byte shape[8];
for (int y = 0; y < 8; y++) shape[y] = row;
lcd.createChar(level, shape);
}
}
// Okumaların ortalaması: sayı titremez
int readAverage() {
long sum = 0;
for (int i = 0; i < SAMPLES; i++) {
sum += analogRead(INPUT_PIN);
}
return sum / SAMPLES;
}
// Alt satır: 0-5 V, 16 kutuluk bir çubuk;
// her kutu 5 adım, toplam 80 adım
void showBar(int raw) {
int steps = (long)raw * 80 / 1023;
lcd.setCursor(0, 1);
for (int cell = 0; cell < 16; cell++) {
int fill = steps - cell * 5;
if (fill >= 5) {
lcd.write(byte(4));
} else if (fill > 0) {
lcd.write(byte(fill - 1));
} else {
lcd.print(' ');
}
}
}
void setup() {
lcd.init();
lcd.backlight();
makeBars();
Serial.begin(9600);
}
void loop() {
int raw = readAverage();
// 0-1023 arası okuma, volta çevrilir
float volts = raw * VREF / 1023.0;
lcd.setCursor(0, 0);
lcd.print("Gerilim: ");
lcd.print(volts, 2);
// Sondaki boşluk eski yazıyı siler
lcd.print(" V ");
showBar(raw);
Serial.print("Gerilim: ");
Serial.print(volts, 2);
Serial.print(" V (A0 = ");
Serial.print(raw);
Serial.println(")");
delay(READ_EVERY);
}