Go Down

Topic: [AIDE] Capteur 18B20 (module) plusieurs actions (Read 4367 times) previous topic - next topic

dancex47

#30
Sep 22, 2016, 02:21 pm Last Edit: Sep 23, 2016, 04:12 pm by dancex47
Mets ton dernier code
De retour au boulot, je testerai demain.

Dois-je mettre CE code en définitive ? (à force... je m'y perd)


Code: [Select]

if (temp >= consigne) { //Conditionnement de mise en service.
   lcd.setCursor(0, 0);
   lcd.write("Arrosage actif  ");

   digitalWrite(8, LOW); //  VERTE ETEINTE
   digitalWrite(6, HIGH); //  ROUGE ALLUMEE
   digitalWrite(relay, HIGH); //  MOTEUR ALLUME
 }
 if (temp <= consigne-hysteresis) { //Conditionnement de mise hors service.
   lcd.setCursor(0, 0);
   lcd.write("Normal");

   //digitalWrite(relay, LOW); //  MOTEUR ETEINT
   digitalWrite(8, HIGH); // VERTE ALLUMEE
   digitalWrite(6, LOW); // ROUGE ETEINTE
 }
}
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

manumanu

Salut !

Quote
donc la proposition de manumanu ne peu pas fonctionner
Effectivement rjnc38 il y a une erreur. il faut retirer l'hystérésis de la consigne.

Code: [Select]

if (temp >= consigne) { //Conditionnement de mise en service.
   digitalWrite(relay, HIGH); // Marche pompe.
 }
 if (temp <= consigne-hysteresis) { //Conditionnement de mise hors service.
   digitalWrite(relay, LOW); // Arrêt pompe.
 }


Après cela si tu refroidis une surface quelle est la température de refroidissement a atteindre ?
Tu pourrais remplacer "consigne-hysteresis" par une autre consigne de température.
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Salut tous ;

Tu devrais utiliser le moniteur série pour déboguer ton programme.

Affiches les séquences de ton programmes et temporise le.

Envoie tout le code SVP.
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Salut. J'arrive pas dormir alors !!!

Code: [Select]
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
pinMode(12, OUTPUT); // LED VERTE


Tu déclare la broche 12 pour ta LED mais celle ci est utile également a l'afficheur LCD change de broche pour ta led verte.

J'ai repris ton premier programme et testé avec mon capteur 18b20 et le même relais => J'ai pas de retour de température ?? la led rouge clignote lors du téléversement et puis plus rien.
En gros !! sa fonctionne pas!!.

la méthode de lecture par un conditionnement qui retourne un état vrais ou faux me semble inapproprié.

J'ai donc adapté ma fonction a ton programme (avec quelques modifs) quitte à pomper un programme sur le net pompe le miens.

Petit conseil déclare des variables a tes broches cela évite a corriger dans tout le programme au cas ou tu change tes câblages. ça rend ton montage plus flexible.

Code: [Select]
//***** Inclusion de bibliothèques.
#include <OneWire.h> //Exploitation Com. One-Wire.
#include <LiquidCrystal.h> //Exploitation LCD

//**** Déclarations des variables constantes
//Broches.
const int BROCHE_ONEWIRE = 9; // Broche affecté à la com 1-Wire
const int relais = 7; //Broche affecté au RELAIS.
const int v = 6; //Broche affecté LedVerte.
const int r = 8; //Broche LedRouge.

//***** Declaration des objets.
//Afficheur L.C.D.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Communication  One-Wire.
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

//**** Déclarations des variables blobales.
float celcius; //Variable de retour température.

//***** Déclaration des tableaux "globales"
byte adresse[8];// Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire.

