#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] = { 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000 };
byte znak1[8] = { 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100, 0b10100 };
byte znak2[8] = { 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101 };
void setup() {
// Inicjalizacja wyświetlacza LCD
lcd.begin(16, 2);
// Zaprogramuj grafikę użytkownika
lcd.createChar(0, znak0);
lcd.createChar(1, znak1);
lcd.createChar(2, znak2);
}
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);
lcd.print(napiecie); // Wyświetl ją
lcd.print(F(" ")); // Wyświetl cztery spacje
// 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 1/3 działki
bargraf = (21 + napiecie) / 64;
// Powtarzaj zgodnie z długością bargrafu minus jeden
for (byte x = 0; x < bargraf; x++) {
// Wyświetl grafikę z trzema słupkami
lcd.write(2);
}
// Jeśli reszta z dzielenia długości bargrafu przesuniętą o 1/3 działki jest większa o 1/3 działki i mniejsza o 2/3, to...
if ((21 + napiecie) % 64 > 21 && (21 + napiecie) % 64 <= 42) {
// Wyświetl grafikę z jednym słupkiem
lcd.write(0);
}
// Jeśli reszta z dzielenia długości bargrafu przesuniętą o 1/3 działki jest większa o 2/3 działki, to...
if ((21 + napiecie) % 64 > 42) {
// Wyświetl grafikę z dwoma słupkami
lcd.write(1);
}
// Wyświetl 15 spacji
lcd.print(F(" "));
}