DHT11 et arduino pro mini [résolu]

Bonjour à tous, (et au passage bonne année!)

Je suis en train de concevoir un montage consistant à afficher la température (et l'heure) sur un petit écran OLED en passant par un arduino pro mini.

Mais l'afficheur OLED affiche " 0°C 0% ", l'arduino pro mini n'arrive pas à lire les valeurs du DHT11.

Plusieurs solutions que j'ai déjà testées::
-Changer de pin
-Vérifier les connexions
-Testé avec arduino UNO (et ça marche)
-Tenté un autre code
-Ne pas utiliser d'OLED et mettre un bip à un seuil
-Lire avec le moniteur série : pleins de caractères incompréhensibles d'affichent (peut être que c'est normal je n'ai jamais testé pour autre chose)
-Vérifier si mon Arduino pro mini pouvait recevoir et envoyer des données correctement (oui)

J'ai aussi cherché sur d'autres forum mais je n'ai pas trouvé la solution

Mon code (avec l'OLED et le RTC):

#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

# include <dht11.h>


SSD1306AsciiAvrI2c display;
dht11 DHT11;

#define DHT11PIN 2

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val){
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val){
  return( (val/16*10) + (val%16) );
}

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  setDS3231time(30,41,15,6,04,01,20);
  Serial.begin(115200);
  display.begin(&Adafruit128x64, 0x3C);
  display.setFont(System5x7);
}

void loop()
{
uint8_t chk = DHT11.read(DHT11PIN);

  displayTime();
  
  display.set1X();
  display.setCursor(35, 5);
  display.print(DHT11.temperature, DEC);
  display.print("C  ");
  display.print(DHT11.humidity, DEC);
  display.print("%   ");
  

   
   


  delay(500);
}

void printLeft(const char *s, int y, int size)
{
  if (size == 1) {
    display.set1X();
  }
  else {
    display.set2X();
  }
  display.setCursor(0, y);
  display.print(s);
}

void printRight(const char *s, int y, int size)
{
  size_t w;

  if (size == 1) {
    display.set1X();
  }
  else {
    display.set2X();
  }
  w = display.strWidth(s);
  display.setCursor(display.displayWidth() - w, y);
  display.print(s);
}

void printCentered(const char *s, int y, int size)
{
  size_t w;

  if (size == 1) {
    display.set1X();
  }
  else {
    display.set2X();
  }
  w = display.strWidth(s);
  display.setCursor((display.displayWidth() - w) / 2, y);
  display.print(s);
}

void printValue(int value, int y, int size)
{
  char s[20];
  size_t w;

  sprintf(s, "VALUE: %d", value);
  w = display.strWidth(s);
  if (size == 1) {
    display.set1X();
  }
  else {
    display.set2X();
  }
  display.setCursor(0, y);
  display.print(s);
}


