Arduino Forum

International => Français => Topic started by: AIRPOPCIE on Jul 05, 2017, 03:25 pm

Title: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 05, 2017, 03:25 pm
Bonjour en 2016 j'ai participé pour la première fois à un forum sur la régulation de température.
J'utilise des DS18B20 et la température lue chaque minute n'est pas très stable. Lorsque elle varie de 2 ou 3/10ème ce n'est pas trop grave vu que je régule en comparaison des Degrés, mais sur un des Capteur j'ai parfois plus d'un degré d'écart.

Même en modifiant le "delai" ce n'est pas stable.

Voici la partie acquisition et affichage sur le port com..
Code: [Select]

Topmesure = (millis()/1000%60);
 Topmesure1=Topmesure;
 switch (Topmesure)
  {
  case 0:
      if (Mesure1 == 0) {
   sensors.requestTemperatures();
 delay(200);
// TX = sensors.getTempC(TempX);
   printTemperature(sonde1);
 delay(50);
  valdigit1 = valdigit;
  TempS1 = TempS;
  Serial.print("temperature sonde N1 CAVE est: ");
  Serial.print("    ");
  Serial.print(TempS1);
  Serial.print("    ");
  Serial.print(" valdigit1 ");
  Serial.print(valdigit1);
  Serial.print("    ");
  Serial.print("\n\r");
       Mesure1 = 1;
       Mesure4 = 0;
    }
   break;
 
 case 15:
    if (Mesure2 == 0) {
   sensors.requestTemperatures();
 delay(200);
   printTemperature(sonde2);
    delay(50);
  valdigit2 = valdigit;
  TempS2 = TempS;
  Serial.print("temperature sonde N2 TOITURE est: ");
  Serial.print("    ");
  Serial.print(TempS2);
  Serial.print("    ");
  //valdigit2 =(valdigit2*(-1)); //pour tester les T° négative
  Serial.print(" valdigit2 ");
  Serial.print(valdigit2);
  Serial.print("\n\r");
       Mesure2 = 1;
       Mesure1 = 0;
      }
  break;
 
  case 30:
    if (Mesure3 == 0) {
   sensors.requestTemperatures();
 delay(200);
   printTemperature(sonde4);
    delay(50);
  valdigit4 = valdigit;
  TempS4 = TempS;
  Serial.print("temperature sonde N4 caisson  est: ");
  Serial.print("    ");
  Serial.print(TempS4);
  Serial.print("    ");
  Serial.print(" valdigit4 ");
  Serial.print(valdigit4);
  Serial.print("\n\r");
      Mesure3 = 1;
      Mesure2 = 0;
    }
   break;
 
  case 45:
      if (Mesure4 == 0){
    sensors.requestTemperatures();
 delay(20);
   printTemperature(sonde3);
    delay(50);
  valdigit3 = valdigit;
  TempS3 = TempS;
  Serial.print("temperature sonde N3 GRENIER  est: ");
  Serial.print("    ");
  Serial.print(TempS3);
  Serial.print("    ");
  //valdigit3 =(valdigit3*(-1)); //pour tester les T° négative
  Serial.print(" valdigit3 ");
  Serial.print(valdigit3);
  Serial.print("    ");
  Serial.print("Etat du relais de la climatisation:");
  Serial.print (Etatrelaisclimatisation);
  Serial.print("\n\r");
  Serial.print ("reponse  ");
  Serial.print (Reponse);
  Serial.print("\n\r");
       Mesure4 = 1;
       Mesure3 = 0;
      }
  break;
  }
     
   
 }



Si quelqu'un a une expérience merci d'avance de bien vouloir m'en faire profiter.
A vous lire et bonne arduinade..
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: infobarquee on Jul 05, 2017, 04:18 pm
bonjour,
résolution demandée dans le code?
longueur du cable?
montage?
lien librairie?
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 05, 2017, 08:37 pm
le montage est en one wire comme préconisé pour le DS18B20.
 
merci pour la réponse.

Les câbles font 1m ou 2.0m je donne l'intégralité du code tel qu'il tourne..
Merci
Code: [Select]

/**************************************************************
* -----------  Gestion de la cave du POP ---------------------*
* Prise de températures dans 3 points différents pour couper  *
* la climatisation en cas de surchauffe de l'évaporateur.     *
*       GESTION DE LA CAVE JeenodePoP du haut                 *
* Mai 2016     V9.2   Juin 2017 V 1.0                         *
**************************************************************/

#include <Wire.h>
#include <math.h>
#include <DallasTemperature.h>
#include <OneWire.h>

uint16_t startAddr = 0x0000;       // Adresse de démarrage Start dans  NV-RAM
uint16_t lastAddr;                 // Nelle addresse des stockage NV-RAM
uint16_t TimeIsSet = 0xaa55;       // Prévient qu'il n'y a pas de remise à l'heure

int  Topmesure = 0;
int  Topmesure1 = 0;
int  Topmesure2 = 0;
int  Topmesure3 = 0;
int  Topmesure4 = 0;
int  Mesure1 = 0;
int  Mesure2 = 0;
int  Mesure3 = 0;
int  Mesure4 = 0;

int compteur = 0;
int valdigit;
int valdigit1;//était valdigitS4
int valdigit2;//était valdigitS2
int valdigit3;//était valdigitS6
int valdigit4;//était valdigitS7
int tempC;
int Reponse;
int Clignotant;
int Defaut = 0;
int Etatrelaisclimatisation;
int sortitesimpulsion;
float coefficient = (1024/55);//1024/55°C
float TempS;
float TempS1;//était TempS4
float TempS2;//était TempS5
float TempS3;//était TempS6
float TempS4;//était TempS7

/*********************
 * ADRESSAGE DES PIN *
 *********************/

//Data wire connecté sur pin 2 de l'Arduino
#define ONE_WIRE_BUS   3 //Doit passer en 3 pour JnodePoPHaut
// Relais connectés sur pin 6 et 7.
#define Relaisclimatisation  4// Doit passer en 4 pour JnodePoPHaut
#define sortitesimpulsion 5

/*********************************************************************
 * Déclaration des adresses des sondes DS18B20 pour la 1-Wire temp   *
 *********************************************************************/

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
DeviceAddress sonde1 = { 0x28, 0xFF, 0xBF, 0x72, 0xA4, 0x15, 0x03, 0x5E };// cave
DeviceAddress sonde2 = { 0x28, 0xFF, 0x1E, 0x1B, 0x69, 0x14, 0x04, 0xA7}; // Condenseur sonde de 2 M sur condenseur ou dans gaine d'entrée d'air extérieur.
DeviceAddress sonde3 = { 0x28, 0xFF, 0xB0, 0x14, 0xA5, 0x15, 0x01, 0xBF };// Grenier sonde d'1M.
//DeviceAddress sonde3B = { 0x28, 0xFF, 0x8D, 0x16, 0x64, 0x14, 0x03, 0x50}; //Grenier sonde de 2M.
DeviceAddress sonde4 = { 0x28, 0x31, 0xC9, 0x7B, 0x07, 0x00, 0x00, 0x53 };// Caisson
//DeviceAddress sonde5 = { 0x28, 0xC1, 0xB8, 0x7B, 0x07, 0x00, 0x00, 0x81 };//
//deviceAddress sonde6 = { 0x28, 0x9D, 0x3B, 0x7C, 0x07, 0x00, 0x00, 0xD1 };//
//DeviceAddress sonde7 = { 0x28, 0x62, 0x05, 0x7C, 0x07, 0x00, 0x00, 0xA1 };// 

void setup () {
 
 /**************************
 * Déclaration des sorties*
 **************************/
  pinMode(Relaisclimatisation, OUTPUT);
  digitalWrite(Relaisclimatisation, LOW);//On force le relais de la climatisation au repos. (actif à UN) sur la platine JeeNodePoPHaut.
   pinMode(sortitesimpulsion, OUTPUT);
  digitalWrite(sortitesimpulsion, LOW);
/********************************
/* OUVERTURE DU PORT SERIE COM3 *
/********************************/
 // start serial port
  Serial.begin(115200);

}
 
void printTemperature(DeviceAddress deviceAddress)
{

// set the resolution to 11 bit (good enough?)
  sensors.setResolution(sonde1, 11);
  sensors.setResolution(sonde2, 11);
  sensors.setResolution(sonde3, 11);
  sensors.setResolution(sonde4, 11);
 // sensors.setResolution(sonde5, 11);
 // sensors.setResolution(sonde6, 11);
 // sensors.setResolution(sonde7, 11);

 float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00)
  {
    Serial.print("Error getting temperature");
  }
  else
  {
    valdigit = (tempC * coefficient);
    TempS = (tempC);
   Serial.print(tempC,1); // n'affiche qu'un chiffre derrière la virgule
   Serial.print(" C    ");
   
  }
 

   
 void loop()
  {
 
 /***********************
  * Gestion des Relais  *
 ************************/

 /*****************
 *  Climatisation *
 ******************/
 if   (valdigit1 < 414)
      {(Reponse = 1);}
       // rep:A -- 414-->23° interdit  la clim en dessous de 13.0°C. (225-->12.5°C)
             
      if   (valdigit1 > 414 && valdigit3 < 540)
      {(Reponse = 2);}
       // rep:A -- 414-->23° autorise  la clim au dessus de 13.0°C. (225-->12.5°C)
       // rep:C -- 540-->30° et si la toiture est en dessous de 37°C.(666-->37°C)
     
      if   (valdigit3 < 504)
          {(Defaut = 0);}
           //  rep:B -- 504-->28° retabli la clim en dessous de 34°C. (612-->34°C)
     
      if   (valdigit3 > 540)
      //  rep:C -- 540-->30° coupe la clim au dessus de 37°C.666-->37°C)
     {(Reponse = 3);
      (Defaut = 1);}
 
 
switch (Reponse)
  {
    case 1 :
      digitalWrite(Relaisclimatisation, LOW );//
      Etatrelaisclimatisation = 0;
      break;
   
    case 2 :
      if (Defaut == 0){
     digitalWrite(Relaisclimatisation, HIGH );//
     Etatrelaisclimatisation = 1;
     }
     break; 
           
    case 3 :
   
     digitalWrite(Relaisclimatisation, LOW );//
     Etatrelaisclimatisation = 0;
     break;
 
  }
 
/********************************************************
 *test impulsion de mesure sortie sur 5 borne 11        *
 ********************************************************/
  Clignotant = (millis() / 1000%2);
   if (Clignotant == 1)
   { digitalWrite(sortitesimpulsion, HIGH);
   }
   else
   { digitalWrite(sortitesimpulsion, LOW);
   }
   

/********************************************************
 * traitements et Affichage  des Températures sur COM3  *
 ********************************************************/
 

 Topmesure = (millis()/1000%60);
 Topmesure1=Topmesure;
 switch (Topmesure)
  {
  case 0:
      if (Mesure1 == 0) {
   sensors.requestTemperatures();
 delay(200);
// TX = sensors.getTempC(TempX);
   printTemperature(sonde1);
 delay(50);
  valdigit1 = valdigit;
  TempS1 = TempS;
  Serial.print("temperature sonde N1 CAVE est: ");
  Serial.print("    ");
  Serial.print(TempS1);
  Serial.print("    ");
  Serial.print(" valdigit1 ");
  Serial.print(valdigit1);
  Serial.print("    ");
  Serial.print("\n\r");
       Mesure1 = 1;
       Mesure4 = 0;
    }
   break;
 
 case 15:
    if (Mesure2 == 0) {
   sensors.requestTemperatures();
 delay(200);
   printTemperature(sonde2);
    delay(50);
  valdigit2 = valdigit;
  TempS2 = TempS;
  Serial.print("temperature sonde N2 TOITURE est: ");
  Serial.print("    ");
  Serial.print(TempS2);
  Serial.print("    ");
  //valdigit2 =(valdigit2*(-1)); //pour tester les T° négative
  Serial.print(" valdigit2 ");
  Serial.print(valdigit2);
  Serial.print("\n\r");
       Mesure2 = 1;
       Mesure1 = 0;
      }
  break;
 
  case 30:
    if (Mesure3 == 0) {
   sensors.requestTemperatures();
 delay(200);
   printTemperature(sonde4);
    delay(50);
  valdigit4 = valdigit;
  TempS4 = TempS;
  Serial.print("temperature sonde N4 caisson  est: ");
  Serial.print("    ");
  Serial.print(TempS4);
  Serial.print("    ");
  Serial.print(" valdigit4 ");
  Serial.print(valdigit4);
  Serial.print("\n\r");
      Mesure3 = 1;
      Mesure2 = 0;
    }
   break;
 
  case 45:
      if (Mesure4 == 0){
    sensors.requestTemperatures();
 delay(20);
   printTemperature(sonde3);
    delay(50);
  valdigit3 = valdigit;
  TempS3 = TempS;
  Serial.print("temperature sonde N3 GRENIER  est: ");
  Serial.print("    ");
  Serial.print(TempS3);
  Serial.print("    ");
  //valdigit3 =(valdigit3*(-1)); //pour tester les T° négative
  Serial.print(" valdigit3 ");
  Serial.print(valdigit3);
  Serial.print("    ");
  Serial.print("Etat du relais de la climatisation:");
  Serial.print (Etatrelaisclimatisation);
  Serial.print("\n\r");
  Serial.print ("reponse  ");
  Serial.print (Reponse);
  Serial.print("\n\r");
       Mesure4 = 1;
       Mesure3 = 0;
      }
  break;
  }
     
   
 }
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: Artouste on Jul 05, 2017, 09:13 pm
...
J'utilise des DS18B20 et la température lue chaque minute n'est pas très stable. Lorsque elle varie de 2 ou 3/10ème
...  mais sur un des Capteur j'ai parfois plus d'un degré d'écart.

bonsoir
les DS18B20 ont une précision de +/- 0.5° au mieux
la résolution elle peut etre de 0.0625 °C
Entre deux capteurs très dispersifs mais "dans les clous" , ça reste dans les specifs 8)
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 22, 2018, 12:09 pm
Bonjour, j'ai repris mon projet et les choses ont BEAUCOUP avancées.

Aujourd'hui je travaille en demandant d'abord " sensors.requestTemperatures();" puis 5 secondes plus tard : TempE = sensors.getTempC(&Capteur1[0]); et avec 1 seconde d'intervalle par DB18B20

ainsi je laisse à chaque sonde le temps de lire puis de me donner la valeur de T°.

Comme les DB18B20 n'ont pas une précision extraordinaire le "digit" bouge dans un délai moyen de 30 à 45 secondes... Et cela est gênant au moment ou l'on arrive au seuil de changement d'état ( relais de radiateur ou clim) même si j'ai mis des valeurs d'hystérésis.

L'idée que j'ai serait d'enregistrer dans un tableau les 50 ou 100 valeurs de TempC, d'en faire la moyenne et prendre ce résultat comme valeur.

J'ai bien trouvé un exemple de création de tableau, écrire dans chaque case, faire la moyenne, mais je n'ai pas trouvé comment décaler vers le haut les valeurs enregistrées pour écrire la nouvelle dans la dernière ligne ...

Sinon que de lire la valeur de la deuxième  ligne pour l'écrire dans la première, puis lire la troisième et l'écrire dans la deuxième ETC...

Mais existe t il une librairie ou programme tout fait pour réaliser ce décalage?...

Merci de votre aide
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: dfgh on Jul 22, 2018, 12:50 pm
hello
j'ai fais ce code pour un niveau de cuve dans mon jardin
il fait 50 mesures, les classe en ordre croissant
et fait la moyenne des températures de la case 10 à la case 30

Code: [Select]

long distances[51];

void lecture_niveau_cuves() {
  for (int f = 1; f <= 50; f++) {
    distances[f] = ultrasonic.distanceRead();
    delay(100);
  }
  for (byte g = 1; g <= 49; g++) {
    for (byte f = 1; f <= 49; f++) {
      if (distances[f] > distances[f + 1]) {
        distances[51] = distances[f + 1];
        distances[f + 1] = distances[f];
        distances[f] = distances[51];
      }
    }
  }
  for (byte f = 1; f <= 50; f++) {
    Serial.print(distances[f]);
    Serial.print("_");
  }
  distances[51] = 0; Serial.println(" ");
  for (byte f = 11; f <= 40; f++) {
    distance += distances[f];
    Serial.print(distance);
    Serial.print("_");
  } Serial.println(" ");
  distance = distance / 30;
  Serial.println(distance);


à toi d'adapter
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: bilbo83 on Jul 22, 2018, 02:49 pm
Bonjour,

Attention dfgh, distances[51] n'existe pas.

En C/C++, un tableau à N éléments sont notés de 0 à N-1.

Cela peut provoquer des erreurs ou même des plantages lorsque le programme veut accéder à une case mémoire qui n'a pas été réservée correctement.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 22, 2018, 04:46 pm
normalement il faut pour un tableau de 50 prendre 0 comme 1ere Ligne et 49 pour la derniere..
Alors je dois déclarer long releveTC[50];

gfgh tu as écris ce programme pour un arduino?..
Merci de ton aide.
Merci bibo83 pour ta remarque.
A suivre..A+
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: dfgh on Jul 22, 2018, 05:09 pm
hello vous deux
oui, je suis béni des dieux, car le prg ne plante pas et pourtant, il le devrait.... je corrige immédiatement.
oui, le prg tourne sur une méga
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: destroyedlolo on Jul 22, 2018, 11:42 pm
Salut,

le prg ne plante pas et pourtant, il le devrait....
Non, il n'y a pas de raison : tu ne fais qu'accédé à une mémoire qui ne t'appartient pas et donc comme il n'y a pas de MMU, le programme ne fait que te renvoyer la valeurs qui s'y trouve.
Bref, t'as un problème conceptuel mais rien qui ne peux provoquer de plantage.

Maintenant, je ne comprend pas vraiment ton pb : j'ai une 20e de DS18b20 dans ma maison, mais je n'ai jamais eu ce genre de fluctuations, parfois quelques 100e de degré mais jamais plus.
Par contre, mes sondes sont alimentées en 5V ... et 5V stables.
Les seuls fois ou j'ai eu des valeurs aberrantes, c'était a cause d'une alim foireuse.

A+
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 24, 2018, 04:45 pm
bonjour destroyedlol comme je l'ai écris plus haut depuis que j'ai modifié ma façon d'appeler les sondes puis de lire le résultat 750ms plus tard c'est bien stable...Mais il y a un mais:
une de mes sondes (pas sur la même entrée que les DS18B20) est un DHT22 TRES STABLE en mesure de T° mais très fluctuante en mesure d'hygrométrie.
C'est pourquoi je voudrais "moyenner" sur 50 ou 100 mesures.

Je travaille actuellement pour faire un tableau et en faire la moyenne.
Juste pour le fun peux tu me mettre ton croquis d'acquisition de tes DS18B20?.
Merci
 
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: destroyedlolo on Jul 24, 2018, 05:55 pm
Juste pour le fun peux tu me mettre ton croquis d'acquisition de tes DS18B20?
J'ai mieux : j'ai fait un tuto sur mon site (http://destroyedlolo.info/ESP/Temperature/) la dessus.
A noter que je n'utilise plus la classique DallasTempérature mais une librairie maison OWBus (https://github.com/destroyedlolo/OWBus) qui a l'avantage de prendre en charge d'autres chips 1-wire.

Les 20 sondes dont je parlais ne sont pas gérées sur Arduino mais sous Linux avec l'indispensable OWFS. Sur mes ESP, je n'ai pas plus de 2 sondes pour le moments, non pas qu'il y ait une limitation quelconque, mais j'utilise les ESP pour des sondes déportées et il n'y a pas besoin de plus :)
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: manumanu on Jul 24, 2018, 07:03 pm
Bonjour;
J'accroche au sujet;

Il existe deux façons de brancher les DS18B20. En mode classique ou en mode "parasite". Voire le DATASHEET.
Comment à tu branché tes sondes? Quel type de cable utilise tu et sont il blindé et passe t'il a proximité d'autres câbles de réseau d'alimentations de "puissance" ?

Pour ce qui est de la moyenne ! Permettez moi une suggestion !!?

Étant donné que tu effectue X mesures utiles pour le calcule de ta moyenne...
Que -finalement - chaque valeurs de mesures chargées serra additionné à la précédente...
Pourquoi ne pas simplement les additionner à chaque relevés puis exécuter une division une fois le nombre X de mesure relevés.

Ce qui reviens en somme à effectuer l'addition et un comptage des relevés pour ensuite traiter la moyenne par calcul.
Plutôt que de les charger dans un tableau -qui occupera de l'espace mémoire- et demandera un phase de traitement supplémentaire.

Perso: L'utilisation d'un tableau est plutôt utile pour le traitement de donnée distinctes.

Salutations. 
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 25, 2018, 09:46 am
Bonjour merci manumanu de t'intéresser au sujet.

Les sondes utilisées sont:
- DHT22 pour T° et HR dans la cave. C'est cette dernière qui est varie assez vite.
-DB18B20 en waterproof longueur 1 ou 2m
( le volume dans lequel je fais 4 mesures est de l'ordre de 2m3 caisson renfermant la clim 2 sondes
1 sonde T° grenier à l'extérieur du caisson
T° Air-Admise à l'entrée de la prise d'air sur le toit à 1m au dessus).

Comme je l'ai expliqué plus haut le fait d'avoir modifié la saisie des T° rend stable les T°.

Le principe de mesure D18B20:

1). d'abord une demande de mesure:
void DemarrerConversionTemperatures() {
digitalWrite(SortieDebug, HIGH);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
digitalWrite(SortieDebug, LOW);
TacheDemarrerLesSondesFaite = true;
}

2). Ensuite une lecture:
void LectureDesTemperatures() { // Lecture des capteurs I2C successivement
TempE = sensors.getTempC(&Capteur1[0]);
TempK = sensors.getTempC(&Capteur2[0]);
TempG = sensors.getTempC(&Capteur3[0]);
TempR = sensors.getTempC(&Capteur4[0]);

entre les 2 appels: 750 mS pour laisser au DB18B20 le temps de travailler.

Je suis entrain de créer un tableau et d'y enregistrer les HR 30 mesures) pour ensuite en faire la moyenne.

Voilà.. Merci de vous intéresser à ce sujet.
Salutaions.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 27, 2018, 03:44 pm
bonjour ca y est c'est au point.

1) je lis la valeur de TH (hygrométrie);
2) Je rempli le tableau de 20 lignes avec cette valeur.
3) Je lis la valeur que je viens écrire dans la 1ere ligne du tableau
4) Je fais la somme.
5) Je fais la moyenne.

Arrivé à la ligne 20 du tableau je retourne à la 1ere.

Ca fonctionne très bien je lisse au 1/eme à chaque seconde vu que je fais une lecture par seconde.
Mais on peux afficher la moyenne que toutes les 20 secondes voir plus.
Ci joint le croquis.
Code: [Select]


/*******************************************************************
 *  Calcul d'une moyenne sur 20 lectures à raison d'une  par seconde                     *
 *        Par AIRPOPCIE             Juillet 2018                                                           *
 *******************************************************************/


#include <Arduino.h>
#include <DHT.h>                                      // Librairie des capteurs DHT                   
#define DHTTYPE DHT22                             // DHT 22  (AM2302)
#define DHTPIN 9                                       // pin sur lequel est branché le DHT
DHT dht(DHTPIN, DHTTYPE);
const int  GrandeurDuTableau = 20;            // Nombre de lignes du tableau
double TableauHR[GrandeurDuTableau];      // Notre tableau
int IndexDuTableau                = 0;              // On initialise le pointeur
int IndexDecriture                  = 0;              // Pour écrire chaque valeur lue
double TotalDesMesures         = 0;              // Pour totaliser les valeurs enregistrées pour en faire la moyenne
double MoyenneDesHR           = 0;             // Comme son nom l'indique
float TH                                 = 00.           // Hygrométrie lue dans DHT22
float TDHT                             = 00.0;
float THLU                             = 00.00;

 void setup() {
 dht.begin();
 Serial.begin(115200);
   LireDHT22();
    delay (1000);
 // On initialise le tableau avec la valeur lue de TH
 for (byte CT = 0; CT<(GrandeurDuTableau);CT++){
   TableauHR[CT] = THLU;
   //Serial.print("CT:");Serial.println(CT);
 //  Serial.print("THLU:");Serial.println(THLU);
 //delay (100);
 }
}

void LireDHT22() { //Lecture du taux d'humidité
        float TH = dht.readHumidity();
        // Lecture de la température en Celcius
        float TDHT = dht.readTemperature();
        // Pour lire la température en Fahrenheit
        float f = dht.readTemperature(true);
        THLU = TH;
        Serial.print("valeur lue:");Serial.println(THLU);
       //Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
       if (isnan(TH) || isnan(TDHT) || isnan(f)) {
       Serial.println("Echec de lecture !");
       return;
       }
        delay (500);  
}

void Additionner(){
for (IndexDuTableau = 0;IndexDuTableau<=(GrandeurDuTableau-1);IndexDuTableau++){
  TotalDesMesures = (TotalDesMesures +TableauHR[IndexDuTableau]);
  // Serial.print("Valeur enregistrée:");Serial.println(TableauHR[IndexDuTableau]);
  // Serial.print("IndexDuTableau:");Serial.println(IndexDuTableau);
 //  Serial.print("TotalDesMesures:");Serial.println(TotalDesMesures);
  
  // delay (250);
 }  
}
void Moyenner() {
MoyenneDesHR = ( TotalDesMesures /GrandeurDuTableau);
TotalDesMesures = 0;
Serial.print("MoyenneDesHR :");Serial.println(MoyenneDesHR );
}  

void StockerNouvelleValeur(){
  if(IndexDecriture<(GrandeurDuTableau)){
  TableauHR[IndexDecriture] = THLU;}
  //Serial.print("IndexDecriture :");Serial.println(IndexDecriture);
  IndexDecriture = IndexDecriture +1;
  
if(IndexDecriture==(GrandeurDuTableau-1)){
  IndexDecriture = 0;
   }

  }


void loop() {
 LireDHT22();
 StockerNouvelleValeur();
 Additionner();
 Moyenner();
 delay (1000);
 }
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: manumanu on Jul 28, 2018, 01:18 pm
Salut;
 Pour Le DS18b20 voici un lien pour le datasheet en français.
https://forum.arduino.cc/index.php?topic=381003.0 (https://forum.arduino.cc/index.php?topic=381003.0)
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: hbachetti on Jul 29, 2018, 11:02 am
[quote from destroyedlolo]Maintenant, je ne comprend pas vraiment ton pb : j'ai une 20e de DS18b20 dans ma maison, mais je n'ai jamais eu ce genre de fluctuations, parfois quelques 100e de degré mais jamais plus.[/quote]

+1

Le DS18b20 est précis à 0.5°, mais très stable.
Chez moi mes capteurs utilisent des cartes ARDUINO NANO ou MINI.
Tout est géré par DOMOTICZ et je peux visualiser les courbes de chaque capteur dans le temps.
Les montées et descentes de température n'ont rien d'anormal.
J'ai aussi un MCP9808, précis à 0.25°. Sa courbe de température n'est pas différente de celle des DS18B20.

Je ne mets en oeuvre aucune moyenne et j'utilise la même librairie que toi.


@+
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: destroyedlolo on Jul 29, 2018, 11:59 am
On dérive un peu mais une question que je me pose : qu'est-ce qu'ils entendent par précision ?

Est-ce qu'elles peuvent fluctuer de +/- 0.25° par rapport la valeur absolue (c'est à dire donner au pire une valeur de T-0.25 puis une autre à T+0.25 ?) ?

Ou est-ce que ca veut dire que la valeur est précise à 0.5° par rapport à la valeur absolue mais ensuite ne fluctue pas pour une même température (donc juste un offset) ?

Je serai amené à penser que c'est la 2nd car mes courbes ne montrent que des fluctuations de 0.165° (ou truc du genre) ce qui la résolution de ses 12 bits.
En tout cas, pour les DS18B20 car les DS28EA00 semblent un chouille moins stables mais reste quand même d'une très bonne qualité.

Quoi qu'il en soit, j'ai calibré toutes mes sondes pour compenser cet offset.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: hbachetti on Jul 29, 2018, 12:11 pm
Quote
Ou est-ce que ca veut dire que la valeur est précise à 0.5° par rapport à la valeur absolue mais ensuite ne fluctue pas pour une même température (donc juste un offset) ?
Oui, je pense aussi.

