Home sweet home
Nav
hide
S1
S2
S3

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

Bauteile / Hardware

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:

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.

Das folgende Bild zeigt den oben beschriebenen Aufbau, die geklebte Mini-Platine ist der Pegelwandler.
Hardware

Software, erste Konfiguration

Das Einbinden der i2c Schnittstelle weicht beim Pi 4 etwas von dem Vorgehen im erwähnten HD44780 Tutorial ab.

In Kurzform:

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

hide
get source
mkdir hd44780 && cd hd44780
wget http://tutorials-raspberrypi.de/wp-content/uploads/scripts/hd44780_i2c.zip
unzip hd44780_i2c.zip
Parsed using GeSHi 1.0.8.6

Erster Test, wie im Tutorial, einfach in python3 IDE auf dem PI oder auf der console von Python3 zu testen:

hide
simple test
import lcddriver
lcd = lcddriver.lcd()
lcd.lcd_clear()
lcd.lcd_display_string("Tag auch", 1)
Parsed using GeSHi 1.0.8.6
Das hat fast geklappt, nur war der Kontrast des LCD ganz herunter geregelt, so dass nichts zu sehen war. Damit ist dann auch klar, wozu das kleine blaue Einstellteil unter dem Display ist.

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.

hide
raspiLCD/displayInfo.py
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
 
Parsed using GeSHi 1.0.8.6
Download / View Source / Run it   (depends on file type)

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:

die Service Datei:

hide
raspiLCD/lcdinfo.service
[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
Parsed using GeSHi 1.0.8.6
Download / View Source / Run it   (depends on file type)

und ein paar Bilder im Betrieb

in Betrieb

Karsten Römke (k Ponkt roemke at gmx in de), Rechtliches, Datenschutz, etc.
Rein private Seite, lediglich eine Spielerei
Last modified: –
Created: 2020-01-25
Reason: Spielerei
Home sweet home