//**********************************************************************//
void setup() { //Configuration et initialisation.
/*Note: Les test dans le setup() est la pour contrôler le bon fonctionnement des équipements, des branchements et des configurations. Cela évite de chercher des bugs programme alors que le matériels ou les branchements sont en cause*/

  //CONFIGURATION
  //Port série.
  Serial.begin(9600);//Configuration du port série.
  /*Note: Mettre le même réglage au moniteur */
  //Test moniteur.
  Serial.println("***** Moniteur pret *****");//Affichage d'un message avec saut de ligne (ln).
  Serial.println();//Saut de ligne vierge.
  delay(2000);//Temporisation d'affichage.

  //L.C.D.
  lcd.begin(16, 2); //Taille LCD
  //Test de l'affichage ne serra lu qu'une seule fois
  //par l'exécution unique du setup()
  //TEXTE (Démarrage)
  lcd.setCursor(0, 0);
  lcd.print("Bonjour !");
  lcd.setCursor(0, 1);
  lcd.print("    Demarrage...");
  delay(2000);
  lcd.clear();

  //Broches.
  pinMode(v, OUTPUT); // Configuration de la broche en sortie.
  pinMode(r, OUTPUT); // Configuration de la broche en sortie.
  pinMode(relais, OUTPUT); // Configuration de la broche en sortie.
  //Test des LEDs et relais.
  digitalWrite(relais, HIGH); // Allumage.
  digitalWrite(v, HIGH);      // Allumage.
  digitalWrite(r, HIGH);      // Allumage.
  delay(3000);//Temporisation de contrôle.
  digitalWrite(relais, LOW);  // Extinction.
  digitalWrite(v, LOW);       // Extinction.
  digitalWrite(r, LOW);       // Extinction.

  //DS18b20.
  mesure(); //Appel de la fonction de mesure.
  Serial.println("***** Capteur pret *****");//Affichage d'un message avec saut de ligne (ln).
  Serial.println();//Saut de ligne vierge.
  delay(2000);//Temporisation d'affichage.

}//Fin de setup.

//**********************************************************************//
void loop() {
  //**** Déclarations des variables globales.
  const float consigne = 25; //Donnée de la variable de consigne.
  const int hysteresis = 2; //Donnée de la variable de hystérésis .

  //Acquisition de mesure T°.
  mesure(); //Appel de la fonction de mesure.
  delay(3000);//Temporisation de lecture.

  //Affichage fonctionnel.

  //1er État => Température normale = Repos.
  if (celcius < consigne - hysteresis) { //Conditionnement de mise hors service.

    //Affichage L.C.D.
    lcd.setCursor(0, 0);//Pointage du curseur.
    lcd.write("Normal");//Affichage message lcd.

    //Moteur.
    digitalWrite(relais, LOW); //  MOTEUR ÉTEINT

    //LEDs.
    digitalWrite(v, HIGH); // VERTE ALLUMÉE
    digitalWrite(r, LOW); // ROUGE ÉTEINTE

    //Affichage moniteur série.
    Serial.print("*** Arret arrosage (relais off) *** / Temp = "); //Affichage de la séquence de travail.
    Serial.println(celcius); //Affichage de la température actuelle.
    Serial.println(); //Saut de ligne vierge.
    delay(3000);//Temporisation de lecture.

  }//if

  //2em État => Température haute = Activations.
  if (celcius > consigne) { //Conditionnement de mise en service.

    //Affichage L.C.D.
    lcd.setCursor(0, 0);//Pointage du curseur.
    lcd.write("Arrosage actif");//Affichage message lcd.

    //Moteur.
    digitalWrite(relais, HIGH); //  MOTEUR ALLUMÉE

    //LEDs
    digitalWrite(v, LOW); //  VERTE ÉTEINTE
    digitalWrite(r, HIGH); //  ROUGE ALLUMÉE

    //Affichage moniteur série.
    Serial.print("*** Marche arrosage (relais on) *** / Temp = "); //Affichage de la séquence de travail.
    Serial.println(celcius); //Affichage de la température actuelle.
    Serial.println(); //Saut de ligne vierge.
    delay(3000);//Temporisation de lecture.
  }//if

}//fin de loop.*/

/*Fonction de gestion des capteurs 18DSB20. */

