[DHT22] Créer une fonction qui renvoie un ou deux float ( si possible )

Bonjours à toutes et à tous,

Pour éviter une chuffe ou une surchauffe du DHT22, j' ai placé sur son alimentation un transistor piloté par la broche 7 de l' arduino.

J' essaie de créer une (ou deux) fonction(s) qui, allume le DHT22,attend deux secondes ( selon la librairie ), qui interroge et renvoi(ent) les valeurs d' humidité et de température en degré Celsius, puis coupe l' alimentation du DHT22.

voici un exemple de ce que j' essaie de faire:

float getTp()
{    
    int dhtOnOff = 7;              
    digitalWrite(dhtOnOff,HIGH);
    delay(2000);
    dht.begin();
    getTp = dht.readTemperature();  
    digitalWrite(dhtOnOff,LOW);  
}

Voici les erreurs de compilation:

MiniControleurClimat.ino: In function 'float getTp()':
MiniControleurClimat:102: error: assignment of function 'float getTp()'
MiniControleurClimat:102: error: cannot convert 'float' to 'float ()()' in assignment
MiniControleurClimat.ino:104: warning: no return statement in function returning non-void
MiniControleurClimat.ino: In function 'float getHm()':
MiniControleurClimat.ino:108: warning: no return statement in function returning non-void

Visiblement, le compilateur ne veut pas que j' affecte la valeur récupérer par la fonction dht.readTemperature(); ( qui est en float)

En fait, je dirais même que le compilateur ne veut pas que j' utilise les "objets" ( ou je ne sais quoi ) comme "now.year"(lib du DS1307), "dht.readHumidity".

J' ai essayé de mettre ces "objets" dans les paramètres de ma fonction:

float getTp(dht.readTemperature())
{    
    int dhtOnOff = 7;              
    digitalWrite(dhtOnOff,HIGH);
    delay(2000);
    dht.begin();
    getTp = dht.readTemperature();  
    digitalWrite(dhtOnOff,LOW);  
}

Voici le retour du compilateur:

MiniControleurClimat:97: error: expected ',' or ';' before '{' token
MiniControleurClimat.ino: In function 'float getHm()':
MiniControleurClimat.ino:108: warning: no return statement in function returning non-void

Si vous avez des idées... n' hésitez pas ;)

Oui c'est normal, ici tu dois programmer en C....

Les messages d'erreur de compilation me semblent assez parlants (dans chaque message, il y a le numéro de ligne à laquelle il fait référence dans le code source).

Si je reprends ton premier code :

getTp = dht.readTemperature();

getTP est le nom de ta fonction. Cette tentative d'affectation est refusée par le compilo.

float getTp()
{    
    int dhtOnOff = 7;
    float valeurLue;
              
    digitalWrite(dhtOnOff,HIGH);
    delay(2000);
    dht.begin();
    valeurLue = dht.readTemperature();  
    digitalWrite(dhtOnOff,LOW);
    return valeurLue;
}

Tu devrais accorder un peu de temps à un tuto qui explique les premiers pas avec les fonctions en C ;)

Salut Bricoleau,

en effet, par contre, il faut déclarer valeurLue en global, mais c’ est un bon début pour moi.

Sinon j’ ai fait plusieurs fonctions de type void, d’ ailleurs c’ était avec toi sur du bitewise avec un PCF8574. ( un très grand moment :wink: ).

Même chose pour l’ humidité, en la déclarant en globale;

Du coups, je peux facilement renvoyer mes deux valeurs depuis ma fonction getTp:

#include <SPI.h>
#include <DHT.h>
#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 5     // what pin we're connected to
#define DHTTYPE DHT22

/* MiniControleur climat*/

/*09-05-2015*/

/*     **Connection**
d2->Bouton poussoir
d3->Encodeur1
d4->encodeur2
D5->DHT22
D6->DS18b20
D7->Humidificateur
D8->Chauffage
*/
//     **Fonctionnement**
/*    *Affichage*
 3 modes d' affighage: 
    
 -(1) "Mode par defaut" affichage des valeurs courantes
 Menu:
 -(2) "Memoire"         affichage des valeurs du datalogg
 -(3) "Reglage"         Parametrage du systeme 
 
    *Bouton poussoir*
 
Bouton "Valider"
Bouton "Menu/Precedent" */

RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
DHT dht(DHTPIN, DHTTYPE);

float Tp;
float Rh;
void setup()
{
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();
  
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  lcd.begin(16,2);
  blinkBackLight();
  lcd.backlight();
  
}

void blinkBackLight()
{  
  for( int i=0; i<4; i++){
  lcd.backlight();
    delay(200);
    lcd.noBacklight();
    delay(200);
    lcd.clear();
  }
}


void loop()
{
  DateTime now = RTC.now();
  
lcd.setCursor(0,0);lcd.print("Mode:");

//****Affichage de l' heure****//
if (now.hour(),DEC >9)
{     lcd.setCursor(11,0);lcd.print(now.hour(),DEC);}
else{ lcd.setCursor(11,0);lcd.print("0");lcd.setCursor(12,0);lcd.print(now.hour(),DEC);}

lcd.setCursor(13,0);lcd.print(":");

if (now.minute(),DEC<9)
{ lcd.setCursor(14,0);lcd.print("0");lcd.setCursor(15,0);lcd.print(now.minute(),DEC);}
else{lcd.setCursor(14,0); lcd.print(now.minute(),DEC);}

//****Affichage de la température****//    tout les quart d' heures
if(now.minute()==0 ||now.minute()==15 || now.minute()==30 || now.minute()==45)
{
  getTp();delay(30);
  lcd.setCursor(0,1);lcd.print(Tp);
  lcd.setCursor(6,1);lcd.print(Rh);
}
delay(2000);
}

//void afficheHeure()
//{
// 
//
//  
//}
//
//
float getTp()
{    
    int dhtOnOff = 7;  
        
    digitalWrite(dhtOnOff,HIGH);
    delay(2000);
    dht.begin();
    Tp = dht.readTemperature();  
    Rh = dht.readHumidity();
    digitalWrite(dhtOnOff,LOW);  
    return Tp,Rh;
}

Et impeccable, ça fonctionne, si je puis dire! :grin:

Merci qui??? Merci Bricoleau! :wink:

Non désolé, toujours pas bon :smiling_imp:

C'est quoi ce truc ??

    return Tp,Rh;

Je ne sais même pas ce que ça fait, bien que cela semble compiler.

Si Tp et Rh sont des variables globales, pas besoin de return. Ta fonction les affecte directement

L'écriture correcte serait

void getTp()
{
  ...
  Tp = ...;
  Rh = ...;
  ...
}

Mais écrire une fonction qui met à jour ou utilise des variables globales n'est pas terrible en matière de portabilité de code. Le mieux, c'est quand ta fonction est un stand-alone que tu peux copier-coller d'un programme à l'autre sans te poser de question (ou mieux, que tu déportes dans une librairie perso)

Admettons que tu ne veuilles que la température, l'écriture correcte serait :

float getTp()
{
  float resultat;
  ...
  resultat = ...;
  ...
  return resultat;
}

et ailleurs :
  Tp = getTp();

Si tu veux remonter deux valeurs, il y a plusieurs solutions. La plus simple est de revenir à une fonction void, en lui passant les adresses des variables à modifier.

void getTp(float *temperature, float *humidite)
{
  ...
  *temperature = ...;
  *humidite = ...;
  ...
}
et ailleurs :
  getTp(&Tp, &Rh);

C'est quoi ce truc ?? Code: [Select] return Tp,Rh;

Je ne sais même pas ce que ça fait, bien que cela semble compiler.

ça fonctionne, j' ai bien mes valeurs sur le lcd, mais c' est barbare.

Je n' arrive pas à faire cette fonction avec des variables dont la porté serait dans la fonction...

Je vais essayer, c' est sûre que cette fonction resservira, donc autant faire les choses bien!

Ce n’est pas une bonne idée d’éteindre le DHT22.
Un, je n’ai jamais trouvé qu’il chauffait et c’est normal parce que :
Deux, s’il chauffait il s’auto perturberait et ne pourrait jamais donner de mesures correctes. Si cela était, cela se saurait.
Les deux minutes indiquées par le constructeur sont un strict minimum pour éviter les mesures “déconnantes” mais celà n’assure pas que le capteur est “dans sa spec”.

La règle générale pour avoir des mesures correctes est qu’un composant électronique doit toujours être stabilisé en température avant de pouvoir être utilisé.

Tu compte économiser combien de mA.H en coupant l’alim ?
Tant qu’il n’est pas interrogé il consomme au max 15 µA ! soit P= UI = 75 µW .

Je te met la meilleure la moins mauvaise datasheet que j’ai trouvé.

AM2302.pdf (570 KB)

Bonjour et merci 68tjs,

le hardware est monté maintenant, je le saurai pour la prochaine fois.

le hardware est monté maintenant, je le saurai pour la prochaine fois.

Tu peux toujours mettre un court-circuit à la place du transistor, parce que c'est vraiment pas une bonne idée de couper l'alim.