Éventuellement, tu peux faire l'acquisition d'un MCP9808 (https://fr.aliexpress.com/store/product/High-Accuracy-Temperature-Sensor-MCP9808-I2C-Breakout-Board-Module-2-7V-5V-Logic-Voltage-for-Ardunio/1414081_32790695764.html?spm=a2g0w.search0104.3.2.667318deEiyWml&ws_ab_test=searchweb0_0,searchweb201602_2_10152_10151_10065_10344_10068_10342_10343_10340_10341_10696_310_10084_10083_10618_10304_10307_10820_10821_10302_10843_10869_10868_10059_100031_10103_10624_10623_10622_10621_10620_526,searchweb201603_6,ppcSwitch_5&algo_expid=6f3b1c82-41f2-4cbb-8c1a-8ba4f64c7a19-0&algo_pvid=6f3b1c82-41f2-4cbb-8c1a-8ba4f64c7a19&transAbTest=ae803_1&priceBeautifyAB=0) pour faire cette calibration.

@+
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 31, 2018, 11:35 am
Bonjour, suite à ce programme qui fonctionne très bien quand j'appelle ces fonctions recopiées dans mon programme principal, je voudrais maintenant "moyenner" plusieurs températures avec les mêmes fonctions Void en passant des paramètres.

HR pour l'hygrométrie comme c'est le cas dans le code ci dessus.
TC pour TempC
TE pour TempE
Etc.
Le principe est qu'après avoir lu une Température je vais l'écrire dans le tableau qui vas bien (le sien) à l'index qui vas bien (+1 avant d'écrire)
Additioner
Moyenner
Récupérer la nouvelle valeur moyenne.

Mais je ne trouves pas la syntaxe pour que ça marche si on peut paramétrer dans ce genre de void..

Merci de votre aide.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 31, 2018, 11:42 am
 le MCP9808 ne fait que la Température.

Le principe de "moyenner" est utile pour "amortir" les variations du digit situé après la virgule, et si dans le cas de la température de la cave, il varie quelque peu, cela permet de lisser la valeur moyenne de la température et de déclencher la climatisation que sur une REELLE augmentation de la T° et non pas sur une fluctuation de la mesure.

Merci de vous intéresser au sujet.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: destroyedlolo on Jul 31, 2018, 11:46 am
Récupérer la nouvelle valeur moyenne.
Mais je ne trouves pas la syntaxe pour que ça marche si on peut paramétrer dans ce genre de void..
Y'a un pb de concept la :)
void signifie que la fonction ne retourne ... rien. Donc soit elle ne doit pas etre de type void, soit tu sois lui ajouter un parametre de sortie parmi ses arguments.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 31, 2018, 12:00 pm
mon problème est de ne pas créer autant de sous programmes que de valeurs à "moyenner"
Mon idée est donc de "passer" des paramètres si c'est possible pour qu'en utilisant les mêmes sous programmes je remplis le tableau correspondant à la valeur à moyenner, additionner et moyenner la valeur traitée.
Je ne sais pas si je m'exprime correctement.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: destroyedlolo on Jul 31, 2018, 12:34 pm
Ben pas spécialement car je ne vois pas trop ou est le problème ni surtout le rapport avec le void  :) 

Si j'avais a faire ce genre de truc, et qu'il devait pouvoir etre utilisable par plusieurs valeurs, je créerai un objet avec :



Puis une instance de l'objet par valeur a mesurer.
Si tu découpe ton problème en petit morceau comme ça, la programmation devient trivial.

Lorsque tu tombes sur un probleme qui te parait trop compliquer, la solution est souvent (voir toujours) de le découper en pb plus simples.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Jul 31, 2018, 02:52 pm
n'étant pas encore très bon en programmation C+ arduino, je ne vois pas trop de solution.
A partir du croquis que j'ai mis qui "tourne" pour une valeur de température, es tu en mesure de me faire la modif qui me permettrais de faire la moyenne sur 2 voir 3 mesures en utilisant le même programme?;

Es ce qu'un tableau de x lignes (20) pour l'instant et 3 ou 4  colonnes (une par mesure) on peut faire ?.
Merci de ton aide éventuelle.
Title: Re: PROBLEME d'acquisition température stable avec un DS18B20
Post by: AIRPOPCIE on Aug 02, 2018, 08:43 am
J'ai trouvé:

https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c/1896212-les-tableaux


merci pour votre participation à ce forum