Seite 1 von 1

RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 12:14
von KlausKeller
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

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 12:59
von Sirius3
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

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 13:40
von KlausKeller
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

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 13:49
von __blackjack__
@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.

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 14:24
von grubenfox
und man sollte, so mein Eindruck, keine tote alte Lib benutzen: https://github.com/adafruit/Adafruit_Py ... CD/#readme

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 14:35
von KlausKeller
@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?

Re: RPi4 mit LCD 2004 und zwei DHT22

Verfasst: Mittwoch 20. September 2023, 15:08
von grubenfox
sieht jedenfalls aktueller und (besser) dokumentiert aus als das Adafruit_CharLCD-Teil