Problème capteur température DS18B20 pour gerer la température d'une serre

bonjour à tous,

Je voudrais gérer la température d'une mini serre dans mon jardin en ouvrant plus ou moins une aération grâce à un moteur pas à pas.
Tout est bon, le mécanisme est fait, le circuit imprimé est fait, mais j'ai un problème avec le capteur de température DS18B20(commandé sur ebay).

N'ayant pas de résistance de 4.7K j'ai d’abord essayé sur plaque d'essais de mettre deux résistances de 2.2K en série, donnant 4.4K (pas idéal) tout à bien marché.
Puis j'ai fait le circuit définitif et la j'ai utilisé 3 résistances en parallèle: deux de 10K et une de 100K, en théorie ça donne 4.76 K et avec le testeur j'ai 4.78K mais la ça marche pas aussi bien.

Je capte systématiquement une température de 12.13C° (que le capteur soit branché ou pas).
J'ai trouvé par hasard une astuce : Mesurer rapidement la résistance avec le testeur, et la ça se met à marcher jusqu’à ce que je rallume l'arduino.

Es-ce normal? Pourquoi ça ne marche pas alors que la valeur de mes résistance est bonne à 80 ohms près alors qu'avec un résistance trop faible de 300ohms ça marche ?

Es que ça vous est déjas arrivé ?

Bonjour,
Tu n'es pas dans la bonne rubrique.
Demande au modérateur de déplacer ton sujet
@+

Bonjour,

la valeur de la résistance de pullup n'est pas critique, et n'est sans doute pas responsable de ton problème. As-tu essayé les différents exemples simples que l'on trouve sur la toile pour tester le fonctionnement de ton DS1820 ?

Généralement, les valeurs aberrantes sont plutôt -127 ou 85, c'est étonnant que tu trouves ce type de valeur. Revérifie tes connections. Comment travailles-tu, en mode alimenté normalement ou en mode parasite ?

Cordialement

Bonjours Icare et Lacuzon

J'ai envoyé un message à un modérateur pour demander de déplacer le sujet, désolé pour cette erreur grossière.

J'ai vérifié les connections, tout est bon, le capteur est alimenté normalement, je ne pense pas avoir beaucoup de parasites car le circuit est alimenté le temps de la mise au point par mon ordinateur portable fonctionnant sur batterie, et plus tard par une batterie dédié.

J'ai cherché sur internet si le phénomène a déjà été constaté , mais je 'ai encore rien trouvé de similaire.

Quand le capteur veut bien marcher, la température capté est bonne, j'ai comparé avec un DHT22 et les valeurs correspondent.

Merci pour vos réponses.

Il ne manque plus que le code ...

jogia:
J'ai vérifié les connections, tout est bon, le capteur est alimenté normalement, je ne pense pas avoir beaucoup de parasites c

Non, non, le mode parasite n'a rien à voir avec ceux auxquels tu penses. C'est une manière de connecter le 18B20 pour qu'il s'alimente par la ligne de dialogue plutôt que par sa broche d'alimentation.

Voila le code :

#include <Stepper.h>
#define STEPS 100
//Le moteur (fils 1 2 3 4) est branché sur les sorties 11 10  9 11 de l'Arduino (et sur GND, +V)          
Stepper small_stepper(STEPS, 8, 10, 9, 11);     // Sens horaire                                          
                                                                                                          
#include <OneWire.h>                                                                                      
#include <DallasTemperature.h>                                                                             
#define ONE_WIRE_BUS 13           // Les données du capteur arrivent sur la broche 2 de l'arduino            

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
  
  int  Steps2Take = 0;     // Nombre de pas de rotation demandé au moteur
  long temps =0;           // Durée de rotation pour un tour
  
  //const int pot = 0;     // Broche A0 potentiomètre simulateur température
  const int led = 3;       // Broche 3 LED 
  const int volet = 2;     // Broche 2 capteur fin de course volet (0 = fermé et 1 = ouvert)
 
  const int voulue = 25;   // Température voulue
  const int hyster = 0;    // Ecart toléré de température
  const int posmax = 10;   // Position maximum 
  const int ppp = 400;     // Nombre de pas moteur par position
  const int tactu = 9000;  // Temps d'attente apres mouvement moteur pour actualiser température(² 
  
  float t = 0;             // Temperature mesuré
  int etatv = 0;           // Valeur Capteur FDC, 0 = fermé; 1 = ouvert
  int pos = 0;             // Position angulaire en pas moteur
 
   
