#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
// Konfiguracja dla wyświetlacza LCD podłączonego przez I2C (adres 0x27, typowy dla LCD1602)
// Adres I2C 0x27, 16 znaków x 2 linie
hd44780_I2Cexp lcd(0x27, 16, 2);
// Port, który będzie mierzyć napięcie
const byte woltomierz = A1;
// Wartość tego napięcia bez jednostek
int napiecie;
// Wartość tego napięcia w woltach
float napiecieV;
// Wartość tego napięcia dla bargrafu
byte bargraf;
// Wartość poprzednio zmierzonego napięcia
int napiecieStare = 255;
// Grafika użytkownika
byte znak0[8] = { 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000 };
byte znak1[8] = { 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011 };
void setup() {
// Inicjalizacja wyświetlacza LCD
lcd.begin(16, 2);
// Zaprogramuj grafikę użytkownika
lcd.createChar(0, znak0);
lcd.createChar(1, znak1);
}
void loop() {
// Porównaj ze sobą kolejne mierzone wartości napięć i wyjdź, jeśli różnią się o więcej niż 3
while (abs(napiecie - napiecieStare) < 4) {
// Pobierz wartość napięcia z portu woltomierza
napiecie = analogRead(woltomierz);
}
// Przepisz wartość zmierzonego napięcia do zmiennej napiecieStare
napiecieStare = napiecie;
// Ustaw kursor na początku wyświetlacza
lcd.setCursor(0, 0);
// Wyświetl ją
lcd.print(napiecie);
// Wyświetl cztery spacje
lcd.print(F(" "));
// Ustaw kursor na pzycji szóstej
lcd.setCursor(6, 0);
// Wyświetl zmierzoną wartość w formacie HEX
lcd.print(napiecie, HEX);
// Wyświetl trzy spacje
lcd.print(F(" "));
// Ustaw kursor na pzycji jedenastej
lcd.setCursor(11, 0);
// Przelicz dziesięciobitową wartość na wolty
napiecieV = napiecie * (5.0 / 1024.0);
// Wyświetl napięcie z dokładnością do trzech cyfr po przecinku
lcd.print(napiecieV, 3);
// Ustaw kursor na początku dolnego wiersza
lcd.setCursor(0, 1);
// Oblicz długość bargrafu, przesuwając całość o połowę działki
bargraf = (32 + napiecie) / 64;
// Powtarzaj zgodnie z długością bargrafu minus jeden
for (byte x = 0; x < bargraf; x++) {
// Wyświetl grafikę z dwoma słupkami
lcd.write(1);
}
// Jeśli reszta z dzielenia długości bargrafu przesuniętą o połowę działki jest większa o połowę działki, to...
if ((32 + napiecie) % 64 > 32) {
// Wyświetl grafikę z jednym słupkiem
lcd.write(0);
}
// Wyświetl 15 spacji
lcd.print(F(" "));
}