void mesure() {

  //----- Déclaration des variables fonctionnel locale -----//
  byte data[12];// Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
  const float offset = -2; //Correction de la température sur valeurs de référence.
  //-------------------------------------------------------//

  //----- Code d'instruction du capteur -----//
  while (ds.search(adresse) == true) { //Contrôle de la présence des capteurs.
    const int lancerMesure = 0x44; //Code hexa.=> Datasheat => Initialise et lance une mesure de la température.
    const int modeLecture = 0xBE; //Code hexa.=> Datasheat => lecture des neuf registres (scratchpad) du capteur transmis après initialisation.

    //----- Lancer une mesure INITIALISATION. -----//
    ds.reset();// initialise le bus 1-wire avant la communication avec un capteur donné.
    ds.select(adresse);// sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction.
    ds.write(lancerMesure, 1); // lance la mesure et alimente le capteur par la broche de donnée.

    //----- Pause -----//
    delay(760);// au moins 750 ms
    /*(+ il faudrait mettre une instruction capteur.depower ici, mais le re-set va le faire)*/

    //----- Passer en mode LECTURE. -----//
    ds.reset();// initialise le bus 1-wire avant la communication avec un capteur donné
    ds.select(adresse);// sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
    ds.write(modeLecture, 1); // passe en mode lecture de la RAM du capteur

    //----- Les 9 octets de la RAM (appelé Scratchpad) -----//
    for ( int i = 0; i < 9; i++) {// Décomposition des bits des 9 octets reçu.
      data[i] = ds.read();// lecture de l'octet de rang i stocké dans tableau data
    }//for

    //----- Test de validité des valeurs reçues par contrôle du code CRC -----//
    /*le dernier (9ème) octet de la RAM est un code de contrôle CRC à l'aide de la fonction crc8 on peut vérifier si ce code est valide */
    if (ds.crc8( data, 8) != data[8]) {
      Serial.print("-!! CRC non valide !!-");//Validation du code CRC.
      break;
    }//if

    //----- Conversion de la valeur brut -----//
    int16_t brut = (data[1] << 8) | data[0];//"brut" retour valeur.
    brut = brut << 3;// 9 bit de résolution par defaut. => voir pour l'augmenter.(datasheet)
    celcius = ((float)brut / 16.0) + offset;
    Serial.print("Temperature actuelle: ");
    Serial.println(celcius);
    Serial.println();
  }
}//fin de mesure()


 


"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

kamill

#34
Sep 23, 2016, 09:12 am Last Edit: Sep 23, 2016, 10:13 am by kamill
Bon, après en avoir longtemps discuté avec moi même je suis (presque) convaincu que le problème est celui que je t'avais signalé au début: tu fais le traitement même quand la valeur retournée par getTemperature est false (dans ce cas temp vaut 0)
Pour une raison inconnue (ou connue des seuls initiés) ce cas doit se produire assez souvent

Essaies le code ci dessous qui test le retour de getTemperature pour faire le traitement.
Code: [Select]
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE A0 // Broche utilisée pour le bus 1-Wire

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean unefois = false;
boolean unefois1 = false;

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//KY019 5V relay module
int relay = 7; // relay turns trigger signal - active high;

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  lcd.begin(16, 2); //Taille LCD
  pinMode(6, OUTPUT); // LED VERTE
  pinMode(8, OUTPUT); // LED ROUGE
  pinMode(relay, OUTPUT); // Relais sortie
}

