[Aide] Disfonctionnement "Capteur de température" DHT11

Bonjour,

Voila je suis nouveau dans le monde de l'Arduino, je rencontre donc quelques soucis de programmation.

J'ai créé un programme permettent de visualisé l'heure, la date, la température et l’hygrométrie sur un écran OLED de 0.96" type SPi.
Pour les mesure de température / hygrométrie j'utilise un DHT11
Pour l'heure / date un Tiny RTC I2C

Toutes les données s'affiche sur mon écran, mais le DHT11 perd totalement la tête :confused:
Voici un échantillons des température relevé sur le Serial(9600) les même qui sont affiché sur l'écran OLED.

T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 15C/ H: 150%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 26C/ H: 42%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 13C/ H: 148%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 16C/ H: 150%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 26C/ H: 43%
T: 10C/ H: 139%
T: 10C/ H: 139%
T: 10C/ H: 139%

Voici le code que j'utilise:

#include <DS1307RTC.h>
#include "RTClib.h"
#include <U8glib.h>
#include "U8glib.h"
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include "dht.h"

#define dht_apin 2
 
dht DHT;
 
U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9, 8); 

char timebuf[10];
char datebuf[10];  
int year2digit; 
int year4digit; 
 
void draw(void) 
{
  u8g.setFont(u8g_font_fub14);  
  u8g.setPrintPos(15,20);
  u8g.print(timebuf);
  u8g.setPrintPos(15, 40);  
  u8g.print(datebuf);
  u8g.drawStr(70, 62, "T: ");  
  u8g.drawStr(5, 62, "H: ");
  u8g.setPrintPos(90, 62);  
  u8g.print(DHT.temperature, 0);  
  u8g.drawStr(111, 62, "C ");
  u8g.setPrintPos(25, 62);
  u8g.print(DHT.humidity, 0); 
  u8g.drawStr(45, 62, "% ");  
  Serial.print("T: "); 
  Serial.print(DHT.temperature, 0);  
  Serial.print("C  /");
  Serial.print("  H: ");
  Serial.print(DHT.humidity, 0); 
  Serial.print("% "); 
  Serial.println();
} 
void setup(void)
{
  Serial.begin(9600);     
}
void loop(void) 
{
  DHT.read11(dht_apin);

  tmElements_t tm;
  
if (RTC.read(tm)) 
{
  year2digit = tm.Year - 30;  
    sprintf(timebuf, "%02d:%02d:%02d",tm.Hour, tm.Minute, tm.Second); // format time
    sprintf(datebuf, "%02d/%02d/%02d",tm.Day, tm.Month, year2digit);  // format date

  u8g.firstPage();  
  do {
  draw();
  } while( u8g.nextPage() );}
  delay(10);
}

Puis je séparé les deux fonctions (DHT.read et RTC.read) ?
Avec un nouveau "Void" par exemple
Car le problème viens visiblement du rafraichissement trop rapide du RTC.

Il doit y avoir un moyen simple mais je ne trouve pas sur le net, ou ne sais pas comment recherché avec mes termes ^^'

Merci d'avances de Votre aide
et dsl pour les fautes :stuck_out_tongue:

bonjour,
sauf s'il faut modifier la lib, dans ce cas lien de la lib il manque quelque chose

#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
..
..
..
void setup(void)
{
  Serial.begin(9600);
 dht.begin();     
}

Bonjour,
#Infobarquee, Merci de ta réponse, mais la lib es correct la température et hygrométrie était correct avant que j'y ajoute le module RTC
Et si je teste l’exemple de la lib DHT les valeurs sont correct

Pour moi le problème viens de cette partie du programme.

void loop(void)
{
  DHT.read11(dht_apin);

  tmElements_t tm;
 
if (RTC.read(tm))
{
  year2digit = tm.Year - 30; 
    sprintf(timebuf, "%02d:%02d:%02d",tm.Hour, tm.Minute, tm.Second); // format time
    sprintf(datebuf, "%02d/%02d/%02d",tm.Day, tm.Month, year2digit);  // format date

  u8g.firstPage(); 
  do {
  draw();
  } while( u8g.nextPage() );}
  delay(10);
}

Il fraudais que je sépare les deux fonction "read". J'ai fait des essaie mais je perd le "rafraichissement" des valeurs sur l'ecran OLED
J'ai donc essayé de faire un "Void draw2" qui n'a rien donné :frowning:

Je ne vois pas ce qui empêcherait de gérer le DHT11 et la RTC dans deux fonctions séparées.
Au contraire le programme y gagnerait en clarté.

Je fais deux remarques :
DHT
Je ne connais pas l'origine de ta bibliothèque, il en existe beaucoup qui portent le même nom (foutoir arduino) mais elles ne se valent pas toutes.
Je te conseille celle là qui se trouve dans le playground de ce site.
Dernière version ici : Arduino/libraries/DHTlib at master · RobTillaart/Arduino · GitHub
Un conseil : pour quelques centimes de plus tu as le DHT22 qui est bien plus précis, je ne comprend toujours pas pourquoi il existe encore autant de références qui préconisent le DHT11.

J'ai donc essayé de faire un "Void draw2" qui n'a rien donné

  1. L'IDE est un peu particulière dans le sens où tu n'écris qu'un source en C/C++ très partiel et que c'est l'IDE qui construit le vrai source en C/C++, mais toi tu ne le vois pas ce vrai fichier.
    Perso je place les fonctions supplémentaires après les fonction setup() et loop(), cela n'a peut-être aucune importance mais au moins cela à toujours fonctionné.

  2. Quand je déplace des portions de code de loop() vers une autre fonction je fais un copier coller dans la nouvelle fonction, je ne supprime pas de suite le code dans loop() je le met juste en commentaire. C'est plus simple pour faire des aller et retour pour détecter ce qui manque dans le transfert .
    --> souvent c'est un problème de visibilité des variables.
    Quand c'est réglé je fais le ménage dans loop().

  3. void loop() n'est pas le nom de la fonction. La fonction s'appelle loop() tout simplement.
    le préfixe void (dont la traduction en français est "vide") indique au compilateur que la fonction ne renvoie rien : elle n'a pas de ligne : return machin;
    Si une fonction bidule renvoit

  • rien il faut la déclarer void bidule()
  • un entier il faut la déclarer int bidule()
  • un float il faut la déclarer float bidule()
    etc......

Si une fonction reçoit un entier il faut la déclarer :
xxx truc(int variable)
écrire truc() est équivalent à écrire truc(void)
void sert dans les deux sens : rien en entrée ou rien en sortie.

Re, Bonjour

J'ai refait le teste, la "lib" que j'utilise n'est peut être pas super mais elle marche !
J’obtiens des valeurs "corrects" toutes les 5 secondes (delay 5000)

Si j'inclue a mon programme la partie RTC mais surtout le rafraichissement de 1 seconde , pour voir défilé les secondes a l'écran OLED.

Alors les valeurs que je reçois du DHT11 sont moins précise, et reçu 8 fois tout les (delay x)

EX :
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31%
T: 31C / H: 31% // Delay 1000
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30%
T: 32C / H: 30% // Delay 1000
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35%
T: 32C / H: 35% // Delay 1000
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%
T: 34C / H: 38%

Quelqu'un aurais t'il une idée d’où peut survenir le problème ?

#68tjs

Merci pour ta réponse même si je n'ai pas vraiment tous compris.
Comme je le disait je suis nouveau dans le "monde" Arduino.
J'ai reçu il y a quelques jours seulement mon premier kit et quelques modules (Dont le DHT11 et le SSD1307) afin de testé un peut tous !
Aillent pour but final de créé un jardin eco/intelligent :cold_sweat:

EDIT :

Je viens de refaire le programme au complet en n'utilisent uniquement les "lib" Adafruit.
Le tout et visiblement plus stable !!!

Voici le nouveau code :

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include "RTClib.h"

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 0
#define DELTAY 2

#define OLED_MOSI   11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define DHTPIN            2
#define DHTTYPE           DHT11 
DHT_Unified dht(DHTPIN, DHTTYPE);

RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"DIM", "LUN", "MAR", "MER", "JEU", "VEN", "SAM"};


void setup()   { 
                 
  display.begin();
  delay(1);
  display.display();
  display.clearDisplay();
  dht.begin();
  Serial.begin(9600);
  if (! rtc.begin()) {
    Serial.println("RTC Introuvable ");
    while (1);}
  if (! rtc.isrunning()) {
    Serial.println("RTC Ne Fonctionne Pas !");}
}
void loop() {
  
  DateTime now = rtc.now();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();


    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(42,0);
    display.print(now.hour(), DEC);
    display.print(":");
    display.print(now.minute(), DEC);
    display.print(":");
    display.print(now.second(),DEC);
    display.setCursor(23,13);
    display.print(daysOfTheWeek[now.dayOfTheWeek()]);
    display.print(": ");
    display.print(now.day(), DEC);
    display.print("/");
    display.print(now.month(), DEC);
    display.print("/");
    display.print(now.year(), DEC);
 
  sensors_event_t event; 
   
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
  }
  else {
    Serial.print("Temperature: ");
    Serial.print(event.temperature);
    Serial.println(" *C");
    display.setCursor(23,25);
    display.print("T:");
    display.print(event.temperature, 0);
    display.print("C");}
  
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!"); }
    
  else {
    Serial.print("Humidity: ");
    Serial.print(event.relative_humidity);
    Serial.println("%");
    display.setCursor(78,25);
    display.print("H:");
    display.print(event.relative_humidity, 0);
    display.print("%");}

    delay(1000);
    display.display();
    display.clearDisplay();
}

J'aimerais a présent savoir si il existe d'autre type de police de texte que celle présente (display.setTextSize(1),
Et comment ajouté un 0 si les valeurs sont inférieur à 10
Ex: if (now.hour <10)
{ display.print("0");}

Merci a vous Bonne journée

Quand on a une fonction (n'importe laquelle) et qu'on veut l'alléger en déportant une partie du code dans une nouvelle ou une autre fonction, c'est une marche à suivre que personnellement je juge simple et sécurisée.

  1. on crée la nouvelle fonction
  2. on y copie le code à déporter
  3. on y ajoute tout ce qui doit être ajouté ( passage de variable par exemple)
  4. on ne supprime pas de suite le code dans la fonction initiale mais on le met en commentaire ( entre /* et */ )
    En général celà ne fonctionne pas du premier coup parce qu'on oublie toujours quelque chose. Cela permet de revenir facilement en arrière pendant la mise au point : on ne perd pas son original.
  5. Une fois que la nouvelle fonction est correcte on supprime le code de la fonction de départ.

C'est une simple méthodologie.
On peut tout laisser dans la fonction loop() mais dès qu'elle fera plusieurs pages écran elle deviendra vite ingérable.

PS la bibliothèque Adafruit n'est pas la meilleure, comme souvent.
Adafruit c'est une entreprise commerciale dont le but est de gagner du fric pas d'optimiser les bibliothèques. Une bibliothèque doit être écrite le plus rapidement possible et tant que la non optimisation ne fait pas diminuer les ventes ils n'amélioreront jamais.

Si tu gère les erreurs avec la bibliothèque tu verra apparaître de nombreuses erreurs de type "Checksum"

Celle que je t'ai indiqué, écrite par un bénévole du forum donc hors périmètre fric, n'en a quasiment pas car elle n'utilise pas la fonction digitalRead() qui est trop lente pour le DH11 ou le DH11 est trop rapide pour la fonction digitalRead().