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 :)