// loop()
void loop() {

  if (!unefois) {
    //Affichage TEXTE (Nom du produit) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("  * X-Fresh *");
    lcd.setCursor(0, 1);
    lcd.print(" Version : 1.0");
    delay(4000);
    lcd.clear();
    unefois = true;
  }

  if (!unefois1) {
    //Affichage TEXTE (Démarrage) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("Bonjour !");
    lcd.setCursor(0, 1);
    lcd.print("    Demarrage...");
    delay(1000);
    lcd.clear();
    unefois1 = true;
  }

  float temp;

  // Lit la température ambiante à ~1Hz

  bool cr = getTemperature(&temp);

  // Affiche la température
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.write(176); // caractère °
  Serial.write('C');
  Serial.println();

  if (!cr)
    return;           // !!!!!!! On ne fait pas le traitement

  const float consigne=25;
  const float hysteresis=0.5;
 
  // Action au-dela de 25°C enclanche relais
  if (temp >= consigne) { //Conditionnement de mise en service.
    lcd.setCursor(0, 0);
    lcd.write("Arrosage actif");

    digitalWrite(8, LOW); //  VERTE ETEINTE
    digitalWrite(6, HIGH); //  ROUGE ALLUMEE
    digitalWrite(relay, HIGH); //  MOTEUR ALLUME
  }
  if (temp <= consigne - hysteresis) { //Conditionnement de mise hors service.
    lcd.setCursor(0, 0);
    lcd.write("Normal        ");

    //digitalWrite(relay, LOW); //  MOTEUR ETEINT
    digitalWrite(8, HIGH); // VERTE ALLUMEE
    digitalWrite(6, LOW); // ROUGE ETEINTE
  }
  lcd.setCursor(0, 1);
  lcd.print(temp);
  lcd.print(" C ");
}

dancex47

@manumanu : Alors comment te dire que j'arrive à lire clairement ton code, c'est propre, ordonné, bref largement lisible pour un débutant.
Les commentaires sont vraiment utiles et grace à ca je vais pouvoir avancer de manière plus constructive !
Ce soir je test tous cela (trop de boulot entre 12-14h)... et je ferai un retour rapide  ;)  Encore merci !

@kamill : Je ferai le test avec ton code pour voir également l'effet (LA solution?) que ca aura !

Dans tous les cas je ferais vos tests !

+++
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

manumanu

Salut tous!

La solution du code d'origine ne fonctionne pas. Avec mon montage pas de retour de température!!.
J'essaie de le faire fonctionner.
 
Petite question tout de même (dans le doute) => La fonction getTemperature() renvoie vrais ou faux donc comment fait on pour retourné la donnée qui nous est utile, a l'occurance la température?
Je pense qu'il ne faut pas insisté avec la méthode d'origine.

dancex47 je suis conscient que cela fait beaucoup de chose a intégrer d'un coup surtout pour ce capteur j'ai moi même mis au moins 1 mois pour le maitriser.
=>tu peut tester les capteurs présent sur ta ligne 1-Wire. Il est possible d'en avoir plusieurs sur le bus.