void setup() {
  pinMode(volet, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
  sensors.begin();
  Serial.println("POM"); 

 /* while(etatv == LOW){                // tant que le  volet est fermé on ouvre
    small_stepper.setSpeed(120); 
    Steps2Take  = +1;
    small_stepper.step(Steps2Take);  //Ca tourne
   }
  small_stepper.setSpeed(120);       //On ouvre encore un peu
  Steps2Take  = +10;
  small_stepper.step(Steps2Take);    //Ca tourne

  while(etatv == HIGH){              //On ferme jusqu'a ce que le capteur de femeture soit activé
    small_stepper.setSpeed(80); 
    Steps2Take  = -1;
    small_stepper.step(Steps2Take);  //Ca tourne
  }
  pos = 0;*/
}

void loop() {
  sensors.requestTemperatures();                           //On envois un demande de température au capteur   
  t = sensors.getTempCByIndex(0);                          //On lis la température
  //t = analogRead(pot);
  etatv = digitalRead(volet);                              // On regarde si le capteur FDC est activé
  
  if (t < (voulue - hyster) && etatv == HIGH && pos >0){   // Si la température - l'hysteresis est trop basse et que le volet est ouvert on ferme de 2 positions   
    small_stepper.setSpeed(140);                           // Vitesse de 300 (max)
    Steps2Take = -(2*ppp);
    pos = pos -2;                                          // On ferme de 2 positions
    small_stepper.step(Steps2Take);      
    delay(tactu);                                          // On attend que la température se stabilise
 }
 
  if (t > (voulue + hyster) && pos < posmax){              // Si la température + l'hysteresis est trop grande, et qu'il reste de la course, on ouvre de 1 position 
    small_stepper.setSpeed(140);                           // Vitesse de 300 (max)
    Steps2Take = +ppp;
    pos = pos +1;                                          // On ouvre de 1 position
    small_stepper.step(Steps2Take);      
    delay(tactu);                                          // On attend que la température se stabilise
  }
  
  
  Serial.print("Température:");
  Serial.print(t);
  Serial.print("    Etat volet");
  Serial.print(etatv);
  Serial.print("    Position moteur");
  Serial.println(pos);
  
  //digitalWrite(led, LOW);               // On fait clignoter la LED
  //delay(100);
  //digitalWrite(led, HIGH);
}

Il me reste des modifications à faire, j'ai à peine commencé les tests en situation réelle.

Au niveau du branchement: masse du capteur > masse de l'arduino

  • du capteur > +5V arduino
    données > broche 13 de l'arduino

Et il y en plus 3 résistances en parallèle donnant 4.78K entre le + 5V et la broche données du capteur

Et j'utilise un moteur pas à pas et un ULN2003APG pour piloter l'ouverture de la serre.

Autant pour moi fdufnews !

jogia:
Voila le code :

#define ONE_WIRE_BUS 13

Bonsoir
Réponse rapide à chaud
un bus onewire déclaré sur pin 13 UNO AMHA c'est une source d'emme..de 8)

Salut Artouste !
Pourquoi ca ? Sur bread bord ca marchais mais cest peut etre une coincidance...

jogia:
Salut Artouste !
Pourquoi ca ? Sur bread bord ca marchais mais cest peut etre une coincidance...

le pin 13 est sur les boards arduino basiques le pin "dédié" à la led "embarquée"
ce n'est donc pas un pin I/O "neutre" ( y a de la tripaille :grin: )
regarde le programme que tu a posté
en commentaire il est indiqué que le pin2 est utilisé pour le bus onewire
pourquoi a tu modifié l'exemple en passant de 2 à 13 ?
refais un essais avec un pin I/O neutre (pas le 13)

Ah mince! Je ferai une modification demain pour mettre le capteur sur un autre pin pour essayer.

J'ai modifié le pin du capteur pour répartir les composants autour de l'arduino, j’utilise un arduino nano, et que le pin 13 est à côté des pin analogique que je n'utilise pas, donc j'ai la place de ce côté pour les résistances sur le circuit imprimé...

Bonjour,

même réaction que Artouste, j'ajoute, même le choix de la broche 2 me pose problème elle est généralement utilisée pour l'interruption. Il y a plein d'autres broches dispos. Mais je ne suis pas spécialiste, Artouste mon "maître" a sans doute la réponse.

Cordialement

et que le pin 13 est à côté des pin analogique que je n'utilise pas

Mais les pins dites analogiques sont en réalité des pins numériques, sauf A6 et A7 qui ne sont présentes que sur la nano/mini-pro et qui ne sont pas reliées à un port numérique.

C'est une énorme connerie de la part d'Arduino que de les présenter comme des pins uniquement analogiques.

Ce sont des pins numériques qui sont dotées d'une sous-fonction mesure analogique qui n'est mise en service UNIQUEMENT quand on fait appel à la fonction analogRead(X). Tu peux les utiliser avec digitalRead ou digitalWrite. Elles ont même un double référencement soit A0 à A5 soit 14 à 19 exactement comme les pins 1 à 13.
Idem pour l'I2C : A4 et A5 ont encore une autre sous fonction supplémentaire qui est la gestion de l'I2C.

Bon j'ai fait a modification ! Maintenant les données du capteur vont sur le pin 4, et bonne nouvelle: Tout fonctionne bien !

Salut 68tjs, oui je sais, lors d'un autre montage j'avais utilisé les pins dit "analogique" pour piloter un écran lcd, et d'ailleurspour ce montage je n’exclus pas l'idée de rajouter plus tard un écran si le besoin se fait ressentir sur les même pin qui sont tous libre et cote à cote.

Merci à tous pour ces conseils! je me souviendrai d'éviter le pin 13 pour la prochaine fois! :slight_smile: