Probleme DTH22

Bonjour,

j'ai reçu un capteur d'humiditée et de température DTH22.
je souhaite l'utiliser avec un arduino uno afin de piloter un ventilateur dans une mini serre.
j'ai suivi plusieurs tuto et j'ai instalé la librairie GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors
j'ai également éssayé avec celle déja incluse dans la derniere version de l'IDE arduino.

mais lors du téléversement il affiche érreur de compilation avec le message suivant :

In file included from C:\Program Files (x86)\Arduino\libraries\DHT\DHT_U.cpp:22:
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:35: error: expected class-name before '{' token
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:38: error: 'sensors_event_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:39: error: 'sensor_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:47: error: expected class-name before '{' token
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:50: error: 'sensors_event_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:51: error: 'sensor_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:73: error: 'sensor_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\/DHT_U.h:74: error: 'sensor_t' has not been declared
C:\Program Files (x86)\Arduino\libraries\DHT\DHT_U.cpp:35: error: variable or field 'setName' declared void
C:\Program Files (x86)\Arduino\libraries\DHT\DHT_U.cpp:35: error: 'sensor_t' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\DHT\DHT_U.cpp:35: error: 'sensor' was not declared in this scope

j'ai cherché sur internet et éssayé beaucoup de chose mais rien n'y fait.
Pouriez vous m'aider s'il vous plait ?

bonne journée,
cordialement,

Siera

Postez votre code

Pour moi c’est très clair : pas de bibliothèque Adafruit c’est une des plus pourries.
La seule convenable est celle de Rob Tillaert (orthographe non garantie) que l’on trouve sur le Playground sur ce site.

La bibliothèque doit être dézipée dans le sous répertoire “libraries” de ton répertoire “arduino”.
Tu dois inclure dans ton code le fichier d’en tête (extension en .h).
Comme il est dans un des trois endroits connus de l’IDE il est à appeler entre chevrons.
#incluude <dht.h>

Explication : les DHTXX sont des circuits rapides et la fonction digitalRead(x) est une fonction très lente qui provoque des erreurs de lecture.
La solution utilisée par Rob consste à lire directement dans les registres du microcontroleur.

Bonjour,

merci de vos réponses.
Pour ce qui est du code c'est celui fourni en exemple avec la bibliothèque.

je voudrais installer la bibliotheque de rob tillaart mais je n'arrive pas à la télécharger sur gitub
il m'affiche :

Uploads are disabled.
File uploads require push access to this repository

pourtant j'ai réussi à la télécharger sur mon téléphone donc je ne comprend pas.
et pas moyen de transferer depuis le téléphone.

quelqu'un pourrais il me donner les fichier ?

bonne soirée
coridalement

siera

@68tjs

"pas de bibliothèque Adafruit c'est une des plus pourries."

Pourquoi dites vous cela, pouvez vous étayer votre position par des exemples extrait du code de leur librairie? ça me semble "unfair" même si je n'ai pas étudié en détail

J-M-L:
@68tjs

Pourquoi dites vous cela, pouvez vous étayer votre position par des exemples extrait du code de leur librairie? ça me semble “unfair” même si je n’ai pas étudié en détail

je plussoie avec 68tjs, il y a souvent de très gros bugs dans leur lib, tft par exemple.

J-M-L:
@68tjs
Pourquoi dites vous cela, pouvez vous étayer votre position par des exemples extrait du code de leur librairie? ça me semble “unfair” même si je n’ai pas étudié en détail

Parce que les bibliothèques Adafruits n’existent que pour vendre des cartes.

Du moment qu’elles permettent d’exploiter les cartes modules c’est bon pour les finances de la société adafruit.

Améliorer les bibliothèques qui marchottent est une perte de temps donc d’argent, les équipes de développeur info sont en priorité sur les cartes nouvelles.

Au contraire les bibliothèques comme celles de Rob sont celles de perfectionnistes qui ne comptent pas leur temps et aime le beau travail.

Les bibliothèques Adafruit sur le DHT11/22 utilisent toujours les fonctions digitalRead(x).
Ces fonctions sont doublement lentes comme un escargot :

  1. elles font des tas de tests anti-conneries inutiles.
  2. A chaque appel elles font la conversion entre les dénominations Wiring (et sa copie arduino) et les VRAIES dénominations Atmel
    C’est pour cela que les fonctions digitalReadFAST ne sont pas “fast” du tout car elles éliminent bien les détections anticonneries mais elles font toujours la conversion Wiring/Atmel à chaque appel.

Or le DHT22 est un circuit rapide et l’utilisation des fonctions arduino provoque un nombre INADMISSIBLE de “Checksum Error”

Mais pour corriger cette bibliothèque il faut sacrifier du temps et la société Adafruit qui est capitaliste refuse de le faire.

Par contre Rob l’a fait en réalisant la conversion WIRING/arduino dans le constructeur ce qui permet d’utiliser les registres du micro pour détecter l’état 1 ou 0.