Insère cela dans le setup et déclare la variable int compt = 0; en local du setup.
Code: [Select]
//----- Détection des capteurs présents sur le bus One Wire -----//
  Serial.println("***Capteurs***");
  while (ds.search(adresse) == true) {
    /* Tant qu'un nouveau capteur est détecté la fonction search renvoie la valeur VRAI si un élément 1-wire est trouvé. Stocke son adresse dans le tableau adresse
      adresse correspond à l'adresse de début du tableau "adresse[8]" déclaré ... */

    // TEST de mise en place.
    compt++; // incrémente la variable de comptage du nombre de capteurs / exécuté pour chaque capteur détecté
    Serial.print ("Numero "); Serial.print (compt); //Affichage du nombre de capteurs.

    //----- Affichage des 64 bits d'adresse au format hexadécimal -----//
    Serial.print (": Code: ");// Affichage message complémentaire.
    for (int i = 0; i < 8; i++)  { // l'adresse renvoyée par la fonction search est stockée sur 8 octets.
      if (adresse[i] < 16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal.
      Serial.print(adresse[i], HEX); Serial.print(" "); // affiche 1 à 1 les 8 octets du tableau adresse au format hexadécimal + espace.
    }//for.
     Serial.println();//Saut de ligne vierge.
  }//while.

  J'ai posté une traduction du datasheet du DS18b20 que tu trouveras dans le forums des TUTOS cela t'aidera a mieux comprendre le pourquoi des actions programmés et ce qu'est le 1-wire.
Bon courage !!
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Ca y est j'ai ciblé le problème dans le programme d'origine.
J'ai intégré des commentaire retourné au moniteur (et ajouté les accolades {} au conditionnements) => Voir le code.
La fonction nous retourne FAUX a deux endroit ==> A l'identification et a la recherche des capteurs.
Donc j'ai comme valeur de température 0.00c°
Je continue.

Code: [Select]
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 9 // Broche utilisée pour le bus 1-Wire

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean unefois = false;
boolean unefois1 = false;

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//KY019 5V relay module
int relay = 7; // relay turns trigger signal - active high;

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    Serial.println("Recherche faux");
    Serial.println();
    return false;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]){ // Vérifie que l'adresse a été correctement reçue
    Serial.print("crc faux");
    Serial.println();
    return false; // Si le message est corrompu on retourne une erreur
  }
 
  if (addr[0] != DS18B20){ // Vérifie qu'il s'agit bien d'un DS18B20
    Serial.print("Identite faux");
    Serial.println();
    return false;         // Si ce n'est pas le cas on retourne une erreur
  }
 
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  lcd.begin(16, 2); //Taille LCD
  pinMode(6, OUTPUT); // LED VERTE
  pinMode(8, OUTPUT); // LED ROUGE
  pinMode(relay, OUTPUT); // Relais sortie
}

// loop()
void loop() {

  if (!unefois) {
    //Affichage TEXTE (Nom du produit) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("  * X-Fresh *");
    lcd.setCursor(0, 1);
    lcd.print(" Version : 1.0");
    delay(4000);
    lcd.clear();
    unefois = true;
  }

  if (!unefois1) {
    //Affichage TEXTE (Démarrage) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("Bonjour !");
    lcd.setCursor(0, 1);
    lcd.print("    Demarrage...");
    delay(1000);
    lcd.clear();
    unefois1 = true;
  }

  float temp;

  // Lit la température ambiante à ~1Hz

  bool cr = getTemperature(&temp);

  // Affiche la température
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.write(176); // caractère °
  Serial.write('C');
  Serial.println();

  if (!cr)
    return;           // !!!!!!! On ne fait pas le traitement

  const float consigne=25;
  const float hysteresis=0.5;
 
  // Action au-dela de 25°C enclanche relais
  if (temp >= consigne) { //Conditionnement de mise en service.
    lcd.setCursor(0, 0);
    lcd.write("Arrosage actif");

    digitalWrite(8, LOW); //  VERTE ETEINTE
    digitalWrite(6, HIGH); //  ROUGE ALLUMEE
    digitalWrite(relay, HIGH); //  MOTEUR ALLUME
  }
  if (temp <= consigne - hysteresis) { //Conditionnement de mise hors service.
    lcd.setCursor(0, 0);
    lcd.write("Normal        ");

    //digitalWrite(relay, LOW); //  MOTEUR ETEINT
    digitalWrite(8, HIGH); // VERTE ALLUMEE
    digitalWrite(6, LOW); // ROUGE ETEINTE
  }
  lcd.setCursor(0, 1);
  lcd.print(temp);
  lcd.print(" C ");
}
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Je m'incline d'excuse !! :smiley-confuse:
La recherche fonctionne mon capteur est de type DS18s20 et non pas b.

Par contre la recherche de capteur est toujours FAUX.

J'applique plutôt c'ette méthode en référence au datasheet.
Code: [Select]
//----- test du type de capteur -----//
      //le type du capteur est donné par le 1er octet du code adresse 64 bits / Valeur 0x28 pour capteur type DS18B20, 0x10 pour type DS18S20, 0x22 pour type DS1820
      if (addr[0] == 0x28) Serial.println ("Type de capteur temperature : DS18B20.");    // Désactivé car utile seulement en TEST
      if (addr[0] == 0x10) Serial.println ("Type de capteur : DS18S20.");              //
      if (addr[0] == 0x22) Serial.println ("Type de capteur temperature : DS1820.");     // Desactivé car utile seulement en TEST---*/


