Erreur deuxième sonde température DS18B20

Bonjour,

mon programme est fonctionnel, alors j'ai décidé de mettre une sonde à l'extérieur juste pour le retenir de données pour faire une comparaison entre deux lieux. Mais au bout de 2-3 minutes le programme est saturé et la deuxième sonde se met en erreur.

l'idée de mon programme est de récuperer deux tempartures grace à mes sondes, de les imprimer avec la température et de l'enregistrer dans la carte SD.

dans le meme temps de l'afficher dans un afficheur 4 segments, avec les valeurs min temp actuelle, max et temp exterieur.
prévoyez-vous m'aider ?

cordialement

voici mon code

 #include <TM1637Display.h> //afficheur
#include <SD.h> //carte SD
#include <OneWire.h>
#include <DallasTemperature.h> // température
//horloge temps réel
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//fin horloge temps réel 

#define SONDE1 A0
#define SONDEEXT A5 // Sonde exterieur 
#define CLK 2 // Connexion écran
#define DIO 3 // connexion écran
#define sdCardPinChipSelect   10     //pin de la carte SD  
File monFichier;

const char* nomDuFichier            = "donnees.csv";
const long delaiIntervalleDeMesures = 3000;  
const int ledbleu = 9; // Définition de la broche numéro 2.
const int ledverte = 8; // Définition de la broche numéro 2.
const int ledblanche = 7; // Définition de la broche numéro 2.
const int ledtempext = 6; // Définition de la broche numéro 2.


float tempmin=100;     //Temperature min
float tempmax=0;       //Temperature max
int tmin; // essai de prises toutes les 10 min 
int tatt;

// Create degree celsius symbol
const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Degree symbol
  SEG_A | SEG_D | SEG_E | SEG_F   // C
};

OneWire oneWire_in(SONDE1);
OneWire oneWire_out(SONDEEXT);

DallasTemperature sensor_interieur(&oneWire_in);
DallasTemperature sensor_exterieur(&oneWire_out);

//voies de l'afficheurs
TM1637Display display(CLK, DIO);


void setup() {

 pinMode(ledbleu, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledblanche, OUTPUT);
  pinMode(ledtempext, OUTPUT);
  
sensor_inhouse.begin();
sensor_outhouse.begin();
  // On initialise la connexion série
  Serial.begin(9600);
  delay(4000);

  
  Serial.println("TEST");
  Serial.println(F("Programe de test de lecture/écriture de fichier sur Carte SD, reliée à un Arduino Uno"));
  Serial.println(F("==="));
  Serial.println();

  display.setBrightness(0x0f);

  //test si la carte SD marche 
Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println(F("Échec de l'initialization !"));
    while (1);    // Boucle infinie (stoppage du programme)
  }
  Serial.println(F("Initialisation terminée."));
  Serial.println();
//programme qui vérifie heure et permet la mise à jour si soucis//
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
  
  // Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   /*rtc.adjust(DateTime(2022, 2, 1, 16, 15, 0));*/
    

  }
  }

