Forum: Mikrocontroller und Digitale Elektronik HYT-939 Nach I2C Adressänderungen wird Sensor nicht mehr erkannt


von Paul (coffeetux)


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.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Paul schrieb:
> Jetzt kommen wir zu meinem Problem, nach dem erneuten Anschalten ließ
> sich der Sensor weder über die alte Adresse '0x28' und '0x31'
> ansprechen.

Lässt er sich denn auf irgendeiner anderen Adresse ansprechen?
Ein I2C-Scanner ist dein Freund.

von Paul (coffeetux)


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

von Helmut H. (helmuth)


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.

: Bearbeitet durch User
Beitrag #7902263 wurde vom Autor gelöscht.
von Thomas Z. (usbman)


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.

: Bearbeitet durch User
von Helmut H. (helmuth)


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?

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


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.

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.