[AIDE] Capteur 18B20 (module) plusieurs actions

manumanu:
Pour l’hystérésis je propose plutôt cela.
Je reprends ce que Kamil a fait et je retire l'hystérésis dans la condition de mise en service.

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.
}

Désolé je n'avais pas les autres réponse, merci.

Donc même chose en y insérant ce code

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.

Pas de changement même sur une sortie différente.
J'ai donc tenté de changer de Pin de lecture du 18B20, en le mettant sur le 7 pour exemple, mais IDEM.

manumanu : Honnêtement je débute vraiment, la méthode de lecture du sensor est un copier/coller donc pas vraiment les capacité à comprendre le déroulement exact de la méthode.
Je vais donc m'y pencher ce soir ou demain pour essayer la tienne et je reviendrai donner le(s) résultats.
C'est une piste vu que c'est la fréquence de la lecture du capteur que le relais réagis... étonnant.

Encore merci les gens !

Je viens de m’apercevoir que j'ai fait une grosse erreur sur la gestion de l’hystérésis (argh!! les copié/collé) qui fait que ça ne gère pas du tout d'hystérésis.

ce n'est pas

if (temp <= consigne+hysteresis) {

mais bien évidemment

if (temp <= consigne-hysteresis) {

Tu peux essayer comme ça.

dancex47:
Bonjour les gens !

Déjà levé que je teste une nouvelle fois suivant vos consignes.
Voici donc le code modifié :

 const float consigne=25;

const float hysteresis=0.5;

lcd.setCursor(0, 1);
lcd.print(temp); //Température mesurée réelle
lcd.print(" C");

if (temp >= consigne) {
  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) {
  lcd.setCursor(0, 0);
  lcd.write("Arrosage inactif");

digitalWrite(relay, LOW); //  MOTEUR ETEINT
  digitalWrite(8, HIGH); // VERTE ALLUMEE
  digitalWrite(6, LOW); // ROUGE ETEINTE
}




Verdict ?.................................... IDEM, aucun changement, sauf qu'il déclanche à 25,00°C pile poil comme avant, mais c'est tout :-(

oui mais tu ne fais pas ce que je t'ai dit : il n'y a que la deuxième condition a changer pas la premiere
ou tu fais comme te dit Kamill mais l'écart est 2 fois l'hystérésis (if (temp <= consigne-hysteresis) {)
on est bien d'accord que ton système refroidi (MOTEUR ALLUME) et ne chauffe pas (d'après ton premier post) donc la proposition de manumanu ne peu pas fonctionner

Je vais tester tous ca vers 12h.

*** Cependant, l'hystérésie, si j'ai bien compris le but, c'est d'éviter les ON/OFF intempestif lorsque la valeur (température) vacille autour de la consigne de déclenchement.

+++ C'est donc une excellente solution lors des conditions réelles puisqu'effectivement ce phénomère ce produira.

--- Cependant, ici ce n'est pas le cas, quand je fais mes test, la température passe de 22 à 26°C en 6 secondes environ et c'est volontaire, donc elle passe la consigne et y reste largement au-dessus.
Donc le problème de claquement n'est pas dû à ca, c'est clair (enfin j'pense vraiment non ?)!
Une fois les 25° atteint, que ce soit 25,00 - 26,00 ou jusqu'à 125°C (ex. biensur) ben ca claque toujours et au rythme de la lecture du capteur (c'est ca qui est bizarre... :o )

Pour éliminer ce phénomène, j'ajoute un delay; soit à la lecture de la température, soit à la commande dans le void loop.
Mais évidemment c'est bloquant dans les deux cas, le relais est HIGH pendant cette période, certe, mais le programme est en stanb-by.

Je commence à désespérer... Il y a pire, ce n'est que le début mais je fais des cheveux blanc sur un problème pourtant simple en programmation...

Enfin rassurez-moi, ce type de projet est banal pour débuter ? Ou bien mon idée est fausse ?
C'est sur que pour allumer une LED, la faire clignoter etc... Ouè là c'est facile, mais bon... faut évoluer :slight_smile:

Merci.

Oui l'hystérésis évite les on/off intempestif quand la température est autour de la consigne.

Ton projet est tout à fait banal pour débuter et ne devrait pas poser de problème.
Comment tu passes de 22 à 26 °C ?

kamill:
Oui l'hystérésis évite les on/off intempestif quand la température est autour de la consigne.

Ton projet est tout à fait banal pour débuter et ne devrait pas poser de problème.
Comment tu passes de 22 à 26 °C ?

Merci.

Je le prends dans la main, la température chez moi : 22-23°C environ, le capteur est assez sensible, les mains sont chaudes, les miennes du moins :wink:
Ou alors je le place devant la sortie du ventilateur du PC portable (cf : la vidéo sur précédent post)

Bon ben alors, projet banal, problème banal, c'est ce que je me dis !

pour voir si cela vient de ton code tu commente (ou enlève) la ligne "digitalWrite(relay, LOW); // MOTEUR ETEINT"
le relais ne doit changer d'état qu'une fois puis y rester
au fait c'est quoi ton relais ???

rjnc38:
pour voir si cela vient de ton code tu commente (ou enlève) la ligne "digitalWrite(relay, LOW); // MOTEUR ETEINT"
le relais ne doit changer d'état qu'une fois puis y rester
au fait c'est quoi ton relais ???

Bonne idée, je testerais ca.

Pour le relais c'est indiqué en première page, sinon le voilà : Relais LE voilà : Relais
Je précise qu'il fonctionne très bien lorsque que je met un delay(xxxx), il colle et y reste.

rjnc38 : Ourah ! Donc effectivement le relais reste HIGH !
Et du coup, même si la température redescend il y reste, mais normal.

Donc mon problème viendrai d'où ?

Merci

Mets ton dernier code

kamill:
Mets ton dernier code

De retour au boulot, je testerai demain.

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

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
 }
}

Salut !

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.

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.

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.

Salut. J'arrive pas dormir alors !!!

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.

//***** 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()

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.

#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 ");
}

@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 :wink: 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 !

+++

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.

//----- 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 !!

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.

#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 ");
}

Je m'incline d'excuse !! :confused:
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.

//----- 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;

DS18b20_Datasheet_francais..compressed.pdf (1.05 MB)

Vous êtes des AS ! :slight_smile:

@manumanu :
Alors là ca fonctionne à merveille !
Mon capteur me donne une vraie valeur, parfait m'sieur :wink:
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é :wink:

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.

#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 ");
}