Raspberry PI mit LCDisplay
Da im Winter dann doch noch ein weiterer PI dazugekommen ist, diesmal die Nummer 4 und ich noch ein LCD Display mit i2c herum liegen hatte, habe ich mich auf die Suche gemacht, wie man das ansteuern kann. Prinzipiell sollte einfach nur die Temperatur angezeigt werden, da der Pi 4 wohl recht warm werden soll. Geht aber ...
Quellen
- HD44780 LCD Display per I2C mit dem Raspberry Pi ansteuern Tutorial, Hardware-Erklärungen und Software in python
- Creating a Linux service with systemd
- diverse Anfragen bei Ecosia oder anderen Datenkraken
Bauteile / Hardware
- Display mit i2c Kontroller
- Pegelwandler
- ein paar Kabel
- Gehäuse für den PI (drin der Pi, darauf das LCD, optional)
- Magnete, um das Display auf dem Gehäuse zu halten (optional).
- kleine Bodenplatte für das Display, mit 3d Printer erstellt
Aufbau der Hardware
Diese wird eigentlich recht gut unter dem Link oben erklärt, HDD44780 ansteuern. Der Aufbau ist nur deshalb lästig, weil der PI mit 3.3 V arbeitet, das LCD aber mit 5V. Daher auch der Pegelwandler, den ich noch herum liegen hatte. Ganz grob zur Elektronik:
- GPIO2 / SDA (Pin 3) mit SDA auf I2C über den Pegelwandler verbinden
- GPIO3 / SCL (Pin 5) mit SCL auf I2C über den Pegelwandler verbinden
- 3.3V, 5V, GND vom PI auf Pegelwandler
- 5V,GND vom PI auf I2C
Gehäse: Fehlt ... Ich habe eine kleine Bodenplatte mit vier Löchern für versenkte Schrauben und 2 Löchern für die Magnete gedruckt. Anschließend vorsichtig 2 Löcher für die Magnete im PI-Gehäuse gebohrt, hmm, habe ich natürlich nicht gerade hin bekommen, ist aber ein wenig egal. Klebt man die Magnete richtig herum herein, dann hät die Bodenplatte am Gehäse des Pi. Die Platine des LCD wird mit kleinen Abstandshaltern (? – die Teile um Platinen zu "stapeln") an der Bodenplatte befestigt.
Software, erste Konfiguration
Das Einbinden der i2c Schnittstelle weicht beim Pi 4 etwas von dem Vorgehen im erwähnten HD44780 Tutorial ab.
In Kurzform:
- sudo apt-get install python-smbus i2c-tools – war bei mir vorhanden
- in /etc/modules (z.B. mit sudo nano editieren) den Eintrag i2c-bcm2708 dazu, i2c-dev war vorhanden. Ich habe nur diese beiden Zeilen in der modules stehen
- in /boot/config.txt die Zeile dtparam=i2c_arm=on einfügen / den Hashtag entfernen (Auskommentierung herausnehmen)
- reboot
Anschließend bin ich wieder wie im Tutorial beschrieben vorgegangen. Also
sudo i2cdetect -y 1
und ich hatte ebenfalls die 27 als Adresse, die ist in der nachfolgenden Bibliothek eingetragen.
Das Laden des Source-Codes (wie im Tutorial):
mkdir hd44780 && cd hd44780 wget http://tutorials-raspberrypi.de/wp-content/uploads/scripts/hd44780_i2c.zip unzip hd44780_i2c.zip
Erster Test, wie im Tutorial, einfach in python3 IDE auf dem PI oder auf der console von Python3 zu testen:
import lcddriver lcd = lcddriver.lcd() lcd.lcd_clear() lcd.lcd_display_string("Tag auch", 1)
Nach dem Test - ein sinnvolles(?) Programm
Das Programm zeigt auf dem Display die IP-Adresse(n), die Temperatur und die Uhrzeit des Raspberry an. Dann legt es sich eine Zeit schlafen (10 Sekunden). Wird es unterbrochen, so wird ebenfalls eine Meldung angezeigt.
Der Quellcode ist aus Bequemlichkeit dann ebenfalls in Python gestrickt.
import lcddriver import time from datetime import datetime import socket import fcntl import struct import sys, os import signal lcd = lcddriver.lcd() def get_ip_address(ifname): # result = "%s is not set" % ifname result = "not set" try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) result=socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', bytes(ifname[:15],'utf-8')) )[20:24]) except Exception: pass return result def handler_stop_signals(signum, frame): #we are killed global lcd lcd.lcd_clear() lcd.lcd_display_string("I am ",1) lcd.lcd_display_string(" ...killed :-(",2) exit(0) def displayInfoToLCD(): """ Show information temp ip(s) time on 2 line lcd display """ global lcd signal.signal(signal.SIGINT, handler_stop_signals) signal.signal(signal.SIGTERM, handler_stop_signals) while True: #get lcd driver and clear #see https://tutorials-raspberrypi.de/hd44780-lcd-display-per-i2c-mit-dem-raspberry-pi-ansteuern/ # while 1: # time.sleep(10) # read the values wl = get_ip_address('wlan0') eth = get_ip_address('eth0') temp = os.popen("vcgencmd measure_temp").readline() temp = (temp.replace("temp=","").replace("'C\n","")) times = datetime.now().strftime('%H:%M:%S') emptyField = -1 sleeping=10 if wl == "not set": wl = "wlan0 not set" emptyField = 0 if eth == "not set": eth = "eth0 not set" if emptyField ==0: wl="no network" eth="no network" sleeping=2 #no network normally on start up emptyField = 1 lcd.lcd_clear() if emptyField >= 0: #can show temperature directly field = (emptyField+1)%2 lcd.lcd_display_string("T:%s %s" %(temp ,times),emptyField+1) ip = wl if (emptyField == 1) else eth lcd.lcd_display_string(ip,field+1) time.sleep(sleeping) else: lcd.lcd_display_string("T: %s Celsius"%temp,1) lcd.lcd_display_string("Time: %s"%times,2) time.sleep(sleeping/2) lcd.lcd_clear() lcd.lcd_display_string(wl,1) lcd.lcd_display_string(eth,2) time.sleep(sleeping/2) displayInfoToLCD() # should sleep some seconds
und zuletzt als Service und ein paar Bilder
Ich hatte schon begonnen meine Kenntnisse zu fork zu reaktivieren, als mir auffiel, das ich ja einfach einen Service des Pi nutzen kann. Unter systemd sind nicht mal lästige start und stop-scripte zu schreiben. Zu tun:
- Service schreiben s.u. und unter /home/pi/hd44780/lcdinfo.service speichern
- verlinken
sudo ln -s /home/pi/hd44780/lcdinfo.service /etc/systemd/system/lcdinfo.service
- testen, "enablen" und auch nach dem reboot kommen die Infos, siehe Fotos.
hideauf der Console des Pi pi@raspberrypi:~ $ systemctl start lcdinfo pi@raspberrypi:~ $ systemctl status lcdinfo pi@raspberrypi:~ $ systemctl stop lcdinfo pi@raspberrypi:~ $ systemctl status lcdinfo pi@raspberrypi:~ $ systemctl enable lcdinfo pi@raspberrypi:~ $ reboot
die Service Datei: construct object
[Unit] Description=Information ip / temp / time to lcd Before=network-pre.target Wants=network-pre.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=pi ExecStart=/usr/bin/env python3 /home/pi/hd44780/displayInfo.py [Install] WantedBy=multi-user.target
und ein paar Bilder im Betrieb