L2C Display Friert ab und zu ein

GIGU

Lieutenant
Registriert
Juli 2005
Beiträge
758
Guten Tag
Ich habe einige Jahre ein Raspi 2 in Betrieb. verbaut in einer Elektriker Abzweigdose mit Temperaturfühler, Kamera und kleinem Webserver wo das Ganze angezeigt wird. In der Dose habe ich noch ein L2C Display verbaut um vor Ort die Aussentemperatur zu sehen.
Letzten Herbst habe ich nach Jahre langem Dauerbetrieb den Raspi 2 ausgewechselt weil er Probleme machte (wieder ein Raspi 2) und gleichzeitig ein Update von RaspiOS 10.X auf (Debian) 11.X gemacht.
Seither friert mein Display in zufälligen Abständen ein. Das heisst, die Temperatur und Uhr bleibt einfach stehen. Manchmal nach Stunden, manchmal erst nach Wochen. Nach einem Neustart läuft es dann wieder weiter.
Auf dem Webserver wird alles richtig angezeigt. Es geht nur um das Display.

Ich bin kein Informatiker ich habe das damals alles nach Anleitungen zusammengestellt :)
Von V 10.X auf 11.X musste ich damals eine kleine Anpassung machen damit es überhaupt funktionierte. Ich glaube es war in der zweitletzten Spalte mit chr etwas.
Meine Frage: Ist der Code ok? Ich habe in den letzten Monaten immer wieder versucht etwas heraus zu finden. Oder könnte es sein, dass das Display beim wechseln vom PI auch einen Schaden abbekommen hat?

Danke für die Hilfe :)

Code:
import os
import glob
import time
import I2C_LCD_driver

mylcd = I2C_LCD_driver.lcd()

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')


base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-00000833bb04')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines

#CELSIUS CALCULATION
def read_temp_c():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = int(temp_string) / 1000.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT'S AN INTEGER TO DO THE MATH
temp_c = str(round(temp_c, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING
return temp_c

#FAHRENHEIT CALCULATION
def read_temp_f():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_f = (int(temp_string) / 1000.0) * 9.0 / 5.0 + 32.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT'S AN INTEGER TO DO THE MATH
temp_f = str(round(temp_f, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING
return temp_f

while True:

mylcd.lcd_display_string("Temp: " + read_temp_c() + chr(223) + "C", 1)
mylcd.lcd_display_string("Zeit: %s" %time.strftime("%H:%M:%S"), 2)
 

Anhänge

  • photo_2023-04-07_11-23-04.jpg
    photo_2023-04-07_11-23-04.jpg
    105,1 KB · Aufrufe: 190
Vielleicht mal die SD-Karte wechseln, und ist das das originale Raspi-Netzteil?
Vielleicht baust eine UPS mit ein.
https://www.berrybase.de/en/ups-uninterruptible-power-supply-hat-fuer-raspberry-pi

Was noch sein könnte, der Raspi hat ja 3,3V I/O Spannung, das LCD Modul und Sensoren vielleicht 5V.
Hier solltest dazwischen in den Datenleitungen einen Pegelkonverter einbauen, sonst läuft das instabil.
https://www.berrybase.de/en/sparkfun-pegeluebersetzer-breakout-pca9306
oder https://www.az-delivery.de/products/logiklevel-wandler-3-3v-5v

Wenn das nichts hilft, könnte man das Programm umschreiben, dass sich das Display nach jeder Ausgabe neu-initialisiert. Das hilft, wenn das Display selbst sich aufgehängt hat.
mylcd.init()

Schau dir dazu auch mal die Kernel Fehlermeldungen dmesg an, vielleicht sieht man da, wo die Kommunikation gescheitert ist.
 
Zuletzt bearbeitet:
L2C gibt es nicht.

Die Module sollen in der Regel nur mit 3.3V betrieben werden. Bei den Makerspace-Abzock-Displays würde ich mich da nicht auf das vom Verkäufer rumkopierte Datenblatt verlassen, sondern mir dazu auch die Platine angucken.

Ich kann keinen Codefehler ausschließen, was ich aber sagen kann, ist, dass die ganzen Pfuscher-HowTos keine Pullups für I2C benutzen, was schlichtweg Pfusch ist. Da würde ich ansetzen und schauen ob die Platine nicht vielleicht schon welche hat.

Duponts und kalte Lötstellen sind auch der Feind jeder Schaltung.
 
Zurück
Oben