void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year){
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year){
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

 
void displayTime(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
   display.set2X();
  display.setCursor(30, 1);
  if (hour<10) {
    display.print("0");
  }
  display.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  display.print(":");
  if (minute<10){
    display.print("0");
  }
  display.print(minute, DEC);
  }

Il serait bien de préciser quelle est la librairie utilisée.

Je connais DHT.h, DHT_U.h mais dht11.h je ne connais pas.

Par curiosité dans ton autre post tu dis ceci :

La pro mini est alimenté avec une pile 3,7 volts (en vrai 4).

Tu espères quelle autonomie de ton montage ?

Je ne sais plus trop où j'ai trouvé cette librairie mais celle là y ressemble

Une autonomie d'un mois environ en utilisant le Low power et l'écran, le DHT11, ne seront alimentés que quand on en a besoin.

Rien qu'en testant l'exemple :

DHT11, 	Checksum error,	45,	21
DHT11, 	Time out error,	45,	21
DHT11, 	Checksum error,	44,	21
DHT11, 	Time out error,	44,	21
DHT11, 	Checksum error,	44,	21
DHT11, 	Time out error,	44,	21

Méfie-toi des librairies exotiques ramassées n'importe où sur le WEB, surtout quand il s'agit de composants aussi sensibles qu'un DHT11.

DHT sensor lybrary est installable depuis l'IDE.
Essaie d'abord un exemple.

La DHT sensor lybrary fonctionne avec une PRO MINI 8Mhz.

Une autonomie d'un mois environ en utilisant le Low power et l'écran, le DHT11, ne seront alimentés que quand on en a besoin.

Ok. Tu as déjà vu ceci ? RitonDuino: ARDUINO PRO MINI & basse consommation

Un petit complément au low-power ...

Je teste avec un arduino UNO, ça me met direct ça:
Erreur de compilation pour la carte Arduino/Genuino Uno

Oui j'ai consulté ton article, c'est même ça qui m'a poussé à l'acheter :wink:

bonsoir,

j'ai eu également pas mal de problèmes avec DHT11 et DHT22 montés genre AM2302 (vous me pardonnerez ces approximations, je débute). Ainsi, pour les plus ardus d'entre ces détecteurs (ou les plus mauvaises copies), seule la librairie <dht_nonblocking.h> permet leur fonctionnement. Il faut juste déclarer ou ne pas déclarer le type de sonde utilisée. Les exemples de la librairie peuvent permettre rapidement de voir si cela fonctionne.

Elle se trouve facilement avec google sur Github : GitHub - olewolf/DHT_nonblocking: Non-blocking Arduino library for the DHT11, DHT21, and DHT22 sensors

Bonne soirée

Le DHT11 comme le DHT22 (am2302 est son autre nom, c'est le même produit) sont des composants rapides.

Les bibliothèques qui utilisent la fonction digitalRead font plus de lectures fausses que de bonnes. C'est du au fait que digitalRead() est vraiment trop lente. Elles sont inutilisables.

J'avais écrit une solution parfaitement fonctionnelle mais qui utilisait directement les registres : ce n'était pas souple il fallait coder dans le code le nom du registre du port et l'indice dans le port et modifier le programme si on change de sortie.

R Tilaert à mis au point une bibliothèque qui réuni le meilleurs des deux mondes. Les macros de conversion Numérotation arduino/Numérotation Atmel permettent de déterminer et de placer en mémoire l'adresse du port et l'indice dans le port de la pin utilisée.
Ensuite il est possible d'intervenir directement au niveau des registres.

  • Nombre de cycles horloge pour lire une entrée numérique avec digitalRead() : > 60 cycles
  • Même chose avec les registres ~ 8 cycles

Cette bibliothèque qui fonctionne parfaitement a été reprise par différents acteurs dont adafruit qui a abandonné sa bibliothèque qui utilisait digitalRead().

Avec un mini-pro qui tourne sous 8Hz au lieu de 16MHz la rapidité est un paramètre encore plus important.

Je te conseille de prendre la bibliothèque de Rob ou une bibliothèque qui en dérive.
Perso j'aime bien les originaux.

Encore un fois dans les sites de vulgarisation on trouve encore et encore des références au DHT11. Tout comme le DS1307 qui dérive alors qu'un Ds3231 est bien plus stable, le DHT22 (AM2302) est bien plus précis que le DHT11. DS1307 et DS3231 coûtent le même prix, le DHT22 est un peu plus cher que le DHT11 mais les 1ou 2€ de différence sont bien mérités.

Après avoir téléchargé la bibliothèque dht nonblocking.h et compilé:

Arduino : 1.8.9 (Windows Store 1.8.21.0) (Windows 10), Carte : "Arduino/Genuino Uno"

DHT_nonblocking:24:29: error: dht_nonblocking.h: No such file or directory

compilation terminated.

exit status 1
dht_nonblocking.h: No such file or directory

Comment fait on pour télécharger la bibliothèque de Rob Tillaart ? Ce n'est pas comme d'habitude.
C'est celle là ?

Je trouve que le DHT11 suffit, il ne change que d'un degré au plus, je trouve qu'il n'y a pas besoin d'acheter un DHT22...? Sauf si ça peut changer le problème.

Comment fait on pour télécharger la bibliothèque de Rob Tillaart ? Ce n'est pas comme d'habitude.
C'est celle là ?

Presque, ce n'est pas parce que l'on n'ajoute qu'une ligne #include<bibli.h> que la bibliothèque n'est pas constituée de 2 fichiers au minimum :
il y a le fichier d'entête -> extension .h avec h pour header --> ensemble de déclarations destiné au compilateur
il y a le corps de la bibliothèque qui est un fichier c ou cpp. --> c'est le cœur de la bibliothèque

En plus pour l'IDE arduino il faut des fichiers suplémentaires.

Tu remonte de deux cran :

Tu clique sur DHTLib et tu obtient le contenu de tout un répertoire (avec un répertoire essentiel : examples)
Tu copie le tout dans un répertoire de nom DHTLib par exemple.

Normalement si tu n'a rien modifié lors de l'installation de l'IDE il a été créé automatiquement un répertoire "Arduino" à l'intérieur duquel tes programmes sont enregistrés.

Dans ce répertoire Arduino tu trouvera un répertoire "libraries". C'est dans ce répertoire libraries que tu déplacera le répertoire DHTLib

Conseil : pour comprendre le fonctionnement des bibliothèques le mieux est de chercher des tutoriaux sur la programmation en fichiers séparés. Un tutoriel de C ou Cpp classique ne pourra que t'aider.

Et bien évidement commence par essayer les exemples fournis avec la bibliothèque.

Je l'ai ajouté dans les librairies arduino mais ça ne marche pas. Et comme elle n'est pas .ZIP je crois je ne pas l'inclure directement.

Le zip c'est économiser de la bande passante.
Sur github généralement on peut télécharger directement ce zip mais là ce n'est pas prévu.
Mais ce n'est pas pour autant qu'on ne peut rien faire.

Ce que je t'ai dis de faire c'est en dehors de l'IDE, il n'y a pas que l'IDE dans la vie.

Je vais le re-dire autrement :
Tu utilise ton gestionnaire de fichier, désolé je ne sais pas son nom car ne connais plus windaube.
Tu créé dans le répertoire "Arduino/libraries" (ou "Arduino\libraries" si tu es sous windaube )un répertoire DHTLib
Tu copie dans ce répertoire la totalité des fichiers et répertoires trouvés dans : Arduino/libraries/DHTlib at master · RobTillaart/Arduino · GitHub
Et cela doit fonctionner mais si l'IDE est en cours de fonctionnement il faudra la relancer pour qu'elle voit la nouvelle bibliothèque.

bonsoir,

en ouvrant le lien de mon dernier post, tu arrives sur une page web (github.png en pièce jointe). Là, tu cliques sur l'onglet "clone or download. Ceci fait, dans la nouvelle fenêtre (fichier download.png joint) tu cliques sur..."Download.zip". Ensuite, dans l'IDE arduino, dans l'onglet "Croquis" tu selectionnes "inclure une bibliothèque" puis "ajouter la bibliothèque Zip". Dans la fenetre suivante, tu vas chercher ton fichier téléchargé dans le dossier ou il a été chargé , tu le selectionnes, tu cliques en bas à droite sur "ouvrir" (de mémoire) et c'est tout. Tu fermes l'IDE, tu le relances et la bibliothèque est désormais incluse dans l'IDE. Pour charger un exemple avec DHT_nonblocking, tu fais onglet "fichier", puis "exemples", tu descends dans la liste jusqu'à "DHT_nonblocking", tu selectionnes "DHT_nonblocking". Cela te charges le programme. Il te reste à la lecture du programme à regarder à quelle pin est connectée le DHT et à charger le programme pour l'essayer

download.PNG

Excusez moi de répondre si tard, j'étais occupé ces derniers jours.

Après avoir relancer l'IDE les bibliothèques ont marchés, mais seulement avec un arduino UNO et pas avec le pro mini pour les 2.

Pour les deux ? lesquelles ?
Pour moi la librairie AdaFruit fonctionne avec PRO MINI 8MHz. Je n'en ai pas essayé d'autres.

Avec dht nonblocking, et la bibliothèque de Rob Tillaart ça ne marche pas.
J'ai testé avec la bibliothèque Adafruit mais quand je vérifie, ce message s'affiche:

Arduino : 1.8.9 (Windows 10), Carte : "Arduino Pro or Pro Mini, ATmega328P (3.3V, 8 MHz)"

In file included from C:\Users\__\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:15:0:

C:\Users\__\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.h:36:29: fatal error: Adafruit_Sensor.h: No such file or directory

compilation terminated.

exit status 1
Erreur de compilation pour la carte Arduino Pro or Pro Mini

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Bonjour

Une librairie manque dit le message d'erreur.....

Concernant la librairie FHT Sensors d'Adafruit un coup d'oeuil au dépot GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors
indique qu'il ya un prérequis : la présence d'une autre librairie :

Requirements
This library depends on Adafruit Unified Sensor Library. To use this library the user must download the required library.

Même en installant cette autre bibliothèque, ça ne marche pas

Qu'est qui ne marche pas ?
La compilation ? l'exécution ?
Message d'erreur ?
Résultat dans la console ?