#include <LiquidCrystal_I2C.h> // dyrektywa dołączająca
// bibliotekę obsługującą
// ekran LCD z interfejsem I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// utworzenie zmiennej lcd typu LiquidCrystal_I2C
// i przekazanie do konstruktora wartości adresu ekranu,
// liczby kolumn i wierszy
int BUTTON = 3; // zmienna przechowująca numer pinu przełącznika
// który pozwala na obsługę przerwań
int PRZEKAZNIK = 12; // zmienna przechowująca numer pinu
// wysyłającego sygnał do przekaźnika
bool ZALACZONY = false; // zmienna przechowująca stan przekaźnika
unsigned long czas = 0; // zmienne do późniejszego przechowywania
unsigned long czasPoPrzerwie = 0; // czasu działania programu
unsigned long przerwa = 100; // utworzenie zmiennej przechowującej
// długość przerwy w milisekundach
bool nacisniecie = false; // zmienna przechowująca informację
// o naciśnięciu przycisku
byte polishZ[] = {
B00100,
B11111,
B01001,
B00010,
B00100,
B01000,
B11111,
B00000,
}; // utworzenie zmiennej do wygenerowania "Ź"
byte polishA[] = {
B01110,
B10001,
B10001,
B11111,
B10001,
B10001,
B10001,
B00010,
}; // utworzenie zmiennej do wygenerowania "Ą"
byte polishL[] = {
B10000,
B10000,
B10010,
B10100,
B11000,
B10000,
B11111,
B00000,
}; // utworzenie zmiennej do wygenerowania "Ł"
void setup() { // funkcja wykonująca się raz na początku programu
Serial.begin(9600); // inicjalizacja portu szeregowego
// z ustawieniem szybkości przesyłu
//danych na 9600 bitów na sekundę
pinMode(PRZEKAZNIK, OUTPUT); // konfiguracja pinu do wysyłania
// sygnału do przekaźnika
pinMode(BUTTON, INPUT_PULLUP); // ustawienie pinu powiązanego z przyciskiem
// w tryb wejścia, z jednoczesną aktywacją
// wbudowanego rezystora podciągającego,
// dzięki któremu otrzymujemy stabilny stan wejścia
// ustawiony na wartość "HIGH"
lcd.init(); // przygotowanie wyświetlacza LCD do pracy
lcd.backlight(); // włączenie podświetlenia wyświetlacza
lcd.createChar(0, polishZ); //utworzenie w pamięci
lcd.createChar(1, polishL); // polskich znaków
lcd.createChar(2, polishA); // w zarezerwowanych miejscach 0, 1 i 2
Serial.println("PRZEKAŹNIK WYŁĄCZONY"); // wyświetlenie komunikatu
// na monitorze portu szeregowego
lcd.setCursor(0, 0); // ustawienie kursora na pierwszą kolumnę
// w pierwszym wierszu na ekranie LCD
lcd.print("PRZEKA"); // wyświetlenie na ekranie LCD ciągu znaków
lcd.write(byte(0)); // wyświetlenie polskiego znaku
lcd.print("NIK WY");
lcd.write(byte(1));
lcd.write(byte(2));
lcd.print("CZONY");
attachInterrupt(digitalPinToInterrupt(BUTTON), nacisk, RISING);
// ustawienie przerwania, które uruchomi
// funkcję "nacisk" po wykryciu wzrostu napięcia
// na pinie o numerze ze zmiennej BUTTON
}
void loop() { // pętla wykonująca się nieustannie podczas pracy programu
if (nacisniecie) // blok kodu wykonujący się jeśli zmienna "naciśnięcie" jest prawdziwa
{
zmianaStanu(); // wywołanie funkcji "zmianaStanu"
while (digitalRead(BUTTON) == LOW) // pętla wykonująca się dopóki przycisk jest trzymany
{
Serial.print(""); // pusta instrukcja drukująca
}
czas = millis(); // ustawienie zmiennej na obecną wartość milisekund
// jaka minęła od rozpoczęcia pracy programu
czasPoPrzerwie = millis() + przerwa; // ustawienie zmiennej na obecną wartość milisekund
// jaka minęła od rozpoczęcia pracy programu
// powiększoną o wartość przerwy
while (czas < czasPoPrzerwie) // pętla wykonująca się dopóki
// warunek w nawiasie jest spełniony
{
czas = millis(); // aktualizacja wartości zmiennej na obecny czas
}
nacisniecie = false; // zmiana wartości zmiennej na "fałsz"
}
}
void zmianaStanu() // deklaracja funkcji
{
switch (ZALACZONY) // instrukcja wykonująca wybrany blok kodu
// w zależności od prawdziwości zmiennej "ZALACZONY"
{
case false: // kod do wykonania gdy zmienna "ZALACZONY" ma wartość "fałsz"
// powodujący włączenie przekaźnika
{
Serial.println("PRZEKAŹNIK ZAŁĄCZONY"); // instrukcje podobnie jak wyżej
// w funkcji "setup"
lcd.clear(); // wyczyszczenie zawartości wyświetlanej na LCD
lcd.setCursor(0, 0);
lcd.print("PRZEKA");
lcd.write(byte(0));
lcd.print("NIK ZA");
lcd.write(byte(1));
lcd.write(byte(2));
lcd.print("CZONY");
digitalWrite(PRZEKAZNIK, HIGH); // ustawienie sygnału elektrycznego na poziom wysoki
// na pinie odpowiadającym zmiennej "PRZEKAZNIK"
// co powoduje przepływ sygnału od pinu NO
}
break;
case true: // kod do wykonania gdy zmienna "ZALACZONY" ma wartość "prawda"
// powodujący wyłączenie przekaźnika
{
Serial.println("PRZEKAŹNIK WYŁĄCZONY");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PRZEKA");
lcd.write(byte(0));
lcd.print("NIK WY");
lcd.write(byte(1));
lcd.write(byte(2));
lcd.print("CZONY");
digitalWrite(PRZEKAZNIK, LOW); // ustawienie sygnału elektrycznego na poziom niski
// na pinie odpowiadającym zmiennej "PRZEKAZNIK"
// co powoduje przepływ sygnału od pinu NC
}
break;
}
ZALACZONY = !ZALACZONY; // odwrócenie wartości logicznej zmiennej
}
void nacisk() // deklaracja funkcji wywoływanej podczas przerwania
{
nacisniecie = true; // zmiana wartości zmiennej na "prawda"
}