Les fonctions WIRING/arduino font elles cette conversion à chaque appel ce qui les rend presque 10 fois plus lentes que l’accès direct aux registres.

J’ai échanger avec Rob sur l’utilisation de la fonction millis() qui pour moi est une erreur mais il est resté sur ses positions.
—> Un bit est transmis sous la forme d’un élément 0 suivi d’un d’un élément binaire 1
Si le temps du 1 est inférieur à celui du 0 le bit vaut 0
Si le temps du 1 est supérieur à celui du 0 le bit vaut 1
Rob utilise la fonction millis() pour mesurer les temps respectifs, moi je compare le temps passé dans chaque boucle while en comparant la valeur de la variable timeout de la boucle 0 avec celle de la boucle 1.

AM2302.pdf (570 KB)

on ne peut pas interroger plus de une fois toutes les 2 secondes le capteur alors l'optimisation liée à digitalRead n'a aucun sens ?

Je sais que vous avez passé du temps à lire la spec et donc avez une compréhension fine du composant mais je n'ai jamais eu le moindre problème avec la librairie adafruit et je pense qu'ils font un bon boulot pour faire quelque chose de cohérent, lisible et ils partagent largement - donc je ne suis pas si négatif que vous sur leur business modèle

J-M-L:
on ne peut pas interroger plus de une fois toutes les 2 secondes le capteur alors l’optimisation liée à digitalRead n’a aucun sens ?

Je sais que vous avez passé du temps à lire la spec et donc avez une compréhension fine du composant mais je n’ai jamais eu le moindre problème avec la librairie adafruit et je pense qu’ils font un bon boulot pour faire quelque chose de cohérent, lisible et ils partagent largement - donc je ne suis pas si négatif que vous sur leur business modèle

Objection Votre Honneur !
Le problème est ailleurs !

Toute la difficulté avec le DHT22 est de différentier le temps des éléments binaires “1” qui pour un bit “0” sont plus court que l’élément binaire “0” et pour un bit “1” sont plus long que l’élément binaire “0”

Relis la spec du DHT22.
Je sais elle est dure à trouver et j’y suis arrivé un peu par chance et beaucoup par obstination, je l’a met en copie.

Avec les fonctions WIRING (arduino est une copie de WIRING ne l’oublions pas) le nombre de tours dans une boucle while pour détecter soit un 0 soit un 1 est extrêmement faible → 2 à 10 tours d’où de grosses erreurs et l’utilisation du “Checksum Error” qui les masque. C’est vrai qu’au final la valeur est vraie mais en fait il a fallu refaire la mesure 10 ou 20 fois avant de ne pas avoir de “checksum error”.

Peut-être que cela ne gène pas quelqu’un qui vient du logiciel mais moi qui vient du matériel je ne l’admet pas.

Avec l’accès direct aux registres on gagne presque un rapport 10 en rapidité et du coup les "Checksum Error " disparaissent.

AM2302.pdf (570 KB)

Ok je comprends mieux - objection acceptée :slight_smile:

Bonjour,

aussi interressant que soit vos débats, pourrais on revenir au problème de départ ?

comment pui je obtenir la bibliothèque de rob ? (voir mon post précédent)

bonne journée,
cordialement,

siera

siera:
Bonjour,

aussi interressant que soit vos débats, pourrais on revenir au problème de départ ?

comment pui je obtenir la bibliothèque de rob ? (voir mon post précédent)

bonne journée,
cordialement,

siera

bonjour

Merci beaucoup,

je vais tester et je vous tiendrais au cournant.

bonne journée

Bonsoir à tous,

bonjour

là

j’ai réussi à télécharger la libraire de rob

mais je n’arrive pas à l’utiliser.
j’ai éssayé le code fourni en exemple sur la page arduino playground :

//
//    FILE: dht_test.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.07
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//     URL: http://arduino.cc/playground/Main/DHTLib
//
// Released to the public domain
//

#include <dht.h>

dht DHT;

#define DHT11_PIN 4
#define DHT21_PIN 5
#define DHT22_PIN 6

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
		Serial.print("OK,\t"); 
		break;
    case DHTLIB_ERROR_CHECKSUM: 
		Serial.print("Checksum error,\t"); 
		break;
    case DHTLIB_ERROR_TIMEOUT: 
		Serial.print("Time out error,\t"); 
		break;
    default: 
		Serial.print("Unknown error,\t"); 
		break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(1000);


    // READ DATA
  Serial.print("DHT21, \t");
  chk = DHT.read21(DHT21_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
		Serial.print("OK,\t"); 
		break;
    case DHTLIB_ERROR_CHECKSUM: 
		Serial.print("Checksum error,\t"); 
		break;
    case DHTLIB_ERROR_TIMEOUT: 
		Serial.print("Time out error,\t"); 
		break;
    default: 
		Serial.print("Unknown error,\t"); 
		break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(1000);

  // READ DATA
  Serial.print("DHT11, \t");
  chk = DHT.read11(DHT11_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
		Serial.print("OK,\t"); 
		break;
    case DHTLIB_ERROR_CHECKSUM: 
		Serial.print("Checksum error,\t"); 
		break;
    case DHTLIB_ERROR_TIMEOUT: 
		Serial.print("Time out error,\t"); 
		break;
    default: 
		Serial.print("Unknown error,\t"); 
		break;
  }
 // DISPLAY DATA
  Serial.print(DHT.humidity,1);
  Serial.print(",\t");
  Serial.println(DHT.temperature,1);

  delay(1000);
}
//
// END OF FILE
//

