"Time out error" avec DHT22

J’ai testé mon DHT22 (capteur de température et humidité). Il marche très bien avec le code de base pour le tester. Cependant j’essaye maintenant de relever les valeurs seulement toutes les 4s (ou n’importe quelle période de temps) sans utiliser la fonction delay car dans le futur le programme devra gérer d’autres choses en simultanées.

J’ai essayé avec la fonction millis() mais cela provoque des erreurs de Time out (image ci-jointe).

Voici le code :

#include <dht.h>

//Variables
#define DHT22_PIN 2

//Variable pin fan
#define VENTILO_PIN 13

void setup(){
Serial.begin(9600);
//pinMode(13,OUTPUT); //pin output fan
}

void loop(){
dht DHT;
unsigned long time;
unsigned long time2;
//float Temp_max = 25.00; //maximum temperature
//int humidity_max = 95; //maximum humidity
time=millis();

if((time-time2)>4000){
// READ DATA
Serial.print (“DHT22, \t”);
int chk = DHT.read22 (DHT22_PIN); //read the dht22
switch (chk) {
case 0: Serial.print (“OK,\t”); break; // read OK
case -1: Serial.print (“Checksum error,\t”); break; //error
case -2: Serial.print (“Time out error,\t”); break; // error
default: Serial.print (“Unknown error,\t”); break; //error
}

// DISPLAT DATA

Serial.print(“Humidity : “);
Serial.print (DHT.humidity,1);
Serial.print(” %”);
Serial.print (",\t");
Serial.print(“Temperature : “);
Serial.print (DHT.temperature,1);
Serial.println(” C”);
time2=millis();
}
/*
//If temperature is higher than maximum temperature
if(DHT.temperature > Temp_max){digitalWrite(13,HIGH);}//fan ON
else digitalWrite(13,LOW); //else fan OFF

//If humidity is higher than maximum humidity
if(DHT.humidity > humidity_max){digitalWrite(13,HIGH);}//fan ON
else digitalWrite(13,LOW); //else fan OFF

*/
}

A quoi est dû cette erreur de time out ? et comment y remédier sans utiliser la fonction delay ?

time out error.JPG

Bonjour

De quelle bibliothèque s'agit-il ? J'utilise celle d'Adfruit et elle n'a pas de constructeur sans argument.

Sinon, time2 étant une variable locale à loop, sa valeur est inconnue au moment du test. L'intention est de récupérer la valeur à la fin de loop pour l'employer dans le test. Il faut donc faire de time2 une variable statique.

Celle la visiblement :

https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib

ton instanciation de DHT est à placer en-tête et pas dans la loop()

oui stupide erreur .. j'ai déclaré la variable time2 en dehors de la boucle et attribué la valeur 0 puis affecté time a time2 en fin de programme. et maintenant ca fonctionne merci !

Je te conseille d'utiliser la dernière version du playground de robtilaert. Nous avons eu quelques discussions, il a intégré certaines de mes remarques :grin: et pas d'autres :drooling_face: . Il est resté sur une solution avec des temps fixes. Normalement cela devrait fonctionner sauf si des produits sont en limite de spec. Comme les valeurs de la spec ont l'air très, très, très larges elles ne devrait jamais être atteintes.

Ce qu'il faut éviter ce sont les bibliothèques qui utilisent "digitalRead" pour détecter les bits longs ou courts et qui pour cette application est vraiment trop lent. L'idéal est de manipuler directement les registres des PORTs mais ce n'est pas portable. Robert à choisi une méthode intermédiaire que l'on avait déjà évoquée ici et qui permet de réduire le temps de lecture d'une pin dans un rapport 2 ce qui (à 16 MHz) permet d'avoir une marge de sécurité.

Le problème c'est qu'il ne l'a pas fait à l'instanciation de la classe, ça aurait été encore plus rapide ...

Ca j'avais compris mais cela ne m'empêche pas de signaler une bibliothèque qui va été bien améliorée justement sur un point contenu dans le titre. j'ai donné l'info, il en fera ce qu'il voudra. Et si cela peut servir à d'autre .......