RPi4 mit LCD 2004 und zwei DHT22

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
KlausKeller
User
Beiträge: 3
Registriert: Mittwoch 20. September 2023, 08:44

Hallo Community,
ich bin zumindest was Python angeht noch relativ neu.
Ich versuche gerade mir auf einem 20x4 LCD einige
Informationen anzeigen zu lassen.

Zeile 1 & 3: ein definierter Text
Zeile 2: links das aktuelle Datum, rechts die Temperatur vom RPi
Zeile 4: die Temperaturen von zwei DHT22-Sensoren

Im Moment bekomme ich keine Anzeige zustande.
Das Display flackert nur alle paar Sekunden auf.

Richtig angeschlossen ist es wohl, da ein anderer Scipt funktioniert.

Mein Code:

Code: Alles auswählen

import Adafruit_CharLCD as LCD
import Adafruit_DHT
import subprocess
from datetime import datetime
import time

#LCD-Display
lcd = LCD.Adafruit_CharLCDPlate(0x27)

#LCD
LCD_WIDTH = 20
LCD_LINES = 4

#Zeilen 1 & 3
line1_text = "-- xxxxxXXXXXX --"
line3_text = "..Temp_IN---Temp_OUT.."

#Ermittlung der Raspberry Pi-Temperatur
def get_raspberry_pi_temperature():
    temperature = subprocess.check_output(['vcgencmd', 'measure_temp']).decode('utf-8')
    return temperature.split('=')[1]

#DHT22-Temperatur
def get_dht22_temperature(pin):
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, pin)
    if temperature is not None and temperature >0 and temperature < 100:
        return f"{temperature:.1f}°C"
    else:
        return "N/A"

try:
    while True:
        #Aktuelles Datum und Uhrzeit
        current_datetime = datetime.now().strftime("%d.%b.%y")
        
        #Raspberry Pi-Temperatur
        raspberry_pi_temp = get_raspberry_pi_temperature()
        
        #DHT22-Temperaturen
        dht22_temp_pin22 = get_dht22_temperature(22)
        dht22_temp_pin27 = get_dht22_temperature(27)
        time.sleep(2)
		
        #LCD Anzeigen
        lcd.clear()
        lcd.message(line1_text.center(LCD_WIDTH) + "\n")
        lcd.message(f"{current_datetime}".ljust(LCD_WIDTH - len(raspberry_pi_temp)) + f"{raspberry_pi_temp}\n")
        lcd.message(line3_text.center(LCD_WIDTH) + "\n")
        lcd.message(f"Temp_IN: {dht22_temp_pin22} Temp_OUT: {dht22_temp_pin27}".ljust(LCD_WIDTH) + "\n")
        
        time.sleep(3)  # Aktualisieren alle 5 Sekunden
        
except KeyboardInterrupt:
    pass

finally:
    lcd.clear()
Ich stehe gerade auf dem Schlauch und komme einfach nicht weiter.
Vielleicht ist hier jemand so nett und findet die Zeit hier einmal drüber zu schauen?

Gruß
Klaus
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kennst f-Strings, fängst aber dann doch mit +-Gestückel und ljust an? Warum?

Da das Lesen der Temperatur auch Zeit in Anspruch nimmt, passt das 5s-Intervall nicht wirklich, das ist immer langsamer. Da muß die Schlafenszeit korrigiert werden.

Code: Alles auswählen

    while True:
        #Aktuelles Datum und Uhrzeit
        current_datetime = datetime.now()
        
        #Raspberry Pi-Temperatur
        raspberry_pi_temp = get_raspberry_pi_temperature()
        
        #DHT22-Temperaturen
        dht22_temp_pin22 = get_dht22_temperature(22)
        dht22_temp_pin27 = get_dht22_temperature(27)
		
        #LCD Anzeigen
        lcd.clear()
        lcd.message(
            f"{line1_text:^{LCD_WIDTH}s}\n"
            f"{current_datetime:%d. %b %Y}{raspberry_pi_temp:>{LCD_WIDTH - 12}s}\n"
            f"{line3_text:^{LCD_WIDTH}s}\n"
            f"Temp_IN: {dht22_temp_pin22} Temp_OUT: {dht22_temp_pin27}"
        )
        time.sleep(-(time.time()%-5))  # Aktualisieren alle 5 Sekunden
KlausKeller
User
Beiträge: 3
Registriert: Mittwoch 20. September 2023, 08:44

Hallo Sirius3,

vielen Dank für die schnelle Antwort. Wie gesagt bin ich Anfänger was Python angeht.
Ich gebe dir recht, das dein Code ästhetischer aussieht und vielleicht auch besser funktioniert,
aber an sich müsste mein Code doch dann auch zumindest funktionieren, oder?

Gruß
Klaus
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausKeller: Theoretisch vielleicht, das kommt darauf an wie sich das Display verhält a) wenn eine Zeile komplett mit Zeichen beschrieben wird, und b) wenn ein Zeilenvorschub ausgegeben wird.

Und man muss vielleicht noch kontrollieren oder sicherstellen das pro Zeile nicht mehr als 20 Zeichen geschrieben werden. `center()`, `ljust()` & Co machen Zeichenketten nur länger, aber niemals kürzer.

Weiterer Punkt den man immer im Auge behalten soll: Welche Zeichen kann das und wie verhält es sich wenn was ausserhalb der Anzeigemöglichkeiten verwendet wird. Zum Beispiel was passiert mit ° das ja ausserhalb von ASCII liegt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
KlausKeller
User
Beiträge: 3
Registriert: Mittwoch 20. September 2023, 08:44

@grubenfox ist diese also besser geeignet?

https://github.com/adafruit/Adafruit_Ci ... on_CharLCD

EDIT: Ich sehe gerade, das betrifft dann wohl auch das DHT Modul...

https://github.com/adafruit/Adafruit_CircuitPython_DHT
Das ist dann das aktuellste?
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

sieht jedenfalls aktueller und (besser) dokumentiert aus als das Adafruit_CharLCD-Teil
Antworten