Um mehrere feuchtesensoren vom typ HYT271 o.ä. an einem I2C bus zu betreiben, muss bei den sensoren die standardadresse 0x28 geändert werden.

Dazu gibts zwar (auf nachfrage) vom herstellersupport von HYGROSENS die software "ZSC31210_ZSSC3122_cLiteTester_v1_01", aber leider funktioniert die nur mit spezieller hardware ("SSC Eval Kit" oder "SSC MCB").

Mit einem "normalen I2C USB interface" gehts zunächst also nicht (und abgesehen von der nicht vorhandenen hardware: ich arbeite lieber mit linux ;-)).

Hier beschreibe ich nun eine "quick and dirty" methode um dies mit einem einfachen I2C interface zu machen. Ich verwende dazu das "USB-I2C-Interface" von ELV und ein kleines python-script.

Die zur programmierung notwendigen infos brachte ein beitrag mit dem hinweis auf das datenblatt "ZSSC3122-datasheet.pdf" im www.mikrocontroller.net forum (http://www.mikrocontroller.net/topic/222242), Vom hersteller gibts dazu leider nur spärliche informationen ...

Die adresse lässt sich einfach durch das schreiben eines wertes im EEPROM des sensors einstellen, dazu muss der chip allerdings im sog. "Command Mode" sein. In diesen "Command Mode" kommt man durch das senden des "Start_CM" kommandos innerhalb des sog. "Command Window". Das "Command Window" besteht 3 oder 10 millisekunden (einstellbar) nach dem einschalten des sensors. Hier kommt nun die spezielle hardware ins spiel: sie steuert diesen ablauf. Sie sorgt dafür dass der sensor eingeschaltet wird und das "Start_CM" kommando rechtzeitig gesendet wird.

Wir machen das nun mit der "brute force" methode: der sensor wird zunächst nicht am I2C bus angeschlossen, nur das USB-I2C interface. Dann "ballern" wir das "Start_CM" kommando raus und schliessen den sensor an. Der sensor "bootet" und erhält sofort einen "Start_CM" befehl und geht in den "command mode" und es kann die neue I2C adresse programmiert werden.

Diese methode funktioniert erstaunlich gut und reicht aus um eine hand voll sensoren umzuprogrammieren.

Im anhang gibts ein kleines python-programm "hytAddress.py" um die adressänderung durchzuführen. Diese funktioniert wie folgt:

  • Serielle USB schnittstelle öffnen, ELV I2C interface initialisieren.
  • 5 sekunden count-down, in dieser zeit kann man das einstecken des sensors vorbereiten.
  • In einer schleife (max. 1000 mal) das Start_CM kommando raushauen, Schleife wird abgebrochen, sobald ein ACK vom sensor empfangen wird. Das ist die zeit (ca. zwei sekunden), in der der sensor am bus angeschlossen werden muss.
  • Test ob sensor im "command mode" ist durch lesen von "Part Revision" und status informationen vom sensor.
  • Test ob alte adresse aus dem EEPROM gelesen werden kann.
  • Neuprogrammierung I2C adresse.
  • Verifizierung der antwort vom sensor.

Die alte und die neue adresse sind am anfang von "hytAddress.py" eingetragen, das zu verwendende linux-device (z.b. /dev/ttyUSB0) wird als einziger parameter an das programm übergeben.

Beispielausgabe "hytAddress.py":


#> python hytAddress.py ttyUSB0
read:

read:  ELV USB-I2C-Interface v1.6 (Cal:50)

read:  Last Adress:0x51

read:  Baudrate:115200 bit/s

read:  I2C-Clock:102400 Hz

read:  Y00

read:  Y10

read:  Y20

read:  Y31

read:  Y40

read:  Y50

read:  Y60

read:  Y70

Write-/Read-Commands: S50 S51

Countdown:

4 ...
3 ...
2 ...
1 ...
0 ...
Start Start_CM - write, CONNECT SENSOR NOW ...
read ACK:  KKKK
Reading part-revision ...
Read: 'KKKK81 C0
' 12
Gone into Command-Mode! Command bits ok (10), No errors (0000), Response bits OK (01), Part-Revision is: C0
Read: 'KKKK81 00 28
' 15
Read of current address ok, writing new adress 2B
EEprom Write command:  S505C002BP
Reading response...
Read: 'KKKK81
' 9
Done, please reboot sensor now ...

Hinweis zur Ausführung des Scripts unter Windows:

Ein freundlicher Benutzer schrieb die folgende Hinweise um das script unter MS-Windows auszuführen:

Hallo,

vielen Dank für Ihr sehr nützliches Script, habe gerade sechs Sensoren mit dem ELV-Adapter erfolgreich umprogrammiert.(Unter Windows, aber die kleine Änderung für Com...  war relativ schnell gefunden). Ohne Ihr Script hätte ich wohl noch Wochen gebraucht, um das hinzubekommen, der Support von Hygrosens hat mir auf zwei Mails noch nicht einmal geantwortet...

Unter Windows müssen die Programmierumgebung Python und zusätzlich das Modul "Python Serial Port Extension for Win32" installiert werden. Ist der USB-I2C Adapter z.B an COM4 installiert, braucht dann nur im Script die Zeile:

ser = serial.Serial("/dev/" + sys.argv[1], 115200, timeout=0.1)

in

ser = serial.Serial('com4', 115200, timeout=0.1)

geändert werden und das ganze läuft dann auch unter Windows wunderbar.

Viele Grüße und nochmals vielen Dank!

Anhang

Größe

Binary Data hytAddress.py.gz

1.77 KB