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")
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.
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.
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
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.
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.
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?
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.