void loop() {

// lecture de l'heure 

DateTime now = rtc.now();
    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

  // put your main code here, to run repeatedly:
 Serial.print("Requesting temperatures...");
sensor_interieur.requestTemperatures();
double tempint = sensor_interieur.getTempCByIndex(0);

delay (2000);

Serial.print("température interieur ");
Serial.print(tempint); 

delay (3000);

sensor_exterieur.requestTemperatures();
double tempext = sensor_exterieur.getTempCByIndex(0);

delay (3000);
Serial.print("température extérieur ");
Serial.print(tempext); 

if (tempint < tempmin) {tempmin = tempint;} //Calcul temperature mini
if (tempint > tempmax) {tempmax = tempint;} //Calcul temperature maxi

Serial.print("température maximum ");
Serial.print (tempmax); 
Serial.println("°C");

Serial.print("température minimum ");
Serial.print (tempmin); 
Serial.println("°C");

 if (tatt > now.minute ())
{
  Serial.print ("case attente");
  delay (1000) ;
  Serial.print ("condition numéro 1 => si le T + 1 minutes est supérieur à l'heure actuelle alors attendre min: ");
  Serial.print (tmin+2);
  
// afficheur 8 segments de la lecture de la derniere température
  int temperature = tempint;
  display.showNumberDec(temperature, false, 2, 0);
  display.setSegments(celsius, 2, 2);
  digitalWrite(ledblanche, LOW);
  digitalWrite(ledverte, HIGH);
  digitalWrite(ledbleu, LOW);
  digitalWrite(ledtempext, LOW);
  delay (4000);
  display.showNumberDec(tempmax, false, 2, 0);
   digitalWrite(ledblanche, HIGH);
  digitalWrite(ledverte, LOW);
  digitalWrite(ledbleu, LOW);
  digitalWrite(ledtempext, LOW);
  delay (4000);
  display.showNumberDec(tempmin, false, 2, 0);
  digitalWrite(ledblanche, LOW);
  digitalWrite(ledverte, LOW);
  digitalWrite(ledbleu, HIGH);
  digitalWrite(ledtempext, LOW);
  delay (4000);
  display.showNumberDec(tempext, false, 2, 0);
  digitalWrite(ledblanche, LOW);
  digitalWrite(ledverte, LOW);
  digitalWrite(ledbleu, LOW);
  digitalWrite(ledtempext, HIGH);

  

  
}


else
{
Serial.print ("case impression");

monFichier=SD.open(nomDuFichier, FILE_WRITE);
monFichier.print(tempint), monFichier.print(";"); 

monFichier.print(tempext), monFichier.print(";"); 

monFichier.print(now.month ()), monFichier.print(";");

monFichier.print(now.day ()), monFichier.print(";");

monFichier.print(now.hour ()), monFichier.print(";");

monFichier.print(now.minute() ), monFichier.print(";");

monFichier.println(); // saut de ligne 

monFichier.close();

Serial.println();

delay (5000);
int tmin =  (now.minute() );
if (tmin >55) {tmin = 1;} // permet de dire si le temps en minutes est supérieur à 55 qu'il est égale à 1 car sinon on va dépasser les 60. 
tatt = tmin + 4; //Modifier le 3 pour définir le temps entre les mesures. 

Serial.print ("donnée imprimé float tmin + heure actuelle   = ");
Serial.print (tatt);
Serial.print ("min");

} 
} 

Quelle est la longueur des fils de la sonde extérieur ? Quel type de fils utilises-tu ?

,

Bonjour,
ca fait beaucoup de delay(...) dans ton code. tu fais une action tu attends 2s puis une autre et tu re attends 3s ect : au total tu attends plus de 20 secondes, selon les cas, pendant lesquelles rien ne se passe.
Regarde pour les remplacer par millis() non bloquant

un petit ctrl + t pour rendre ton code plus lisible

bonjour, merci de ta réponse je ne m'attendais pas à ce que cela aille si vite. J'utilise les fils Arduino, et la sonde est câblé avec les câbles d'origines.

bonjour, merci pour la réponse.

je vais améliorer ca :slight_smile: !!

Penses-tu que cela changera dans la proportion de mon Arduino ? je suis à 75% de la mémoire flash et je suppose que les bugs viennent de là

et la longueur des fils ?

environ 1 mètre

Quelle carte utilises tu ?

Dans setup , tu écris :
sensor_inhouse.begin(); sensor_outhouse.begin();
Ça ne correspond pas à ce que tu déclares plus haut

J'ai une Carte Arduino Uno,

voici le bon code, qui est "fonctionnel" mais ou la sonde me lache dans les 2 minutes suivantes.

#include <TM1637Display.h> //afficheur
#include <SD.h> //carte SD
#include <OneWire.h>
#include <DallasTemperature.h> // température
//horloge temps réel
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;


