Fehler beim Auslesen von 2 I2C-Sensoren

OP #7764616
Lesenswert?

Hallo zusammen, leider schaffe ich es nicht, die Daten von 2 Temperatur-Sensoren mit dem Raspberrry Pico W per micropython auszulesen.

Beide Sensoren haben unterschiedliche Adressen (0x48 und 0x4f), siehe beigefügtes Bild des Scan-Programms.

Die Sensoren sollen mit folgendem Programm ausgelesen werden:

1
# wlan_lcd_1lm75a.py auf Basis ChatGPT
2
# i2c und SoftI2C
3
#
4
import myWLAN
5
import time
6
from machine import SoftI2C, I2C, Pin
7
from machine_i2c_lcd import I2cLcd
8

9
# define WLAN
10
wlan = myWLAN.myWLAN()
11
wlan.wlanConnect()
12
ip = wlan.get_ip()
13

14
#define I2C1 bus
15
ROWS = 2
16
COLS = 16
17
lcd_address = 0x27
18
i2c1 = I2C(1, sda=Pin(2), scl=Pin(3), freq=100000) # lcd
19
lcd = I2cLcd(i2c1, lcd_address, ROWS, COLS)
20

21
# Define I2C0 bus using SoftI2C
22
i2c0 = SoftI2C(sda=Pin(0), scl=Pin(1), freq=100000)
23

24
# Define sensor addresses
25
sensor_v_address = 0x48
26
sensor_r_address = 0x4f
27

28
#Blank screen
29
lcd.clear()
30

31
def read_temp(sensor_address):
32
    time.sleep_ms(500)
33
    data = i2c0.readfrom(sensor_address, 2)   
34
    t = (data[0] << 3 | data[1] >> 5) * 0.125
35
    return t
36

37
while True:
38
    try:
39
        lcd.clear()
40
        lcd.move_to(0,0)
41
        string_out = "RPi Pico W"
42
        lcd.putstr(string_out)
43
        lcd.move_to(0,1)
44
        t_v = read_temp(sensor_v_address)
45
        t_r = read_temp(sensor_r_address)
46
        tempc = "V: {0:3.1f} / R: {0:3.1f}".format(t_v,t_r)
47
#         tempc = "V: {0:3.1f} ".format(t_v)
48
        print(tempc)
49
        lcd.putstr(tempc)
50
        time.sleep(5)
51
        
52
    except KeyboardInterrupt:
53
        lcd.clear()
54
        machine.reset()

Das Programm läuft und offenbar werden beide Sensoren auch einmal abgefragt, obwohl es eigentlich nicht sein kann, dass beide Sensoren einen identischen Wert anzeigen. Einer ist am Heizungsvorlauf, der andere ist am Heizungsrücklauf.

Jeder Sensor für sich alleine läuft super stundenlang ohne Probleme, beide zusammen führen zum Fehler: OSError: [errno 19] ENODEV

Wieso erkennt das Problem den 2. Sensor nicht?

Hat irgend jemand eine Idee?

Vielen Dank für die Unterstützung.

Viele Grüße, Rainer

Angehängte Dateien:
#7764658
Lesenswert?

i2c0.readfrom()

läuft vermutlich in seinen Timeout, die rückgabewerte werden nicht auf plasibilität geprüft, somit steht noch das alte ergebnis im puffer.

Viele magische Zahlen und auch die Wartezeit vor dem Lesevorgang scheinen ungeschickte Programmiertechniken zu sein und erschweren Verständnis und wartbarkeit.

#7764871
Lesenswert?

Woher wissen die Temperatur-Sensoren, dass sie Daten senden sollen, da wird doch meist erst mal ein Start-Signal gesendet. Bei meinem SHT41 sieht das so aus

1
def SHT41_read():
2
    i2c.writeto(adr1, b'\xfd')          # starte Sensor: Daten senden
3
    time.sleep(0.01)
4
    r1 = i2c.readfrom(adr1, 6)          # lese Resultat 6 bytes
5
    .....
#7765039
Lesenswert?

Das was ich hier als erstes vermisse, ist ein Fehlerbehandlung. Es wird davon ausgegangen, dass die Sensoren auch antworten und Daten liefern. Das kann aber auch nicht sein, deshalb müsste bei i2c0.readfrom() doch irgendwo auch ein Fehler abgefragt oder zurück gegeben werden können?

Moderator (Firma: Titel) Persönliche Seite #7765071
Lesenswert?

Marc G. schrieb:

waren wohl deine Anforderungen an chatgpt nicht genau genug... Also nochmal von vorn...

Und wenn man vorher schon weiß, was herauskommen muss, dann kann man die Fragen so geschickt stellen, dass der Antwortautomat die richtige Lösung findet.

Marc G. schrieb:

Chatgpt kann nicht hellsehen...

Es kann dir aber souverän und wortreich auf entgegenkommende Art vermittlen, dass die gebotene Lösung sicher korrekt ist.

Das hatten wir im Beitrag "Re: ChatGPT und Spannungsteiler." in allen Ausprägungen.

Rainer schrieb:

Hat irgend jemand eine Idee?

Nimm ein Oszilloskop oder einen Logic-Analyzer und sieh dir an, was auf dem Bus abläuft. Wenn dort das passiert, was der Sensor laut dem Protokoll in seinem Datenblatt erwartet, dann funktioniert das Ganze problemlos.

#7765072
Lesenswert?

Rainer schrieb:

wlan_lcd_1lm75a.py auf Basis ChatGPT

Ich würde empfehlen einfach mal selbst das Datenblatt zu lesen und zu verstehen. Als Alternative, warum fragst du ChatGPT nicht einfach wo der Fehler liegt?

“Als ich jung war, habe ich die Computer von meinen Eltern repariert. Jetzt repariere ich die Computer für meine Kinder. Sind wir die einzige Generation, die versteht wie Computer funktionieren?”

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren