[007] Wyświetlacz alfanumeryczny - nieco praktyczniej

[007] Wyświetlacz alfanumeryczny - nieco praktyczniej

Skoro już wiemy jak wyświetlać napisy, zróbmy coś takiego, żeby komputer nie wstydził się, że go do tego zaangażowano. Wykorzystamy tutaj schemat, na którym bazowaliśmy w poprzednich artykułach, ale uzupełnimy go dodatkowymi obwodami, oznaczonymi kolorem czarnym.


Jak więc widać, do wejść 8, 9 i 10 będziemy podłączać masę. Podczas doświadczeń możemy użyć kawałka przewodu, którym będziemy łączyć wymienione wejścia choćby z widoczną metalową obudową gniazdka USB. W rozwiązaniach użytecznych warto tam wstawić przełączniki.

Tym razem postąpię inaczej: najpierw ujrzymy cały szkic, a następnie będę omawiał jego fragmenty. Myślę, że tak będzie czytelniej. Zatem cały program wygląda teraz tak.

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
  lcd.begin(16, 2);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
}
void loop() {
  if (digitalRead(8) == LOW) {
    lcd.home();
    lcd.print("    Zajete!     ");
  }
  if (digitalRead(9) == LOW) {
    lcd.home();
    lcd.print(" Jeszcze moment ");
  }
  if (digitalRead(10) == LOW) {
    lcd.home();
    lcd.print("Ciezka sprawa...");
  }
  if (digitalRead(8) == HIGH && digitalRead(9) == HIGH && digitalRead(10) == HIGH) {
    lcd.home();
    lcd.print("    Wolne :)    ");
  }
}

Uczymy się dalej. Oto trzy bliźniacze rozkazy zaczynające się od słów pinMode.

pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);

Ważna uwaga – nie można zamienić sobie liter na duże albo małe, musi być tak.

Jak wspominałem, tak zwane piny lub też porty (sprawa nazewnictwa jest dyskusyjna). których w Arduino Uno lub Nano są 22, mogą pełnić bardzo różne funkcje. Mogą być wyjściami, wejściami, mierzyć napięcia, wysyłać przebiegi, mogą też sterować różnymi magistralami. Rozkaz pinMode określa zadania tym pinom. W nawiasie podajemy ich numer i to, czym mają się zajmować – osobno dla każdego. Piny mają numery od zera do 13 oraz od A0 do A7. Drugi argument (INPUT_PULLUP) znaczy, że pin będzie wejściem podciągniętym do stanu wysokiego. Wejście oznacza, że ten pin będzie nadsłuchiwany i czytany przez mikroprocesor, a wymuszony stan wysoki rozumieć należy w ten sposób, że jeśli nic tam nie podłączymy, odczyt zwróci informację, że jest tam stan wysoki, inaczej: 5 woltów. Żeby ta informacja była inna, należy do tego portu przyłączyć zero woltów, czyli zewrzeć go do masy. Kiedyś poznamy inne funkcje pinów.

Zdefiniowaliśmy sobie zatem trzy wejściowe porty, zaraz za naszą szóstką obsługującą wyświetlacz, będące tak naprawdę portami klawiatury. Zróbmy z tego użytek, a także z obszaru, który stanowi część programu pracującą bez końca w pętli. Woda wiedzy będzie teraz trochę głębsza, lecz nie powinniśmy się utopić.

if (digitalRead(8) == LOW) {
  lcd.home();
  lcd.print("    Zajete!     ");
}

If to jeden z podstawowych rozkazów, który zajmuje się podejmowaniem decyzji. W nawiasie okrągłym znajduje się warunek, a w wąsatym – czynności, które należy spełnić jeśli warunek zachodzi. W tym wypadku będziemy sprawdzać, czy port ósmy ma niski stan, a sprawdzaniem portów zajmuje się funkcja digitalRead. Jak wspominałem, jeśli nic się tam nie podłączy, będzie tam stan wysoki, więc warunek nie zajdzie i nic się nie stanie. Gdy stan będzie niski, wykonają się rozkazy w nawiasie klamrowym.

Stan niski to LOW, stan wyskoki – HIGH. Sprawdzanie czy coś jest równe czemuś realizuje się dwoma znakami równości. W nawiasie klamrowym, choć wolę – wąsatym, mamy dwa rozkazy. Drugi już znamy, to wyświetlanie napisu. Pierwszy rozkazuje ustawić kursor na początku ekranu.

if (digitalRead(8) == HIGH) {
  lcd.home();
  lcd.print("    Wolne :)    ");
}

Dodajmy teraz bliźniaczy blok rozkazów, lecz zmieńmy warunek stanu niskiego na wysoki. Zatem tamten blok wykona się, gdy stan portu ósmego będzie niski, a ten – gdy wysoki. A co to znaczy w praktyce? Skompilujmy program. Na wyświetlaczu pojawił się taki napis:

To oczywiste: program napotkał warunek pierwszy, który nie zachodzi, bo port ósmy ma stan wysoki, więc nie pojawia się napis „Zajete!”. Natomiast drugi warunek zachodzi bez przerwy, zatem bez przerwy wyświetla się napis „Wolne :)” Bierzemy teraz kawałek przewodu i łączymy ósmy port z masą. Co się dziej?

No, wreszcie jakaś zmiana. Gdy wejście zwieramy do masy, zachodzi warunek pierwszego członu programu, a gdy pozostawiamy wolnym – drugiego. Na koniec rozbudujmy nasz program odrobinę. Dodamy jeszcze dwa bliźniacze bloki, które będą analizować stany portów 9 i 10.

if (digitalRead(9) == LOW) {
  lcd.home();
  lcd.print(" Jeszcze moment ");
}
if (digitalRead(10) == LOW) {
  lcd.home();
  lcd.print("Ciezka sprawa...");
}

Gdy zewrzemy teraz do masy porty 9 lub 10, pojawią nam się stosowne napisy.

Skomplikował się ostatni blok.

if (digitalRead(8) == HIGH && digitalRead(9) == HIGH && digitalRead(10) == HIGH) {
  lcd.home();
  lcd.print("    Wolne :)    ");
}

Musi on analizować już trzy porty naraz. Warunek jest spełniony, gdy wszystkie jednocześnie będą mieć poziom wysoki, czyli gdy zajdzie tu koniunkcja. Do tego celu używa się operatora złożonego z dwóch znaków et albo jak już wszyscy obecnie mówią: and i znak ten łączy warunki w ten sposób, że spełnione muszą być wszystkie naraz.

I w ten sposób każdy może stać się posiadaczem WC Komputera ;) Czyli urządzenia wskazującego… hm, prognozy dostępności zajętego przybytku. Oczywiście to jest tylko żart, którego głównym celem jest ukazanie jak za pomocą klawiatury można zmieniać napisy na wyświetlaczu, ale jeśli ktoś chciałby takie urządzenie zbudować serio, nie ma problemu – musi tylko zainstalować przełącznik zwierający porty do masy.

Dodam tylko, że szkic ten, choć nie ma błędów, napisany jest bardzo niepoprawnie i niezgodnie ze sztuką optymalizacji. Ale o tym napiszę w następnych artykułach.

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl