Go Down

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

manumanu

Bonjour;

JE viens de prendre le sujet a la volé !
Pour mettre au claire sur L'hystérésis

L'hystérésis est une plage de fonctionnement qui définit deux seuils d'état fonctionnement = MARCHE et ARRÊT.
Pour une consigne de température à 25° = Mise en fonction d'un système X. => Définir une consigne d'arrêt du système X à 21°. ++> Cela nous donne un hystérésis de 4°.
 
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

Petit question ?

Pourquoi utilise tu la broche A0 pour la lecture de ton capteur 18B20?
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

manumanu

La méthode de lecture de ton 18b20 me semble étrange.

Quote
// 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];
Peut importe de contrôler le capteur en lui même car un code CRC permet déjà de savoir si la transmission de com est bonne. Et en plus le capteur peut être paramétré pour des seuil de température d'alarme et envoyer un code de défaut.

Comme tu fait des effort de programmation par toi meme voici ce que je te propose.
C'est une fonction pour la lecture de la sonde. Essais de comprendre le fonctionnement et de reprendre les variable a ton gout.
Note tu devra recrée tes propre variable ou utiliser celle qui sont présente.

Code: [Select]
/*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éference.
  //-------------------------------------------------------//

  //----- Code d'instruction du capteur -----//
  while (capteur.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 initialistion.

    //----- Lancer une mesure INITIALISATION. -----//
    capteur.reset();// initialise le bus 1-wire avant la communication avec un capteur donné.
    capteur.select(adresse);// sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction.
    capteur.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 reset va le faire)*/

    //----- Passer en mode LECTURE. -----//
    capteur.reset();// initialise le bus 1-wire avant la communication avec un capteur donné
    capteur.select(adresse);// sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
    capteur.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++) {// Decomposition des bits des 9 octets reçu.
      data[i] = capteur.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 (capteur.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 resolution par defaut. => voir pour l'augmenter.(datasheet)
    float celcius = ((float)brut / 16.0) + offset;

    //----- Ecriture dans fichier -----//
    DataFichier.print(celcius);  DataFichier.print("; "); //Inscription de la valeur de température.
    //Serial.print("ecriture SD "); Serial.print(celcius); Serial.print(";"); // mesure + saut de ligne*/
    //Serial.print("mesure "); Serial.print(celcius); Serial.print(";");  // mesure + saut de ligne*/

  }//While
  //Serial.println();
}
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

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. 

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.
 }
"Apprends moi ce que tu sais je t'apprendrais ce que je sais en nous serons intelligent"

dancex47

il me semble que l'hystérésis n'est pas bien utilisé
Code: [Select]
if (temp >= consigne+hysteresis) {
  ...
   digitalWrite(relay, HIGH); //  MOTEUR ALLUME
 }
 if (temp <= consigne+hysteresis) {
   ...
   digitalWrite(relay, LOW); //  MOTEUR ETEINT
   ...
 }

on a une mitraillette lorsque la mesure = consigne + hystérésis
il faudrait mettre
 if (temp <= consigne) { ...
Bonjour les gens !

Déjà levé que je teste une nouvelle fois suivant vos consignes.
Voici donc le code modifié :
Code: [Select]
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 :-(

Donc j'ai changé de pin > A5 (pour vraiment changer) mais pareil...
LA Pin 1 est inexploitable car toujours HIGH (mais je crois que c'est normal...)
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

dancex47

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.  

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

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

Donc même chose en y insérant ce code
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.


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 !
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

kamill

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
Code: [Select]
if (temp <= consigne+hysteresis) {
mais bien évidemment
Code: [Select]
if (temp <= consigne-hysteresis) {

Tu peux essayer comme ça.

rjnc38

#22
Sep 22, 2016, 08:53 am Last Edit: Sep 22, 2016, 08:55 am by rjnc38
Bonjour les gens !

Déjà levé que je teste une nouvelle fois suivant vos consignes.
Voici donc le code modifié :
Code: [Select]
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

dancex47

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  :)

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

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 ?

dancex47

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  ;)
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 !
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

rjnc38

#26
Sep 22, 2016, 11:27 am Last Edit: Sep 22, 2016, 11:29 am by 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 ???

dancex47

#27
Sep 22, 2016, 11:49 am Last Edit: Sep 22, 2016, 11:54 am by dancex47
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.
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

dancex47

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
"L'imagination est plus importante que le savoir."
                              *Albert Einstein*
Ceci est mon mot d'excuse lorsque je n'en connais pas assez !

kamill


Go Up