#define SONDE1 A0
#define SONDEEXT A5 // Sonde exterieur 
#define CLK 2 // Connexion écran
#define DIO 3 // connexion écran
#define sdCardPinChipSelect   10     //pin de la carte SD  
File monFichier;

const char* nomDuFichier            = "donnees.csv";
const long delaiIntervalleDeMesures = 3000;
const int ledbleu = 9; // Définition de la broche numéro 2.
const int ledverte = 8; // Définition de la broche numéro 2.
const int ledblanche = 7; // Définition de la broche numéro 2.
const int ledtempext = 6; // Définition de la broche numéro 2.


float tempmin = 100;   //Temperature min
float tempmax = 0;     //Temperature max
int tmin; // essai de prises toutes les 10 min
int tatt;

// Create degree celsius symbol
const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Degree symbol
  SEG_A | SEG_D | SEG_E | SEG_F   // C
};

OneWire oneWire_in(SONDE1);
OneWire oneWire_out(SONDEEXT);

DallasTemperature sensor_interieur(&oneWire_in);
DallasTemperature sensor_exterieur(&oneWire_out);
//voies de l'afficheurs
TM1637Display display(CLK, DIO);


void setup() {

  pinMode(ledbleu, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledblanche, OUTPUT);
  pinMode(ledtempext, OUTPUT);

  Serial.begin(9600);
  delay(4000);

  display.setBrightness(0x0f);

  sensor_interieur.begin();
  sensor_exterieur.begin();

  //test si la carte SD marche
  Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println(F("Échec de l'initialization !"));
    while (1);    // Boucle infinie (stoppage du programme)
  }
  Serial.println(F("Initialisation terminée."));
  Serial.println();
  //programme qui vérifie heure et permet la mise à jour si soucis//
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");

    // Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    /*rtc.adjust(DateTime(2022, 2, 1, 16, 15, 0));*/

  }



  // On initialise la connexion série
  Serial.begin(9600);
  delay(4000);
}

void loop() {

  // lecture de l'heure

  DateTime now = rtc.now();
  Serial.println("Current Date & Time: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();


  sensor_interieur.requestTemperatures();
  double tempint = sensor_interieur.getTempCByIndex(0);

  delay (2000);

  Serial.print("tinterieur ");
  Serial.print(tempint);

  delay (3000);

  sensor_exterieur.requestTemperatures();
  double tempext = sensor_exterieur.getTempCByIndex(0);
  delay (3000);
  Serial.print("textérieur ");
  Serial.print(tempext);
  if (tempint < tempmin) {
    tempmin = tempint; //Calcul temperature mini
  }
  if (tempint > tempmax) {
    tempmax = tempint; //Calcul temperature maxi
  }
  Serial.print("tmaximum ");
  Serial.print (tempmax);
  Serial.print("tminimum ");
  Serial.print (tempmin);
  if (tatt > now.minute ())
  {
    Serial.print ("case attente");
    delay (1000);

    // afficheur 8 segments
    int temperature = tempint;
    display.showNumberDec(temperature, false, 2, 0);
    display.setSegments(celsius, 2, 2);
    digitalWrite(ledblanche, LOW);
    digitalWrite(ledverte, HIGH);
    digitalWrite(ledbleu, LOW);
    digitalWrite(ledtempext, LOW);
    delay (4000);
    display.showNumberDec(tempmax, false, 2, 0);
    digitalWrite(ledblanche, HIGH);
    digitalWrite(ledbleu, LOW);
    delay (4000);
    display.showNumberDec(tempmin, false, 2, 0);
    digitalWrite(ledblanche, LOW);
    digitalWrite(ledbleu, HIGH);
    delay (4000);
    display.showNumberDec(tempext, false, 2, 0);
    digitalWrite(ledbleu, LOW);
    digitalWrite(ledtempext, HIGH);
  }


  else
  {
    Serial.print ("case impression");
    monFichier = SD.open(nomDuFichier, FILE_WRITE);
    monFichier.print(tempint), monFichier.print(";");
    monFichier.print(tempext), monFichier.print(";");
    monFichier.print(now.month ()), monFichier.print(";");
    monFichier.print(now.day ()), monFichier.print(";");
    monFichier.print(now.hour ()), monFichier.print(";");
    monFichier.print(now.minute() ), monFichier.print(";");
    monFichier.println();
    monFichier.close();
    Serial.println();
    delay (5000);
    int tmin =  (now.minute() );
    if (tmin > 55) {
      tmin = 1; //
    }

pensez vous que c'est dû aux nombreuses fonctions "Delay" ?

comment je peux simplifier le programme pour que mon Arduino ne sature pas ?

tatt n'est jamais mis à jour. Cette variable n'est d'ailleurs même pas intialisée. Donc cette condition ne doit pas être souvent rencontrée

if (tatt > now.minute ())

tmin n'est pas utilisé.
C'est voulu?

Tatt me sert juste à me reperer dans mon serial print, pour savoir quelle est le programme utiliser, après je pourrais le supprimer.

Tmin est utilisé pour quand mes minutes dépasse 60 le nombre attendu de minute soit ramené à 1.

Tu peux ne créer qu.une seule instance onewire et mettre les deux sondes sur celle ci.
Tu différencies les sondes par leurs adresses, chaque ds18b20 a sa propre adresse.
Regarde dans la librairie de Dallas il y a un exemple qui te donnera les adresses de tes sondes.
Après tu peux aussi ne faire qu’une requête pour tes 2 sondes.
ça te fera gagner un peu de place

bonjour,

je possède une Carte Arduino UNO, deux sondes de températures DS18B20, un afficheur 7 segments 4 digits, une RTC et un lecteur de carte SD pour imprimer mes données.

Mon objectif est avec la sonde numéro 1, de mesurer la température en direct, son max et son min et de l'afficher sur mon afficheurs 7 segments. Je voudrais allumer des diodes pour me repérer (l'idée est d'une bleu pour le min, une rouge pour le max et une verte pour T en direct)

la seconde sonde permet de mesurer la température extérieur, de l'afficher sur l'afficheur en 4ème intensions

En secondaire grâce à la RTC je veux enregistrer dans un fichiers exce mes données des deux températures, mais pas afficher le min et le max, toutes les X minutes en définissant le temps.

mon problème est que la seconde sonde extérieur sature et m'affiche 85 degrés ( elles sont à une distance d'1 metre ) au bout de qq secondes.

mais mon programme fait déjà 76% de la mémoire flash de l'arduino et cela crée peut être des bugs.

comment diminuer mon programme pour que la mémoire flash redescende et que mon programme ne bug moins.
voici le code:

#include <TM1637Display.h> //afficheur
#include <SD.h> //carte SD
#include <OneWire.h>
#include <DallasTemperature.h> // température
//horloge temps réel
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;


#define SONDE1 A0
#define SONDEEXT A5 // Sonde exterieur 
#define CLK 2 // Connexion écran
#define DIO 3 // connexion écran
#define sdCardPinChipSelect   10     //pin de la carte SD  
File monFichier;

const char* nomDuFichier            = "donnees.csv";
const long delaiIntervalleDeMesures = 3000;
const int ledbleu = 9; // Définition de la broche numéro 2.
const int ledverte = 8; // Définition de la broche numéro 2.
const int ledblanche = 7; // Définition de la broche numéro 2.
const int ledtempext = 6; // Définition de la broche numéro 2.


float tempmin = 100;   //Temperature min
float tempmax = 0;     //Temperature max
int tmin; // essai de prises toutes les 10 min
int tatt;

// Create degree celsius symbol
const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Degree symbol
  SEG_A | SEG_D | SEG_E | SEG_F   // C
};

OneWire oneWire_in(SONDE1);
OneWire oneWire_out(SONDEEXT);

DallasTemperature sensor_interieur(&oneWire_in);
DallasTemperature sensor_exterieur(&oneWire_out);
//voies de l'afficheurs
TM1637Display display(CLK, DIO);


void setup() {

  pinMode(ledbleu, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledblanche, OUTPUT);
  pinMode(ledtempext, OUTPUT);

  Serial.begin(9600);
  delay(4000);

  display.setBrightness(0x0f);

  sensor_interieur.begin();
  sensor_exterieur.begin();

  //test si la carte SD marche
  Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println(F("Échec de l'initialization !"));
    while (1);    // Boucle infinie (stoppage du programme)
  }
  Serial.println(F("Initialisation terminée."));
  Serial.println();
  //programme qui vérifie heure et permet la mise à jour si soucis//
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");

    // Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    /*rtc.adjust(DateTime(2022, 2, 1, 16, 15, 0));*/

  }



  // On initialise la connexion série
  Serial.begin(9600);
  delay(4000);
}