Cela permet juste d'identifier le type capteur. L'identification du capteurs ne doit pas bloqué un programme et resté a titre indicatif car la com 1-wire est la même pour tous la chose qui change ce sont les fonctionnalités entre elles.

De plus si l'on connait déjà le modèle de sonde commandé je "dirais" que cela est inutile mais bon a intégré dans son programme si l'on souhaite le partagé.

J'ai trouvé le datasheet (Ça faisait longtemps)

Je continu;
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

dancex47

Vous êtes des AS ! :-)

@manumanu :
Alors là ca fonctionne à merveille !
Mon capteur me donne une vraie valeur, parfait m'sieur ;-)
JE vais repartir bosser là, mais je me pencherai sur le problème exacte !

A plus tard et merci encore c'est du boulot et ta assuré ;-)


Ca y est j'ai ciblé le problème dans le programme d'origine.
J'ai intégré des commentaire retourné au moniteur (et ajouté les accolades {} au conditionnements) => Voir le code.
La fonction nous retourne FAUX a deux endroit ==> A l'identification et a la recherche des capteurs.
Donc j'ai comme valeur de température 0.00c°
Je continue.

Code: [Select]
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 9 // Broche utilisée pour le bus 1-Wire

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean unefois = false;
boolean unefois1 = false;

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//KY019 5V relay module
int relay = 7; // relay turns trigger signal - active high;

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    Serial.println("Recherche faux");
    Serial.println();
    return false;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]){ // Vérifie que l'adresse a été correctement reçue
    Serial.print("crc faux");
    Serial.println();
    return false; // Si le message est corrompu on retourne une erreur
  }
  
  if (addr[0] != DS18B20){ // Vérifie qu'il s'agit bien d'un DS18B20
    Serial.print("Identite faux");
    Serial.println();
    return false;         // Si ce n'est pas le cas on retourne une erreur
  }
  
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  lcd.begin(16, 2); //Taille LCD
  pinMode(6, OUTPUT); // LED VERTE
  pinMode(8, OUTPUT); // LED ROUGE
  pinMode(relay, OUTPUT); // Relais sortie
}

// loop()
void loop() {

  if (!unefois) {
    //Affichage TEXTE (Nom du produit) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("  * X-Fresh *");
    lcd.setCursor(0, 1);
    lcd.print(" Version : 1.0");
    delay(4000);
    lcd.clear();
    unefois = true;
  }

  if (!unefois1) {
    //Affichage TEXTE (Démarrage) une seule fois
    lcd.setCursor(0, 0);
    lcd.print("Bonjour !");
    lcd.setCursor(0, 1);
    lcd.print("    Demarrage...");
    delay(1000);
    lcd.clear();
    unefois1 = true;
  }

  float temp;

  // Lit la température ambiante à ~1Hz

  bool cr = getTemperature(&temp);

  // Affiche la température
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.write(176); // caractère °
  Serial.write('C');
  Serial.println();

  if (!cr)
    return;           // !!!!!!! On ne fait pas le traitement

  const float consigne=25;
  const float hysteresis=0.5;
 
  // Action au-dela de 25°C enclanche relais
  if (temp >= consigne) { //Conditionnement de mise en service.
    lcd.setCursor(0, 0);
    lcd.write("Arrosage actif");

    digitalWrite(8, LOW); //  VERTE ETEINTE
    digitalWrite(6, HIGH); //  ROUGE ALLUMEE
    digitalWrite(relay, HIGH); //  MOTEUR ALLUME
  }
  if (temp <= consigne - hysteresis) { //Conditionnement de mise hors service.
    lcd.setCursor(0, 0);
    lcd.write("Normal        ");

    //digitalWrite(relay, LOW); //  MOTEUR ETEINT
    digitalWrite(8, HIGH); // VERTE ALLUMEE
    digitalWrite(6, LOW); // ROUGE ETEINTE
  }
  lcd.setCursor(0, 1);
  lcd.print(temp);
  lcd.print(" C ");
}

