Le HTU21D répond au scan mais chaque lecture d'humidité revient vide
Traduit de English par IA ·
Un petit souci, mais il me rend fou. Une MKR WiFi 1010 dans un abri de tête de puits lit un breakout de capteur d’humidité HTU21D à 0x40 et envoie les données à Hermetry chaque minute. La température fonctionne. L’humidité fonctionne peut-être une lecture sur dix.Le scanner I2C trouve 0x40 à chaque fois. Analyseur logique : mon écriture de 0xF5 (humidité, sans hold) reçoit un ACK, puis l’adresse de lecture 0x81 reçoit un NACK et Wire.requestFrom(0x40, 3) renvoie 0. Sur le tableau de bord, l’humidité a des trous partout.
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
Traduit de English par IA ·
Les résistances de pull-up ? J’avais des lectures instables jusqu’à ce que j’ajoute 4.7k
pull-ups? I had flaky reads until I added 4.7k
Traduit de English par IA ·
Il y a déjà du 4,7k sur le breakout, et le scanner ne rate jamais rien, donc je doute du câblage.
4.7k on the breakout already, and the scanner never misses, so I doubt wiring.
Traduit de English par IA ·
J’ai eu le même problème avec un BME280, et c’était l’adresse, 0x76 au lieu de 0x77.
Had the same with a BME280 and it was the address, 0x76 vs 0x77.
Traduit de English par IA ·
La carte breakout est-elle alimentée en 3,3 V ? Désolé si c’est évident, j’en ai grillé un en 5 V le mois dernier.
Is the breakout 3.3V? Sorry if obvious, I fried one on 5V last month.
Traduit de English par IA ·
Le câblage est correct, ta lecture arrive trop tôt. En mode no-hold, le HTU21D envoie un NACK sur son adresse de lecture tant que la mesure n’est pas terminée, ce que montre exactement l’analyseur. Une mesure d’humidité sur 12 bits prend jusqu’à environ 16 ms ; avec la résolution par défaut et une marge, il faut attendre plus de 15 ms. La température est la plus lente, à 50 ms, et tu as probablement copié le délai d’un exemple ne concernant que l’humidité, avec un résultat qui a fonctionné par chance dans l’autre sens.Je scrute au lieu de deviner :
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 */ }
Et si une lecture échoue malgré tout, omets la clé dans le message de cette minute ou envoie null. N’envoie pas 0 : Hermetry l’enregistre comme un vrai 0 % et ta règle d’alarme va en profiter. null signifie simplement qu’il n’y a pas de mesure.
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.
Traduit de English par IA ·
Boucle de polling en place, n atteint 3 au deuxième ou troisième essai, soit environ 20-30 ms. Deux jours sans trou. J’envoyais aussi 0 en cas d’échec, ce qui explique les étranges chutes sur le graphique. Merci 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.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