void loop() {

  // lecture de l'heure

  DateTime now = rtc.now();
  Serial.println("Current Date & Time: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();


  sensor_interieur.requestTemperatures();
  double tempint = sensor_interieur.getTempCByIndex(0);

  delay (2000);

  Serial.print("tinterieur ");
  Serial.print(tempint);

  delay (3000);

  sensor_exterieur.requestTemperatures();
  double tempext = sensor_exterieur.getTempCByIndex(0);
  delay (3000);
  Serial.print("textérieur ");
  Serial.print(tempext);
  if (tempint < tempmin) {
    tempmin = tempint; //Calcul temperature mini
  }
  if (tempint > tempmax) {
    tempmax = tempint; //Calcul temperature maxi
  }
  Serial.print("tmaximum ");
  Serial.print (tempmax);
  Serial.print("tminimum ");
  Serial.print (tempmin);
  if (tatt > now.minute ())
  {
    Serial.print ("case attente");
    delay (1000);

    // afficheur 8 segments
    int temperature = tempint;
    display.showNumberDec(temperature, false, 2, 0);
    display.setSegments(celsius, 2, 2);
    digitalWrite(ledblanche, LOW);
    digitalWrite(ledverte, HIGH);
    digitalWrite(ledbleu, LOW);
    digitalWrite(ledtempext, LOW);
    delay (4000);
    display.showNumberDec(tempmax, false, 2, 0);
    digitalWrite(ledblanche, HIGH);
    digitalWrite(ledbleu, LOW);
    delay (4000);
    display.showNumberDec(tempmin, false, 2, 0);
    digitalWrite(ledblanche, LOW);
    digitalWrite(ledbleu, HIGH);
    delay (4000);
    display.showNumberDec(tempext, false, 2, 0);
    digitalWrite(ledbleu, LOW);
    digitalWrite(ledtempext, HIGH);
  }


  else
  {
    Serial.print ("case impression");
    monFichier = SD.open(nomDuFichier, FILE_WRITE);
    monFichier.print(tempint), monFichier.print(";");
    monFichier.print(tempext), monFichier.print(";");
    monFichier.print(now.month ()), monFichier.print(";");
    monFichier.print(now.day ()), monFichier.print(";");
    monFichier.print(now.hour ()), monFichier.print(";");
    monFichier.print(now.minute() ), monFichier.print(";");
    monFichier.println();
    monFichier.close();
    Serial.println();
    delay (5000);
    int tmin =  (now.minute() );
    if (tmin > 55) {
      tmin = 1; //
    }

En fait je m'interroge, qu'est-ce qui te fait dire que le programme plante au bout de 2 minutes.
Pour moi ce programme ne doit rien afficher.
tatt n'est pas initialisée donc tatt = 0.
Par conséquent, cette ligne

if (tatt > now.minute ())

est toujours fausse et le programme exécute toujours le else donc les afficheurs ne doivent jamais être mis à jour .

Que la Flash soit remplit à 75% ne doit pas poser de problème de stabilité.
Par contre si la RAM est saturée, là tu peux avoir des problèmes.

Peut-tu copier le compte-rendu de la compilation.

#include <TM1637.h>
#include <SD.h> //carte SD
#include <OneWire.h>
#include <DallasTemperature.h> // température
//horloge temps réel
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;


#define SONDEINT A0
#define SONDEEXT 7 // Sonde exterieur 
TM1637 tm(2, 3) ;
#define sdCardPinChipSelect   10     //pin de la carte SD  
File monFichier;

const char* nomDuFichier            = "donnees.csv";

float tempmin = 100;   //Temperature min
float tempmax = 0;     //Temperature max
int tmin; // essai de prises toutes les 10 min
int tatt;
OneWire oneWire_in(SONDEINT);
OneWire oneWire_out(SONDEEXT);

DallasTemperature sensor_interieur(&oneWire_in);
DallasTemperature sensor_exterieur(&oneWire_out);
//voies de l'afficheurs



void setup() {

  Serial.begin(9600);
  delay(4000);
  tm.begin();
  tm.setBrightness(7) ;

  sensor_interieur.begin();
  sensor_exterieur.begin();

  //test si la carte SD marche
  Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
  if (!SD.begin(sdCardPinChipSelect)) {
    Serial.println(F("Échec de l'initialization !"));
    while (1);    // Boucle infinie (stoppage du programme)
  }
  Serial.println(F("Initialisation terminée."));
  Serial.println();
  //programme qui vérifie heure et permet la mise à jour si soucis//
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");

    // Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    /*rtc.adjust(DateTime(2022, 2, 1, 16, 15, 0));*/

  }

}

void loop() {

  // lecture de l'heure

  DateTime now = rtc.now();
  Serial.println("Current Date & Time: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();


  sensor_interieur.requestTemperatures();
  double tempint = sensor_interieur.getTempCByIndex(0);
  delay (2000);
  Serial.print("tinterieur ");
  Serial.print(tempint);

  delay (3000);

  sensor_exterieur.requestTemperatures();
  double tempext = sensor_exterieur.getTempCByIndex(0);
  delay (3000);
  Serial.print("textérieur ");
  Serial.print(tempext);
  if (tempint < tempmin) {
    tempmin = tempint; //Calcul temperature mini
  }
  if (tempint > tempmax) {
    tempmax = tempint; //Calcul temperature maxi
  }
  Serial.print("tmaximum ");
  Serial.print (tempmax);
  Serial.print("tminimum ");
  Serial.print (tempmin);
  if (tatt > now.minute ())
  {
    Serial.print ("case attente");
    delay (1000);

    // afficheur 8 segments
    tm.display("Poul") ;
    delay (4000);
    tm.display(tempint) ;
    delay (4000);
    tm.display("hot ") ;
    delay (4000);
    tm.display(tempmax) ;
    delay (4000);
    tm.display("cold") ;
    delay (4000);
    tm.display(tempmin) ;
    delay (4000);
    tm.display("OUT ") ;
    delay (4000);
    tm.display(tempext) ;
  }


  else
  {
    Serial.print ("case impression");
    monFichier = SD.open(nomDuFichier, FILE_WRITE);
    monFichier.print(tempint), monFichier.print(";");
    monFichier.print(tempext), monFichier.print(";");
    monFichier.print(now.month ()), monFichier.print(";");
    monFichier.print(now.day ()), monFichier.print(";");
    monFichier.print(now.hour ()), monFichier.print(";");
    monFichier.print(now.minute() ), monFichier.print(";");
    monFichier.println();
    monFichier.close();
    Serial.println();
    delay (1000);
    int tmin =  (now.minute() );
    if (tmin > 55) {
      tmin = 1; // permet de dire si le temps en minutes est supérieur à 55 qu'il est égale à 1 car sinon on va dépasser les 60.
    }
    tatt = tmin + 3; //Modifier le 3 pour définir le temps entre les mesures.
  }
  Serial.print ("min attente");
  Serial.print (tatt);
  Serial.print ("min");
}

Mon programme est totalement fonctionnel ici, mais de temps en temps ma sonde sur le pin 7 sature et se déconnecte alors que je ne touche pas au circuit