J’ai bien pris soin de remplacer, dans le code précédent, la librairie par celle que j’ai téléchargée.
mais quand je conpile il y a plein de chose qui ne sont pas reconues :

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: "Arduino Uno"
sketch_jul01a:14: error: 'dht' does not name a type
sketch_jul01a.ino: In function 'void setup()':
sketch_jul01a:25: error: 'DHT_LIB_VERSION' was not declared in this scope
sketch_jul01a.ino: In function 'void loop()':
sketch_jul01a:34: error: expected primary-expression before '.' token
sketch_jul01a:37: error: 'DHTLIB_OK' was not declared in this scope
sketch_jul01a:40: error: 'DHTLIB_ERROR_CHECKSUM' was not declared in this scope
sketch_jul01a:43: error: 'DHTLIB_ERROR_TIMEOUT' was not declared in this scope
sketch_jul01a:51: error: expected primary-expression before '.' token
sketch_jul01a:53: error: expected primary-expression before '.' token
sketch_jul01a:60: error: expected primary-expression before '.' token
sketch_jul01a:63: error: 'DHTLIB_OK' was not declared in this scope
sketch_jul01a:66: error: 'DHTLIB_ERROR_CHECKSUM' was not declared in this scope
sketch_jul01a:69: error: 'DHTLIB_ERROR_TIMEOUT' was not declared in this scope
sketch_jul01a:77: error: expected primary-expression before '.' token
sketch_jul01a:79: error: expected primary-expression before '.' token
sketch_jul01a:85: error: expected primary-expression before '.' token
sketch_jul01a:88: error: 'DHTLIB_OK' was not declared in this scope
sketch_jul01a:91: error: 'DHTLIB_ERROR_CHECKSUM' was not declared in this scope
sketch_jul01a:94: error: 'DHTLIB_ERROR_TIMEOUT' was not declared in this scope
sketch_jul01a:102: error: expected primary-expression before '.' token
sketch_jul01a:104: error: expected primary-expression before '.' token

Auriez vous une solution ?

bonne soirée,

siera

Désolé
mon lien n’était pas le bon
voir là

merci mais j'ai le meme problème qu'avant :

je ne peut pas télécharger la librairie ça me marque :

Uploads are disabled.
File uploads require push access to this repository.

pouvez vous m'envoyer le zip par mail ?

siera:
merci mais j'ai le meme problème qu'avant :

je ne peut pas télécharger la librairie ça me marque :

Uploads are disabled.
File uploads require push access to this repository.

pouvez vous m'envoyer le zip par mail ?

recupere la lib dhtlib qui se trouve dans le dossier libraries
http://www.cjoint.com/doc/17_07/GGbsXZuoOo8_Arduino-master.zip

Merci beaucoup !!!

ça y est ça compile enfin mais le moniteur série m'affiche ça :

•à’ãp«Íz¼jÿç¶ðÁÖüäÁ¶ðœÁõò¼%ûðš:þò8ÜôeÑùä|‘Ñ

j'ai éssayer avec une autre version d'arduino ide et c'est pire ça ne fait que des petits rectangle.

comment régler le problème ?

surement un probleme de vitesse du port serie dans le serial monitor
il faut qu'il corresponde à la valeur prevue dans le programme

youppiiiiiiiiiiiiiii !!!!

ça y est ça marche enfin
merci beaucoup de ton aide !!!

il y à quelquechose qui me parait bizarre

DHT22, 	Checksum error,	30.2,	24.3,	5208
DHT22, 	Checksum error,	30.0,	24.3,	5156
DHT22, 	Checksum error,	29.8,	24.3,	5104
DHT22, 	Checksum error,	29.6,	24.3,	5200
DHT22, 	OK,	93.7,	-24.3,	5296
DHT22, 	Checksum error,	29.5,	24.3,	5296
DHT22, 	OK,	93.6,	-24.3,	5200
DHT22, 	Checksum error,	31.0,	24.3,	5252
DHT22, 	Checksum error,	31.7,	24.3,	5344
DHT22, 	Checksum error,	31.3,	24.3,	5344
DHT22, 	Checksum error,	30.9,	24.3,	5300

il retourne checksum error quand les valeurs ont l'air normale
et retourne OK quand les valeurs sont complètement hors norme

est ce qu'il n'y aurais pas une inversion dans le programe ?