"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

manumanu

Pour conclure.

La conversion est fausse le résultat que j'obtiens est différent de ma conversion.

La méthode de recherche capteur aussi n'est pas bonne. On lui demande de contrôler si la recherche est différente de 0 ce qui ne peut pas être le cas. la recherche est vrais tout le temps qu'il retrouve les adresses inscrite dans le tableau.

Test confirmé en modifiant par:
Code: [Select]
if (ds.search(addr) == false) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    Serial.println("Recherche faux");
    Serial.println();
    return false;         // Retourne une erreur
  }//*/


Et la plus de de défaut et lecture possible.

Conclusion:
La recherche des capteurs est a revoir.
L'identification est a voir.
La méthode de contrôle de retour de donnée T° est a revoir (vrais ou faux) l'acquisition peut être contrôler par le crc ===> Mais cela reste également à  l'appréciation de chacun.

Je ne suis pas le seul a t'avoir aidé et il te reste du travail. Merci Kamil pour l'hystérésis.


 
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Je vais poster mon travail sur le DS18b20. Cela pourra aidé je constate que pas mal de monde l'utilise.

Petit conseil: Essais de te documenté au travers des datasheet sur les composant que tu utilise. La traduction n'est plus un gros problème depuis Google traduction.
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

dancex47

Pour conclure.

La conversion est fausse le résultat que j'obtiens est différent de ma conversion.

La méthode de recherche capteur aussi n'est pas bonne. On lui demande de contrôler si la recherche est différente de 0 ce qui ne peut pas être le cas. la recherche est vrais tout le temps qu'il retrouve les adresses inscrite dans le tableau.

Test confirmé en modifiant par:
Code: [Select]
if (ds.search(addr) == false) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    Serial.println("Recherche faux");
    Serial.println();
    return false;         // Retourne une erreur
  }//*/


Et la plus de de défaut et lecture possible.

Conclusion:
La recherche des capteurs est a revoir.
L'identification est a voir.
La méthode de contrôle de retour de donnée T° est a revoir (vrais ou faux) l'acquisition peut être contrôler par le crc ===> Mais cela reste également à  l'appréciation de chacun.

Je ne suis pas le seul a t'avoir aidé et il te reste du travail. Merci Kamil pour l'hystérésis.


 
Ah mais biensur, merci kamill je l'ai fais il me semble et d'ailleurs je continue mes recherches pour le faire évoluer. Je vais d'ailleurs avoir certainement besoin encore, j'ai câblé le LCD mais il ne s'allume même pas... enfin j'ai pas branché le rétro-éclairage donc bon... :-)

Cependant, pour débuter, je me contente de mettre les codes de chaque éléments (ici le 18B20) en copier/coller sur différents site, en l'occurrence le miens provenais de ce site (je crois) : Méthode lecture 18B20

Encore merci à vous tous, fier de faire partis de cette petite communauté d'utilisateur d'Arduino (et dérivés) :-)

Donc loin de me douter qu'il ne serai pas bon...  :smiley-confuse:
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

manumanu

Quote
Encore merci à vous tous, fier de faire partis de cette petite communauté d'utilisateur d'Arduino (et dérivés) :-)
Organise et commente tes programmes et tu verra les choses clairement !!
Quant tu configure n'oublie pas de faire par la suite des tests d'équipements dans le setup avant de lancer ton programme principale. Inutile de lancer un programme si la température n'est pas bonne par défaut de configuration ou de connexion.

Utilise le MONITEUR SERIE pour débogué et contrôler le fonctionnement.

Bonne continuation !! tu vas t'amuser de plus en plus tu verra! et chacun à son domaine d'expérience. le miens est plutôt bon avec le DS18b20. :)


A plus!
 
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

Go Up