Es gibt eine Arduino-Bibliothek für den HIH-6130, die genau das gleiche I2C-Protokoll hat wie der Sensor, den ich verwende, nämlich der HIH-6120. Ich verwende die gleichen zwei Codezeilen, um dem Sensor mitzuteilen, dass er eine Messung vornehmen soll:
Wire.beginTransmission(0x27);
ret = Wire.endTransmission();
ret ist 2, was bedeutet, dass der Master beim Senden der Adresse NACK empfangen hat. Wenn ich mir das auf meinem analogen Oszilloskop ansehe, scheint der Sensor zu versuchen, SDA auf 1 steigen zu lassen, aber es ist spät und zu schwach: (ungefähr 10us pro div, 2v pro div, sync bei fallendem SDA) A verzögert durch B ergibt
(1us pro div) Pullup-Widerstände sind 2k. Die Sensoradresse ist laut HP 0x27. Die minimale Taktfrequenz beträgt 100 KHz, was Arduino angibt.
Was in aller Welt ist falsch?
Es sieht so aus, als ob es für mich ACK ist, aber vielleicht interpretiert der Code es falsch?
Ich sehe die 0x27 (Daten, die an der steigenden Taktflanke zwischengespeichert werden), und dann ist das Lese-/Schreibbit 0, was bedeutet, dass Sie einen Schreibvorgang ausführen, dann treibt der Slave SDA auf Low, um eine Bestätigung anzuzeigen. Sie können direkt sehen, wenn es passiert, gibt es einen winzigen Schritt nach unten auf genau 0 Volt.
Dann gibt der Slave an der fallenden Flanke der Uhr die SDA-Leitung frei (wie es sollte), so dass die SDA ansteigt, dann übernimmt der Master den Bus und treibt die SDA-Leitung auf Low. Deshalb sehen Sie diesen schmalen Punkt.
Es sieht also gut aus. Irgendwie interpretiert die HW es falsch oder Ihr Verständnis der API könnte falsch sein?
Siehe meinen Kommentar oben - die Transaktion selbst sieht in Ordnung aus.
Ihr Code sendet jedoch nur die Adresse und sendet dann sofort ein STOP. Du liest eigentlich gar nichts. Dieses erste Lesen ist nur ein Dummy-Weckbefehl (danke Janka).
Laut Datenblatt müssen Sie dann die Adresse im READ-Modus senden und dann entweder zwei Bytes lesen, wenn Sie nur Feuchtigkeit wollen, oder vier Bytes, wenn Sie Feuchtigkeit plus Temperatur wollen. Dann schickst du einen Stop.
Ich denke, der Code sollte eher so aussehen:
Wire.beginTransmission(0x27); // write to wake-up
Wire.endTransmission(); // ignore this
delay(100);
Wire.begin(); // optional for read
Wire.requestFrom(0x27, 4); // request 4 bytes from slave device
while (Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
ret = Wire.endTransmission();
Wenn dieser Code durcheinander kommt (dh wenn er immer noch NAK sieht, wo keines ist), ist vielleicht etwas mit der Bibliothek faul.
Adam Lawrence