HTU21D antwortet beim Scan, aber jede Feuchtemessung kommt leer zurück
Von English mit KI übersetzt ·
Eine kleine Sache, aber sie macht mich wahnsinnig. Ein MKR WiFi 1010 in einem Brunnenkopf-Unterstand liest einen HTU21D-Feuchtebreakout bei 0x40 aus und sendet jede Minute an Hermetry. Die Temperatur funktioniert. Die Feuchte funktioniert vielleicht bei einer von zehn Messungen.Der I2C-Scanner findet 0x40 jedes Mal. Logikanalysator: Mein Schreibzugriff mit 0xF5 (Feuchte, kein Hold) bekommt ein ACK, dann wird die Leseadresse 0x81 mit einem NACK quittiert, und Wire.requestFrom(0x40, 3) gibt 0 zurück. Im Dashboard hat die Feuchte überall Lücken.
Wire.beginTransmission(0x40);
Wire.write(0xF5);
Wire.endTransmission();
delay(15);
uint8_t n = Wire.requestFrom(0x40, 3); // n == 0 most of the time
Small one but it’s driving me nuts. MKR WiFi 1010 in a wellhead shelter reading an HTU21D humidity breakout at 0x40, posting to Hermetry every minute. Temperature works. Humidity works maybe one read in ten.
I2C scanner finds 0x40 every time. Logic analyser: my write of 0xF5 (humidity, no hold) gets an ACK, then the read address 0x81 gets a NACK and Wire.requestFrom(0x40, 3) returns 0. On the dashboard humidity has holes all over it.
Wire.beginTransmission(0x40);
Wire.write(0xF5);
Wire.endTransmission();
delay(15);
uint8_t n = Wire.requestFrom(0x40, 3); // n == 0 most of the time
Von English mit KI übersetzt ·
Pull-up-Widerstände? Bis ich 4.7k hinzugefügt habe, waren die Messwerte unzuverlässig
pull-ups? I had flaky reads until I added 4.7k
Von English mit KI übersetzt ·
Auf dem Breakout sind bereits 4,7k vorhanden, und der Scanner verpasst nie etwas, daher bezweifle ich die Verdrahtung.
4.7k on the breakout already, and the scanner never misses, so I doubt wiring.
Von English mit KI übersetzt ·
Ich hatte dasselbe mit einem BME280, und es lag an der Adresse, 0x76 statt 0x77.
Had the same with a BME280 and it was the address, 0x76 vs 0x77.
Von English mit KI übersetzt ·
Ist das Breakout-Board mit 3,3 V betrieben? Entschuldige, falls das offensichtlich ist, ich habe letzten Monat eines mit 5 V gegrillt.
Is the breakout 3.3V? Sorry if obvious, I fried one on 5V last month.
Von English mit KI übersetzt ·
Die Verkabelung ist in Ordnung, dein Lesevorgang kommt nur zu früh. Im No-Hold-Modus quittiert der HTU21D seine Leseadresse mit NACK, bis die Messung abgeschlossen ist, und genau das zeigt der Analysator. Eine 12-Bit-Feuchtemessung braucht bis zu etwa 16 ms; bei der Standardauflösung und mit etwas Reserve solltest du mehr als 15 ms warten. Die Temperatur ist mit 50 ms die langsamere Messung. Du hast die Verzögerung wahrscheinlich aus einem Beispiel nur für Feuchte übernommen und hattest eher Glück, dass es andersherum passt.Ich frage ab, statt zu raten:
Wire.beginTransmission(0x40);
Wire.write(0xF5);
Wire.endTransmission();
uint8_t n = 0;
for (int i = 0; i < 10 && n < 3; i++) {
delay(10);
n = Wire.requestFrom(0x40, 3);
}
if (n < 3) { /* skip humidity this round */ }
Und wenn ein Lesevorgang trotzdem fehlschlägt, lass den Schlüssel in der Nachricht dieser Minute weg oder sende null. Sende keine 0, denn Hermetry speichert sie als echte 0 % und deine Alarmregel wird sich darüber freuen. null bedeutet nur, dass kein Messwert vorliegt.
Wiring is fine, your read is too early. In no-hold mode the HTU21D NACKs its read address until the measurement is done, which is exactly what the analyser shows. A 12-bit humidity reading takes up to about 16 ms, and with the default resolution and some margin you want more than 15. Temperature is the slow one at 50 ms, and you probably copied the delay from a humidity-only example and got lucky the other way round.
I poll instead of guessing:
Wire.beginTransmission(0x40);
Wire.write(0xF5);
Wire.endTransmission();
uint8_t n = 0;
for (int i = 0; i < 10 && n < 3; i++) {
delay(10);
n = Wire.requestFrom(0x40, 3);
}
if (n < 3) { /* skip humidity this round */ }
And when a read still fails, leave the key out of that minute’s message or send null. Don’t send 0, Hermetry stores it as a real 0 % and your alarm rule will love that. null just means no reading.
Von English mit KI übersetzt ·
Polling-Schleife eingesetzt, n erreicht beim zweiten oder dritten Versuch 3, also etwa 20-30 ms. Seit zwei Tagen keine Lücke mehr. Außerdem habe ich bei Fehlern 0 gesendet, was die seltsamen Einbrüche im Diagramm erklärt. Danke Daniel.
Polling loop in, n hits 3 on the second or third try, so about 20-30 ms. Two days without a hole. I was also sending 0 on failures, which explains the weird dips on the chart. Thanks Daniel.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

