HYT-939 Nach I2C Adressänderungen wird Sensor nicht mehr erkannt

OP #7902226
Lesenswert?

Moin,

ich würde gern mehrere HYT-939-Sensoren mit meinem RaspberryPi Pico über i2c verbinden und Temperatur und Luftfeuchtigkeit auslesen.

Um den Sensor kennenzulernen habe ich mir einen Testaufbau auf dem Breadboard und meinem alten Raspberry Pi 2b gemacht und konnte bereits Temperatur und Luftfeuchtigkeit mittels eines kleinen Python-Programs auslesen. So weit so gut.

Ich habe die VCC des Sensors mit dem GPIO4 des RaspberryPi verbunden, um ihn über das Skript ein- und wieder auszuschalten zu können.

Wenn ich mehrere Sensoren an den gleichen i2c schließe, brauchen die natürlich andere Adressen, oder ich brauche einen mux. Im Datenblatt habe ich gelesen, dass man die Adresse des Sensors über einen Command-Mode anpassen kann. Gesagt - Getan. Nach etwas debugging hatte ich mir die nötigen Schritte und in Python-Code umgesetzt.

Die Schritte werden auf Seite 18 im Datenblatt Beispielhaft für die Adressänderungen von '0x28' auf '0x31' beschrieben. Datenblatt (https://my.avnet.com/wcm/connect/c5b43462-09d1-4e07-bd61-dbee28c2f3a5/IST-HYT-939-%28With-Sintered-Metal-Filter%29-EN-Datasheet.pdf?MOD=AJPERES&CVID=oMycD2g) wie folgt beschrieben:

  1. Power On
  2. Command '0XA0' an das die Adresse 0x28 schicken und die beiden restlichen Byte auf 0x00 setzen.
  3. (optional) ACK abwarten
  4. aktuelle Adresse auslesen mit '0x1C' an die Adresse '0x28' senden und die beiden restlichen Byte mit '0x00' auffüllen
  5. Register '0x1C' Auslesen und auswerten, ob die aktuelle Adresse im dritten Byte steht
  6. Wenn nein, dann Abbruch -> Power Off / Power on und nochmal von vorn, Wenn ja weiter mit 7
  7. Neue Adresse setzen in dem man 2 Byte an das Register '0x5C' der Adresse '0x28' sendet. Im MSB steht '0x00' und dem LSB steht die neue Adresse '0x31'
  8. Schreibvorgang bestätigen, indem man die Aktuelle noch einmal ausliest.

Im Datenblatt wird erwähnt, man den Sensor ausschalten soll, falls einer der Schritte fehlschlägt und nochmal ein von vorn beginnen soll. Falls der Schreibvorgang erfolgreich ist, steht in der Response '0x81' und die neue Adresse.

Mein Code sieht dazu folgendermaßen aus:

1
HYT_ADDR = 0x28
2
HYT_NEW_ADDR = 0x31
3

4
def changeAddress():
5
    print("Power-off the sensor for safety reasons and wait 5 seconds")
6
    print("Changing the address of HYT sensor")
7
    GPIO.output(4, False)
8
    print("Old address (HEX): {}".format(hex(HYT_ADDR)))
9
    print("New address (HEX): {}".format(hex(HYT_NEW_ADDR)))
10
    time.sleep(5)
11
    GPIO.output(4, True)
12
    # put the sensor in command mode
13
    I2C_BUS.write_i2c_block_data(HYT_ADDR, 0xA0,[0x00, 0x00])
14
    rsp = I2C_BUS.read_i2c_block_data(HYT_ADDR, 0x00, 1)
15
    if rsp and rsp[0] == 129:
16
        print("entered command mode, trying to change the address")
17
        I2C_BUS.write_i2c_block_data(HYT_ADDR, 0x1C, [0x00, 0x00])
18
        addressData = I2C_BUS.read_i2c_block_data(HYT_ADDR, 0x1C, 3)
19
        if addressData and addressData[2] == HYT_ADDR:
20
            print("successful reading address: {}".format(hex(addressData[2])))
21
            I2C_BUS.write_i2c_block_data(HYT_ADDR, 0x5C, [0x00, HYT_NEW_ADDR])
22
            I2C_BUS.write_i2c_block_data(HYT_ADDR, 0x1C, [0x00, 0x00])
23
            addressDataNew = I2C_BUS.read_i2c_block_data(HYT_ADDR, 0x1C, 3)
24
            print(addressDataNew)

Nach dem ersten Ausführen des Codes, war die Antwort, dass das Schreiben nicht erfolgreich war, da die Antwort in der Variable [i]addressDataNew[/i] die Werte [128, 112, 0] enthielt, was für mich auf einen Fehler hingedeutet hat.

Darauf hin habe ich, wie im Datenblatt beschrieben, den Sensor über mein Skript ausgeschaltet.

Jetzt kommen wir zu meinem Problem, nach dem erneuten Anschalten ließ sich der Sensor weder über die alte Adresse '0x28' und '0x31' ansprechen. Sowohl über die Python smbus lib als auch über die i2c-Schnitstelle im Linux 'i2c-detect' kann ich ihn nicht sehen? Kann ich den Sensor noch retten, oder muss ich ihn wegwerfen? Einen Powercycle habe ich bereits mehrfach durchgeführt. Sowohl mittels Abziehen des Sensors, Neustart des RaspberryPi als auch die Trennung des Raspberry Pi vom Strom (inkl. 2h Wartezeit).

Was kann ich jetzt noch machen, oder ist der Sensor kaputt? Welchen Fehler habe ich bei der Adressänderung gemacht?

Viele Grüße, Paul

tldr; Mein HYT939-Sensor lässt sich nach einer "Änderung" der i2c-Adresse nicht mehr ansprechen. Sowohl über die Python smbus lib als auch über die i2c-Schnitstelle im Linux 'i2c-detect'? Kann ich den Sensor noch retten, oder muss ich ihn wegwerfen? Powercycle habe ich bereits durchgeführt. Sowohl mittels Abziehen des Sensors, Neustart des RaspberryPi als auch die Trennung des Raspberry Pi vom Strom.

OP #7902256
Lesenswert?

Leider nein. Der RaspberryPi 2B verfügbar intern über 2 i2c Schnitstellen, die ich zuerst mit dem Befehl sudo i2detect -y 1 bzw. sudo i2detect -y 2 abfrage, um zu sehen, ob und wo sich ein Gerät am Raspberry befindet befindet. Aber die Ausgabe bleibt leer

1
pi@raspberrypi:~ $ sudo i2cdetect -y 1
2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
3
00:                         -- -- -- -- -- -- -- -- 
4
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
5
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
6
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
7
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
8
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
9
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10
70: -- -- -- -- -- -- -- --  
11
[code]
12

13
Ein neuer, "frischer" Sensor verhält sich wie gewünscht
14
[code]
15
pi@raspberrypi:~ $ sudo i2cdetect -y 1
16
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
17
00:                         -- -- -- -- -- -- -- -- 
18
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
19
20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 
20
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
21
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
22
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
23
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
24
70: -- -- -- -- -- -- -- --
#7902262
Lesenswert?

Paul schrieb:

I2C_BUS.write_i2c_block_data(HYT_ADDR, 0xA0,[0x00, 0x00]) rsp = I2C_BUS.read_i2c_block_data(HYT_ADDR, 0x00, 1) if rsp and rsp[0] == 129:

S. 17/24 :Table 2 shows the response to the start of the command-mode Das sind 2 byte. Warum wird nur 1 gelesen? Gib mal alle Werte (Slave Addres, Status, Diagnostic, Response) aus.

Warum wird auf rsp[0]==129 abgefragt? Das müsste doch die aktuelle I2C-Adresse sein.

Beitrag #7902263 wurde von einem Moderator gelöscht.
#7902265
Lesenswert?

1
    rsp = I2C_BUS.read_i2c_block_data(HYT_ADDR, 0x00, 1)
2
    if rsp and rsp[0] == 129:

vorweg ich bin kein py Profi aber ist den sichergestellt das bei dem code wirklich nur ein READ abgesetzt wird wie es das DB vorschreibt? Was kommt auf rsp[0] den zurück? Es gibt ja lt. DB auch noch andere Response values als 0x81.

#7902269
Lesenswert?

Helmut H. schrieb:

Das sind 2 byte. Warum wird nur 1 gelesen?

Sorry, das hatte ich missverstanden. Es ist wohl doch nur 1 byte das zurückgegeben wird.

Thomas Z. schrieb:

ist den sichergestellt das bei dem code wirklich nur ein READ abgesetzt wird

+1, siehe https://forums.raspberrypi.com/viewtopic.php?t=221051 'bus.read_i2c_block_data' writes a 0 first then reads data

Mal mit read_byte versuchen?

(Firma: 1984now) #7902310
Lesenswert?

Paul schrieb:

Einen Powercycle habe ich bereits mehrfach durchgeführt. Sowohl mittels Abziehen des Sensors, Neustart des RaspberryPi als auch die Trennung des Raspberry Pi vom Strom (inkl. 2h Wartezeit).

Lass' das mal einen ganzen Tag lang stromlos stehen. ALLE Kabel abgezogen, auch die, von denen du meinst, darüber könnte kein Stromzufluss erfolgen.

Danach dürfte das Ding beim I2C-Scan wieder auftauchen.

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