#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4); // Inicjalizacja obiektu LCD z adresem I2C 0x27, 20 kolumnami i 4 wierszami

const int przyciskZielony = 2;   // Definicja pinu do którego podłączony jest przycisk zielony

// Definicja niestandardowych znaków w formie bitmap 5x8
// Każdy bajt definiuje jeden wiersz znaku, a bit 1 oznacza zapaloną pikselę
byte customChar0[8] ={
                      B00010,
                      B00100,
                      B01110,
                      B10000,
                      B01110,
                      B00001,
                      B11110,
                      B00000
                     };
byte customChar1[8] ={
                      B00000,
                      B01110,
                      B10001,
                      B11111,
                      B10000,
                      B01110,
                      B00010,
                      B00001
                     };
byte customChar2[8] ={
                      B00000,
                      B01110,
                      B00001,
                      B01111,
                      B10001,
                      B01111,
                      B00010,
                      B00001
                     };
byte customChar3[8] ={
                      B00000,
                      B01010,
                      B11111,
                      B11111,
                      B11111,
                      B01110,
                      B00100,
                      B00000
                     };
byte customChar4[8] ={
                      B00000,
                      B00000,
                      B01010,
                      B11111,
                      B01110,
                      B00100,
                      B00000,
                      B00000
                     };                     

void setup() 
{
  lcd.init(); // Inicjalizacja wyświetlacza LCD
  lcd.backlight(); // Włączenie podświetlenia wyświetlacza

  pinMode(przyciskZielony, INPUT_PULLUP); // Ustawienie pinu przycisku jako wejście z wewnętrznym podciąganiem do VCC

  // Rejestracja niestandardowych znaków w pamięci wyświetlacza LCD
  lcd.createChar(0, customChar0); 
  lcd.createChar(1, customChar1); 
  lcd.createChar(2, customChar2); 
  lcd.createChar(3, customChar3); 
  lcd.createChar(4, customChar4);

  // Wyświetlenie zachęty do naciśnięcia przycisku
  lcd.setCursor(2, 1); 
  lcd.print("Wci");
  lcd.write(byte(0));
  lcd.print("nij zielony");
  lcd.setCursor(4, 2); 
  lcd.print("przycisk;)");

  // Oczekiwanie na naciśnięcie zielonego przycisku
  while(digitalRead(przyciskZielony));
  lcd.clear(); // Czyszczenie wyświetlacza po naciśnięciu przycisku

  // Wyświetlenie podziękowania za zainteresowanie ofertą
  lcd.setCursor(3, 0); 
  lcd.print("Dzi");
  lcd.write(byte(1));
  lcd.print("kujemy za");
  lcd.setCursor(2, 1); 
  lcd.print("zainteresowanie");
  lcd.setCursor(3, 2); 
  lcd.print("nasz");
  lcd.write(byte(2));
  lcd.print(" ofert");
  lcd.write(byte(2));
  lcd.print("!");
  lcd.setCursor(3, 3); 
  lcd.print("arduinowo.pl"); // Dodatkowa informacja na wyświetlaczu
}

void loop() 
{
  // Efekt animacji na rogach wyświetlacza
  lcd.setCursor(0, 0); lcd.write(byte(3)); // Róg górny lewy
  lcd.setCursor(19, 0); lcd.write(byte(3)); // Róg górny prawy
  lcd.setCursor(0, 3); lcd.write(byte(3)); // Róg dolny lewy
  lcd.setCursor(19, 3); lcd.write(byte(3)); // Róg dolny prawy
  delay(500); // Krótka pauza
  
  // Zmiana znaków na rogach dla efektu animacji
  lcd.setCursor(0, 0); lcd.write(byte(4)); // Róg górny lewy
  lcd.setCursor(19, 0); lcd.write(byte(4)); // Róg górny prawy
  lcd.setCursor(0, 3); lcd.write(byte(4)); // Róg dolny lewy
  lcd.setCursor(19, 3); lcd.write(byte(4)); // Róg dolny prawy
  delay(500); // Krótka pauza
}

// Chcesz dowiedzieć się, jak takie programy działają?
// --->>> Zapisz się na nasz kurs <<< -----