[044] Wyświetlacz HD44780 I2C i pomiar napięć

[044] Wyświetlacz HD44780 I2C i pomiar napięć

O wyświetlaczu HD44780 pisałem już nieraz, także o fakcie, iż można go podłączać za pomocą interfejsu równoległego, angażującego osiem bitów – czego już od wieków się nie robi i przy pomocy czterech bitów – co uprawia się najczęściej. Od jakiegoś czasu bardzo często do kontaktów z wyświetlaczem używamy magistrali I2C, która w sumie potrzebuje tylko dwóch linii i pisałem już kiedyś o niej – współpracowała wówczas z siedmiosegmentowym wyświetlaczem LED.


Zacznijmy o tego, że tylko niektóre wyświetlacze kompatybilne z HD44780 mają ten interfejs zintegrowany, w większości przypadków po prostu podłącza się ekspander pod wejścia starego standardu, a cały proces tłumaczenia języka szeregowego na równoległy spoczywa na barkach biblioteki. Ważne jest to, że angażując tylko dwie linie magistrali, która i tak zwykle obsługuje coś jeszcze, mamy praktycznie „przezroczysty” dostęp do wyświetlacza, jak gdyby był on podłączony klasycznie.

Na płytce testowej TME-EDU-ARD-2 tak właśnie uczyniono: klasyczny wyświetlacz został połączony z ekspanderem MCP23008. Wymaga to jedynie małych przekształceń w definicjach, a potem już pracuje się zwyczajnie, jak w wyświetlaczami łączonymi równolegle. Zrzućmy zatem okiem na przykładowy szkic.

#include <Wire.h>                                                      // Biblioteka obsługująca magistralę I2C
#include <hd44780.h>                                                   // Biblioteka obsługująca wyświetlacze 44780
#include <hd44780ioClass/hd44780_I2Cexp.h>                             // Dodatek obsługujący wyświetlacze podłączone do ekspandera I2C
hd44780_I2Cexp lcd(0x20, I2Cexp_MCP23008, 7, 6, 5, 4, 3, 2, 1, HIGH);  // Konfiguracja połączeń wyświetlacza LCD

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

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

void loop() {
  lcd.setCursor(0, 0);                // Ustaw kursor na początku wyświetlacza.
  napiecie = analogRead(woltomierz);  // Pobierz wartość napięcia z portu woltomierza.
  lcd.print(napiecie);                // Wyświetl ją.
  lcd.print(F("    "));               // Wyświetl cztery spacje.
}

Będą nam potrzebne trzy biblioteki widoczne w trzech pierwszych wierszach. Pierwsza obsługuje magistralę, druga – wyświetlacze pracujące w standardzie HD44780, trzecia zaś uzupełnia wcześniejszą o elementy pośredniczące między magistralą I2C, a równoległą, kompatybilną z wyświetlaczem. Konieczny będzie jeszcze wpis z czwartego wiersza: informuje on o adresie ekspandera, jego typie i połączeniu z wyświetlaczem. W przypadku rozwiązania znajdującego się na płytce testowej takie wartości będą prawidłowe. No i na koniec jeszcze należy z­adeklarować rozmiary wyświetlacza, czyli w tym przypadku szesnaście kolumn w dwóch wierszach, co czyni się instrukcją lcd.begin(16, 2)

Na początek zmierzmy sobie napięcie na wejściu przetwornika analogowo-cyfrowego i wyświetlmy wartość zmierzoną. Na płytce pod port A1 podłączono ślizgacz potencjometru podłączonego z jednej strony do masy, czyli potencjału zerowego, z drugiej – do zasilania, czyli pięciu woltów. Skorzystamy z tego dobra, nazywając ów port woltomierz. Będzie nam potrzebna także zmienna do przechowywania zmierzonej wartości i tę nazwiemy napiecie. W pętli głównej zaczniemy od ustawienia kursora na początku wyświetlacza lcd.setCursor(0, 0) po czym zmierzymy napięcie napiecie = analogRead(woltomierz) Teraz już poleceniem lcd.print(napiecie) wyślemy zmierzoną wartość na wyświetlacz, po czym wyślemy tam jeszcze cztery spacje. Po co? Otóż sczytana liczba może mieć od jednej do czterech cyfr. Gdy zmieni się z większej na mniejszą w ten sposób, że ulegnie skróceniu o znak, dwa lub trzy, na prawo od niej pozostaną już nic nie znaczące cyferki – śmieci. Dlatego też kolejna instrukcja wstawia tam spacje, za każdym razem czyszcząc te pola. Dlaczego cztery, a nie trzy? O tym za jakiś czas.

Po skompilowaniu programu oczywiście wszystko zadziała, ale – choć to użyteczne, będzie strasznie banalne. Zanim zrobimy coś ambitniejszego, najpierw mała zmiana: dopiszmy kolejne trzy linie, bliźniacze, ale z jedną zmianą: tym razem po zmiennej napiecie wstawimy parametr HEX.

lcd.setCursor(6, 0);       // Ustaw kursor na pzycji szóstej.
lcd.print(napiecie, HEX);  // Wyświetl zmierzoną wartość w formacie HEX
lcd.print(F("   "));       // Wyświetl trzy spacje.

Sprawia on, że liczby nie będą już drukowane w systemie dziesiętnym DEC (nie jest wymagany), a szesnastkowym. Programistom czasem przydaje się taka możliwość i skorzystamy z niej tutaj. Dodam jeszcze, że możemy użyć znacznika BIN i otrzymamy wartości binarne. Mamy jeszcze tryb ósemkowy OCT, ale konia z rzędem temu, komu się taki przyda.

#include <Wire.h>                                                      // Biblioteka obsługująca magistralę I2C
#include <hd44780.h>                                                   // Biblioteka obsługująca wyświetlacze 44780
#include <hd44780ioClass/hd44780_I2Cexp.h>                             // Dodatek obsługujący wyświetlacze podłączone do ekspandera I2C
hd44780_I2Cexp lcd(0x20, I2Cexp_MCP23008, 7, 6, 5, 4, 3, 2, 1, HIGH);  // Konfiguracja połączeń wyświetlacza LCD

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

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

void loop() {
  lcd.setCursor(0, 0);                // Ustaw kursor na początku wyświetlacza.
  napiecie = analogRead(woltomierz);  // Pobierz wartość napięcia z portu woltomierza.
  lcd.print(napiecie);                // Wyświetl ją.
  lcd.print(F("    "));               // Wyświetl cztery spacje.

  lcd.setCursor(6, 0);       // Ustaw kursor na pzycji szóstej.
  lcd.print(napiecie, HEX);  // Wyświetl zmierzoną wartość w formacie HEX
  lcd.print(F("   "));       // Wyświetl trzy spacje.

  lcd.setCursor(11, 0);                   // Ustaw kursor na pzycji jedenastej.
  napiecieV = napiecie * (5.0 / 1024.0);  // Przelicz dziesięciobitową wartość na wolty.
  lcd.print(napiecieV, 3);                // Wyświetl napięcie z dokładnością do trzech cyfr po przecinku.
}

Zrobimy teraz prawdziwy woltomierz. W tym celu zadeklarujemy kolejną zmienną o nazwie napiecieV. Będzie ona miała postać zmiennoprzecinkową, ponieważ tym razem będziemy chcieli poznać napięcie w prawdziwych woltach, a nie nic nam nie mówiących jednostkach. Robi się to w sposób prosty: wystarczy 5 – bo takie maksymalne napięcie może mierzyć wejście przetwornika – podzielić przez 1024 – bo taką rozdzielczość ma przetwornik. Liczby te zamieściłem w dziwnym formacie, z kropką i zerem napiecieV = napiecie * (5.0 / 1024.0) ale tak trzeba w przypadku typu zmiennoprzecinkowego. I jeszcze jedna rzecz: dodatkowa trójka w instrukcji lcd.print(napiecieV, 3) Stanowi ona o wyświetleniu trzech miejsc po przecinku. Brak cyfry domyślnie wyświetla dwa miejsca.

Jak już kiedyś mówiłem, dokładność takiego woltomierza jest niezbyt duża, ale zajmiemy się tym kiedy indziej. W kolejnym artykule uzupełnimy nasz woltomierz o tajemniczy bargraf.

Powiązane tematy

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