Raspberry Pi – Wyświetlanie informacji na ekranie 16×02
Na pewno często zdarzyło się Wam, że chcieliście sprawdzić jakieś wartości w Raspberry. Mógł to być adres IP, data i godzina, wartości z czujników lub np. stany wybranych pinów. Trzeba było się wtedy do malinki zalogować i wydać odpowiednią komendę. Dzisiaj pokażę Wam w jaki sposób podłączyć do RPi ekran 16×2 z interfejsem I2C.
Podłączenie
Aby móc podłączyć taki wyświetlacz do malinki należy najpierw wyposażyć się w odpowiedni dwukierunkowy konwerter poziomów logicznych. Jeżeli już taki posiadamy należy przepuścić przez niego linie magistrali I2C, czyli SDA i SCL. Składamy układ według poniższego schematu:
Wykrywanie adresu
Zanim skomunikujemy nasze Raspberry z wyświetlaczem należy sprawdzić jaki jest jego adres I2C. W tym celu należy zaopatrzeć się w dodatkowe oprogramowanie i2c-tools.
Standardowo zaczynamy od zaktualizowania repozytoriów i paczek:
sudo apt-get update sudo apt-get upgrade
Następnie możemy zainstalować właściwy program:
sudo apt-get install i2c-tools
Kiedy już program pomyślnie się zainstaluje możemy wydać polecenie
sudo i2cdetect -y 1
które to powinno dać nam output podobny do tego:
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Jak widać po przeskanowaniu magistrali znaleziono jedno urządzenie o adresie 0x27. Jeżeli mamy ich więcej to należy wykonać 2 skany. Za pierwszym razem z podłączonym ekranem, a za drugim razem z odłączonym. Ten adres który zniknie to adres ekranu :)
Pigpio czyli kombajn do sterowania GPIO
Do komunikacji z wyświetlaczem użyjemy biblioteki pigpio, którą opisywałem już w artykule Raspberry Pi – Sterowanie jasnością diody na Raspberry, czyli PWM. Jeżeli nie macie jeszcze zainstalowanego tego pakietu możecie zainstalować go wg. instrukcji w artykule, który podlinkowałem lub wpisując w konsoli
sudo apt-get install pigpio
Zanim zaczniemy używać możliwości tej biblioteki należy uruchomić jej daemona:
sudo pigpiod
Jeżeli nie chcemy robić tego ręcznie przy każdym restarcie systemu można dodać tę komendę do programu crontab z dopiskiem @reboot
Skrypt w pythonie
Zanim zaczniemy sterować wyświetlaczem z poziomu pythona należy ściągnąć odpowiednią bibliotekę do sterowania wyświetlaczem LCD.
wget http://abyz.me.uk/rpi/pigpio/code/i2c_lcd_py.zip
Następnie należy ją rozpakować
unzip i2c_lcd_py.zip
i zainstalować
sudo python i2c_lcd.py install
Teraz możemy na wzór przykładu z pliku i2c_lcd.py zaimplementować własny skrypt do wyświetlania danych:
#!/usr/bin/env python import i2c_lcd import pigpio import os import time def lcd_display_info(header, content): lcd.put_line(0, str(header) + ":"); lcd.put_line(1, str(content)); pi = pigpio.pi() if not pi.connected: exit(0) lcd = i2c_lcd.lcd(pi) lcd.backlight(True) count = 0 ip_addr = os.popen("hostname -I").read().strip() try: while True: if count == 0: lcd_display_info("Adres IP", ip_addr) elif count == 1: lcd_display_info("Data i czas", os.popen("date +\"%d.%m.%Y %H:%M\"").read().strip()) count += 1 count %= 2 time.sleep(5) except KeyboardInterrupt: lcd.backlight(False) lcd.close() pi.stop()
Mamy tu zdefiniowaną metodę lcd_display_info(), która wymaga podania 2 parametrów: nagłówka oraz treści. Nagłówek będzie wyświetlany w pierwszej linijce, natomiast treść pod spodem. Następnie inicjujemy połączenie z ekranem i pobieramy adres ip malinki, który będziemy później wyświetlać na zmianę z datą i godziną.
Teraz wchodzimy w nieskończoną pętlę, która co 5 sekund zmieni nam wyświetlany obraz. Raz będzie to adres IP zapisany w zmiennej ip_addr, a raz aktualna data i godzina (poprzez odpytanie systemu funkcją os.popen()).
Możemy sobie ten plik zapisać np. pod nazwą lcd_info.py, a następnie uruchomić i sprawdzić działanie:
python lcd_info.py
Aby zakończyć działanie skryptu wysyłamy kombinację klawiszy Ctrl + C.
Usługa systemowa
Jeżeli chcemy, aby nasz program działał jako serwis w tle i uruchamiał się wraz ze startem systemu możemy wykonać analogiczne kroki jak w sekcji „Tworzymy serwis dla naszego skryptu” w artykule Raspberry Pi – przycisk zasilania dla malinki. Należy tylko pamiętać, że w folderze zawierającym plik ze skryptem pythona (u mnie /usr/local/bin/lcdinfo) musi istnieć plik i2c_lcd.pyc, który powstał przez wydanie polecenia sudo python i2c_lcd.py install).
Dodatkowo w momencie uruchamiania serwisu malinka może jeszcze nie mieć przydzielonego adresu IP, dlatego możemy przenieść kod os.popen("hostname -I").read().strip()
w miejsce zmiennej ip_addr w linijce lcd_display_info("Adres IP", ip_addr)
. Analogicznym sposobem jest utworzenie w miejscu linijki gdzie inicjujemy zmienną ip_addr pętli while, która będzie np. co 5 sekund pytała system o adres IP, dopóki nie uzyska niepustego ciągu.
Drugą metodę można zrealizować w następujący sposób:
W miejscu inicjalizacji zmiennej ip_addr wpisujemy taki kod:
ip_addr = os.popen("hostname -I").read().strip() while len(ip_addr) == 0: ip_addr = os.popen("hostname -I").read().strip() time.sleep(5)
Od teraz będziemy mieli pewność, że skrypt nie zacznie wyświetlać danych dopóki nie uzyska z systemu adresu IP :)