#include <Wire.h>
#include <LiquidCrystal.h>
#include <hd44780.h>
#include "hd44780_I2Cexp.h"

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
//hd44780_I2Cexp lcd(0x20, I2Cexp_MCP23008, 7, 6, 5, 4, 3, 2, HIGH);

const byte woltomierz = A0;  // Port, który będzie mierzyć napięcie.
int napiecie;                // Wartość tego napięcia bez jednostek.

// Wzorce dużych cyfr
byte znak[320] = { 0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00001, 0b00011, 0b00000, 0b00000,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00011, 0b00011,
                   0b00100, 0b01100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b01100, 0b00000, 0b00000,
                   0b00111, 0b01110, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111, 0b11111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b11111, 0b11111, 0b11111,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b01100, 0b00000, 0b00000,
                   0b00000, 0b00000, 0b01100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b11100, 0b01110, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00001, 0b00011, 0b00111, 0b01110,
                   0b11100, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00011, 0b00011,
                   0b00100, 0b01100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11100, 0b11111, 0b11111, 0b11111, 0b11100, 0b11100, 0b11111, 0b11111,
                   0b11111, 0b11111, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111, 0b11110,
                   0b00000, 0b00000, 0b01100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11111, 0b11111, 0b00111, 0b00000, 0b00000, 0b11100, 0b11110, 0b01111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11111, 0b11111, 0b11110,
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01110, 0b00000, 0b00000, 0b11100, 0b11110, 0b01111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b11111, 0b11111, 0b11111, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000,
                   0b00111, 0b01110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b01100,
                   0b11111, 0b11111, 0b11111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b01110, 0b00111,
                   0b01110, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b01110, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11110, 0b01111, 0b00111, 0b00000, 0b00000, 0b01110, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111,
                   0b01111, 0b11111, 0b11111, 0b00111, 0b00111, 0b01111, 0b11110, 0b11100 };

void setup() {
  lcd.begin(16, 2);  // Inicjalizacja wyświetlacza LCD
}

void loop() {
  napiecie = analogRead(woltomierz);

  lcd.setCursor(8, 0);  // Wyczyść miejsca, w których tkwią prawe cyfry.
  lcd.print("    ");
  lcd.setCursor(8, 1);
  lcd.print("    ");

  lcd.createChar(0, znak + 32 * ((napiecie / 1000) % 10));       // Lewa górna część dziesiątek.
  lcd.createChar(1, znak + 32 * ((napiecie / 1000) % 10) + 8);   // Lewa dolna część dziesiątek.
  lcd.createChar(2, znak + 32 * ((napiecie / 1000) % 10) + 16);  // Prawa górna część dziesiątek.
  lcd.createChar(3, znak + 32 * ((napiecie / 1000) % 10) + 24);  // Prawa dolna część dziesiątek.
  lcd.createChar(4, znak + 32 * ((napiecie / 100) % 10));        // Lewa górna część jednostek.
  lcd.createChar(5, znak + 32 * ((napiecie / 100) % 10) + 8);    // Lewa dolna część jednostek.
  lcd.createChar(6, znak + 32 * ((napiecie / 100) % 10) + 16);   // Prawa górna część jednostek.
  lcd.createChar(7, znak + 32 * ((napiecie / 100) % 10) + 24);   // Prawa dolna część jednostek.

  lcd.setCursor(4, 0);  // Ustaw kursor na pozycji czwartej w wierszu górnym.
  lcd.write(0);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(2);
  lcd.write(4);
  lcd.write(6);
  lcd.setCursor(4, 1);  // Ustaw kursor na pozycji czwartej w wierszu dolnym.
  lcd.write(1);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(3);
  lcd.write(5);
  lcd.write(7);

  delay(40);  // Dobierz opóźnienie dla najlepszego efektu wizualnego.

  lcd.setCursor(4, 0);  // Wyczyść miejsca, w których tkwią lewe cyfry.
  lcd.print("    ");
  lcd.setCursor(4, 1);
  lcd.print("    ");

  lcd.createChar(0, znak + 32 * ((napiecie / 10) % 10));       // Lewa górna część dziesiątek.
  lcd.createChar(1, znak + 32 * ((napiecie / 10) % 10) + 8);   // Lewa dolna część dziesiątek.
  lcd.createChar(2, znak + 32 * ((napiecie / 10) % 10) + 16);  // Prawa górna część dziesiątek.
  lcd.createChar(3, znak + 32 * ((napiecie / 10) % 10) + 24);  // Prawa dolna część dziesiątek.
  lcd.createChar(4, znak + 32 * (napiecie % 10));              // Lewa górna część jednostek.
  lcd.createChar(5, znak + 32 * (napiecie % 10) + 8);          // Lewa dolna część jednostek.
  lcd.createChar(6, znak + 32 * (napiecie % 10) + 16);         // Prawa górna część jednostek.
  lcd.createChar(7, znak + 32 * (napiecie % 10) + 24);         // Prawa dolna część jednostek.

  lcd.setCursor(8, 0);  // Ustaw kursor na pozycji ósmej w wierszu górnym.
  lcd.write(0);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(2);
  lcd.write(4);
  lcd.write(6);
  lcd.setCursor(8, 1);  // Ustaw kursor na pozycji ósmej w wierszu dolnym.
  lcd.write(1);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(3);
  lcd.write(5);
  lcd.write(7);

  delay(40);  // Dobierz opóźnienie dla najlepszego efektu wizualnego.
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
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