Forum: Mikrocontroller und Digitale Elektronik Fehler beim Auslesen von 2 I2C-Sensoren


von Rainer (rte_2806)


Angehängte Dateien:

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

von Flip B. (frickelfreak)


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.

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Was sind das für Sensoren?

von Stephan S. (uxdx)


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
    .....

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Stephan S. schrieb:
> Woher wissen die Temperatur-Sensoren, dass sie Daten senden sollen, da
> wird doch meist erst mal ein Start-Signal gesendet.

Genau deswegen habe ich gefragt, um welche Sensoren es geht. Als 
nächstes hätte ich ins Datenblatt geschaut.

von Peter (pittyj)


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?

von Marc G. (marcm)


Lesenswert?

Wenn du dir schon von chatgpt einen Quellcode erstellen lässt, waren 
wohl deine Anforderungen an chatgpt nicht genau genug... Also nochmal 
von vorn... Chatgpt kann nicht hellsehen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Jens B. (dasjens)


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?”

von Rolf (rolf22)


Lesenswert?

Jens B. schrieb:
> “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?”

Morgen werden deine Enkel nichts Technisches besitzen, was man 
reparieren könnte.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Jens B. schrieb:
> Sind wir die einzige Generation, die versteht wie Computer funktionieren?

Scheint so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.