Faire un tableau de sondes DHT

Bonjour,

Pour optimiser mon code, je voulais faire un tableau avec mes sondes DHT, mais je n’y arrive pas.

J’utilise la librairie dhtnew de Rob Tillaart.

la déclaration dans la librairie est faite comme ça :

DHTNEW::DHTNEW(uint8_t pin) { _pin = pin; };

Voici un code de test qui fonctionne :

#include <dhtnew.h>
DHTNEW mySensor(6);
void setup()
{
  Serial.begin(115200);
  mySensor.read();
  Serial.println("actual read");
    Serial.println(mySensor.humidity);
    Serial.println(mySensor.temperature);
    delay(250);}}
void loop(){}

Voici mon code qui ne plante pas mais qui retourne des codes d’erreur à la lecture des sondes :

#include <dhtnew.h>

uint8_t DHT_Pin[] = {4, 8, 3, 6};
byte status;

void setup() {
    Serial.begin(115200);
    for (int i=0;i<4;i++){
        DHTNEW MY_DHT[i](DHT_Pin[i]);
        status = MY_DHT[i].read();
        Serial.print(F("Statut sonde "));
        Serial.print(i);
        Serial.print(F(" : "));
        Serial.println(status);
        Serial.print(F("Température "));
        Serial.print(MY_DHT[i].temperature);
        Serial.print(F(" - Humidité "));
        Serial.println(MY_DHT[i].humidity);
    }
}

void loop(){}

Est-ce que vous sauriez comment faire?
Question bonus, en plus j’ai des sondes DHT sur des pins analogiques aussi :slight_smile:

Bonjour,

Tu définis un élément du tableau en dynamique et chaque élément est recrée à chaque boucle.

Il faut définir ton tableau en global (avant le setup)

DHTNEW MY_DHT[4]={DHTNEW(4),DHTNEW(8),DHTNEW(3),DHTNEW(6)};
DHTNEW MY_DHT[i](DHT_Pin[i]);

je ne comprends même pas ce que ce truc veut dire :slight_smile:

Pour déclarer un tableau d'objets DHTNEW on fait comme ça :

   DHTNEW MesSondes [ 8 ];

Oui mais là ça ne va pas marcher. Pas de ta faute ni de la mienne, mais celle de l'auteur de la librairie C++.
Pour créer un objet DHTNEW il faut passer par son constructeur que tu cites. Or ce constructeur attend impérativement un argument, le num. de pin. Mais la syntaxe du C++ ne permet pas de construire un tableau en passant des arguments aux constructeurs. C'est comme ça.

Donc pour pouvoir fabriquer un tableau d'objets, il faut que le concepteur de la classe ait fourni un second constructeur, dit "canonique" :

  // contructeur canonique
  DHTNEW::DHTNEW () { _pin = INVALID_PIN; } // -1 par exemple
  // constructeur complet
  DHTNEW::DHTNEW (uint8_t pin) { _pin = pin; };

Ainsi qu'un méthode publique permettant de fixer après coup la valer de _pin

void BrancherSurPin ( int pin ) { _pin = pin; }

et tu dois appeler la méthode d'init en boucle sur tous objets du tableau.

Alors maintenant de choses l'une. Ou bien l'auteur a prévu ce constructeur, ou bien il l'a oublié.
Tu peux le savoir :

  • en déclarant un tableau comme indiqué ci dessus. Si ça compile, c'es bon, mais c'est pas fini : il faut appeler la fonction d'init, et on ne sait pas comment elle s'appelle ni même si elle existe...
  • en lisant le fichier .h de la librairie
    Quand il y a un problème c'est la 1ère chose à faire, il y a des commentaires, tu vois les fonctions disponibles, leur nom, etc...

Trop bien, j’ai modifié la librairie exactement comme tu as dit, et ça marche!!! :smiley:

Si jamais ça intéresse quelqu’un je joins la librairie modifiée.

Merciiiii!!

Maintenant mon code est :

int DHT_Pin[] = {4, 8, 3, 6};
byte status;
DHTNEW MY_DHT[4];

void setup() {
   Serial.begin(115200);
   for (int i=0;i<4;i++){
       status = MY_DHT[i].setPin(DHT_Pin[i]);
       Serial.print(F("Statut pin "));
       Serial.print(status);
... 
}}

Et moi aussi, maintenant, je comprends mon code :smiley:

dhtnew.cpp (3.6 KB)

dhtnew.h (1.99 KB)

Joli coup.

J'ai parlé un peu vite, kamill a donné la solution simple (mais pas applicable s'il y avait 100 sondes)

Ah, ok, merci Kamill aussi alors! :slight_smile: