Thermomètre: afficheur 7 segments (3641BS) et plusieurs sondes DS18B20 [Résolu]

Bonjour

J'ai comme projet de faire un thermomètre avec un arduino nano, un afficheur 7 segment 4 digit 3641BS 12 pins Data Sheet et 3 sondes DS18B20

J'arrive a lire la température via le moniteur série et j'arrive a lancer un compteur sur l'afficheur via ce tuto
J'ai dû replacer pour l'afficheur le pin 2 de l'arduino par le pin 13, pour pouvoir utiliser le pin 2 pour les sondes (j'ai essayé de le faire directement avec le 13 mais ça n'a pas fonctionné) donc au niveau du câblage ça fonctionne :slight_smile:

J'aimerais pouvoir afficher sur le 1er digit un chiffre qui correspond au 3 sondes: 1 = sonde1 , 2 = sonde2, etc.. et sur les 3 autres digit la température avec une décimale, vue que j'ai utiliser le pin 13 qui correspondait aux 4 points (DP) j'imagine que je ne vais pas pouvoir afficher de points (?)

Je pensais pouvoir trouver un tutoriel pour pouvoir 'relier' les sondes a l'afficheur, mais tout les tutos que j'ai trouvé utilisent un 7HC595 pour pouvoir faire le multiplexage sur les 4 * 7 segment (4 afficheur séparé) du coup je me retrouve bloqué et je vous demande de l'aide :grin:

Slait.

Sans code , ca va être compliquer de t'aider :wink:

BrUnO14200:
Slait.

Sans code , ca va être compliquer de t'aider :wink:

C'est pas faux :wink:

Alors le 1er code pour afficher le compteur :

// segment | Arduino board PIN number   
 #define segG 12  
 #define segF 11  
 #define segA 6  
 #define segB 7  
 #define segE 10  
 #define segD 9  
 #define segC 8  
 //#define DP 13  
 #define GND1 13  
 #define GND2 3  
 #define GND3 4  
 #define GND4 5  
 int timer=0;   
 int i=0;  
 // functions to display digits  
 void digit0 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, HIGH);  
 };  
 void digit1 () {  
  digitalWrite(segA, HIGH);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, HIGH);  
 };  
 void digit2 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, HIGH);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, LOW);  
 };  
 void digit3 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, LOW);  
 };  
 void digit4 () {  
  digitalWrite(segA,HIGH);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit5 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, HIGH);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit6 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, HIGH);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit7 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, HIGH);  
 };  
 void digit8 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit9 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 //function to display digit from inputed int  
 void showdigit (int digit)  
 {  
  switch (digit) {  
  case 0:  
   digit0 ();  
   break;  
  case 1:  
   digit1 ();  
   break;  
  case 2:  
   digit2 ();  
   break;  
  case 3:  
   digit3 ();  
   break;  
  case 4:  
   digit4 ();  
   break;  
  case 5:  
   digit5 ();  
   break;  
  case 6:  
   digit6 ();  
   break;  
  case 7:  
   digit7 ();  
   break;  
  case 8:  
   digit8 ();  
   break;  
  case 9:  
   digit9 ();  
   break;  
  default:  
   break;  
  };   
 };  
 // showing 4 digits  
 void showdigits (int number)  
 {  
  // e.g. we have "1234"  
  showdigit(number/1000); // segments are set to display "1"  
  digitalWrite(GND1, HIGH); // first digit on,  
  digitalWrite(GND2, LOW); // other off  
  digitalWrite(GND3, LOW);  
  digitalWrite(GND4, LOW);  
  delay (1);  
  number = number%1000; // remainder of 1234/1000 is 234  
  digitalWrite(GND1, LOW); // first digit is off  
  showdigit(number/100); //// segments are set to display "2"  
  digitalWrite(GND2, HIGH); // second digit is on  
  delay (1); // and so on....  
  number =number%100;    
  digitalWrite(GND2, LOW);  
  showdigit(number/10);  
  digitalWrite(GND3, HIGH);  
  delay (1);  
  number =number%10;   
  digitalWrite(GND3, LOW);  
  showdigit(number);   
  digitalWrite(GND4, HIGH);  
  delay (1);  
 };   
 void setup()  
 {  
  pinMode(segA, OUTPUT);  
  pinMode(segB, OUTPUT);  
  pinMode(segC, OUTPUT);  
  pinMode(segD, OUTPUT);  
  pinMode(segE, OUTPUT);  
  pinMode(segF, OUTPUT);  
  pinMode(segG, OUTPUT);  
//  pinMode(DP, OUTPUT);  
  pinMode(GND1, OUTPUT);  
  pinMode(GND2, OUTPUT);  
  pinMode(GND3, OUTPUT);  
  pinMode(GND4, OUTPUT);  
 };  
 void loop ()  
 {   
  timer++;  
  showdigits (i);  
  if (timer==10) {  
   timer=0;  
   i++;  
   if (i>10000) {  
    i=0;  
   };  
  };   
 };

et le code pour lire dans le moniteur la valeurs des sondes

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);  

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

int deviceCount = 0;
float tempC;

void setup(void)
{
  sensors.begin();  // Start up the library
  Serial.begin(9600);
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  deviceCount = sensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" devices.");
  Serial.println("");
}

void loop(void)
{ 
  // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures(); 
  
  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  {
    Serial.print("Sensor ");
    Serial.print(i+1);
    Serial.print(" : ");
    tempC = sensors.getTempCByIndex(i);
    Serial.print(tempC);
    Serial.print((char)176);//shows degrees character
    Serial.print("C  |  ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    Serial.print((char)176);//shows degrees character
    Serial.println("F");
  }
  
  Serial.println("");
  delay(1000);
}

J'ai bien avancé : j'arrive a afficher les 3 température sur l'afficheur :smiley:
Mais dès que je rajoute dans le void loop () le code pour afficher les valeurs des sondes l'effet de persistance rétinienne ne fonctionne plus ><" j'ai donc bidouillé les delay pour pouvoir quand même les lires mais c'est pas le top. (Voir vidéo de démo)
Et je ne sais pas comment rajouter le numéro correspondant a la sonde sur le 1er digit.

 //sonde
 #include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);  

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xE8, 0xCB, 0x1E, 0x00, 0x00, 0x80, 0x65 };
uint8_t sensor2[8] = { 0x28, 0x06, 0xCD, 0x1E, 0x00, 0x00, 0x80, 0xC3 };
uint8_t sensor3[8] = { 0x28, 0x9B, 0xC7, 0x1E, 0x00, 0x00, 0x80, 0x85 };

 
 // segment | Arduino board PIN number   
 #define segG 12  
 #define segF 11  
 #define segA 6  
 #define segB 7  
 #define segE 10  
 #define segD 9  
 #define segC 8  
 //#define DP 13  
 #define GND1 13  
 #define GND2 3  
 #define GND3 4  
 #define GND4 5  
 int timer=0;   
 int a=0;  
 // functions to display digits  
 void digit0 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, HIGH);  
 };  
 void digit1 () {  
  digitalWrite(segA, HIGH);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, HIGH);  
 };  
 void digit2 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, HIGH);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, LOW);  
 };  
 void digit3 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, LOW);  
 };  
 void digit4 () {  
  digitalWrite(segA,HIGH);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit5 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, HIGH);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit6 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, HIGH);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit7 () {  
  digitalWrite(segA,LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, HIGH);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, HIGH);  
  digitalWrite(segG, HIGH);  
 };  
 void digit8 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, LOW);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 void digit9 () {  
  digitalWrite(segA, LOW);  
  digitalWrite(segB, LOW);  
  digitalWrite(segC, LOW);  
  digitalWrite(segD, LOW);  
  digitalWrite(segE, HIGH);  
  digitalWrite(segF, LOW);  
  digitalWrite(segG, LOW);  
 };  
 //function to display digit from inputed int  
 void showdigit (int digit)  
 {  
  switch (digit) {  
  case 0:  
   digit0 ();  
   break;  
  case 1:  
   digit1 ();  
   break;  
  case 2:  
   digit2 ();  
   break;  
  case 3:  
   digit3 ();  
   break;  
  case 4:  
   digit4 ();  
   break;  
  case 5:  
   digit5 ();  
   break;  
  case 6:  
   digit6 ();  
   break;  
  case 7:  
   digit7 ();  
   break;  
  case 8:  
   digit8 ();  
   break;  
  case 9:  
   digit9 ();  
   break;  
  default:  
   break;  
  };   
 };  
 // showing 4 digits  
 void showdigits (int number)  
 {  
  // e.g. we have "1234"  
  showdigit(number/1000); // segments are set to display "1"  
  digitalWrite(GND1, HIGH); // first digit on,  
  digitalWrite(GND2, LOW); // other off  
  digitalWrite(GND3, LOW);  
  digitalWrite(GND4, LOW);  
  delay (60);  
  number = number%1000; // remainder of 1234/1000 is 234  
  digitalWrite(GND1, LOW); // first digit is off  
  showdigit(number/100); //// segments are set to display "2"  
  digitalWrite(GND2, HIGH); // second digit is on  
  delay (60); // and so on....  
  number =number%100;    
  digitalWrite(GND2, LOW);  
  showdigit(number/10);  
  digitalWrite(GND3, HIGH);  
  delay (60);  
  number =number%10;   
  digitalWrite(GND3, LOW);  
  showdigit(number);   
  digitalWrite(GND4, HIGH);  
  delay (1600);  
 };   
 void setup()  
 {
  sensors.begin();  // Start up the library
  Serial.begin(9600);
  
  // locate devices on the bus
 // Serial.print("Locating devices...");
 // Serial.print("Found ");
  //deviceCount = sensors.getDeviceCount();
  //Serial.print(deviceCount, DEC);
 // Serial.println(" devices.");
 // Serial.println("");

//

  pinMode(segA, OUTPUT);  
  pinMode(segB, OUTPUT);  
  pinMode(segC, OUTPUT);  
  pinMode(segD, OUTPUT);  
  pinMode(segE, OUTPUT);  
  pinMode(segF, OUTPUT);  
  pinMode(segG, OUTPUT);  
//  pinMode(DP, OUTPUT);  
  pinMode(GND1, OUTPUT);  
  pinMode(GND2, OUTPUT);  
  pinMode(GND3, OUTPUT);  
  pinMode(GND4, OUTPUT);  
 };  
 void loop ()  
 { 

   
 // showdigits (a);  
  
  
sensors.requestTemperatures();
  
  Serial.print("Sensor 1: ");
  printTemperature(sensor1);
  
  Serial.print("Sensor 2: ");
  printTemperature(sensor2);
  
  Serial.print("Sensor 3: ");
  printTemperature(sensor3);
  
  Serial.println();
  delay(1000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");

  
  showdigits(tempC*10);
    delay(0);
 
 }; 
//

Bonjour,

Pour qu'il n'y ait pas de flicker sur l'afficheur, il faut rafraîchir l'affichage environ toutes les 20ms (donc un digit toutes les 5ms). La lecture des capteur de température prend plusieurs centaines de ms -> problème.

Le moyen le plus simple est d'afficher en interruption timer. Si tu ne maitrises pas la programmation des timers, la librairie TimerOne est ton amie.

Merci pour ta réponse, j'ai regardé la doc et je ne sais pas ou et comment implémenter cela.
Si j'ai bien compris l'idée c'est de garder en 'mémoire' la lecture de tempC pour que showdigits ai le temps de l'afficher ?
Je dois faire des modification sur le câblage pour utiliser timer1 ou c'est uniquement dans le code ?

La fonction showdigits comporte des delais (qui me paraissent très importants). Comme elle doit être appelée cycliquement, ça va bloquer complètement le programme.

Il faut afficher digit par digit. Chaque digit doit être affiché pendant environ 5ms.
Tu pourrais faire ça dans la loop avec millis(), mais c'est très difficile à faire si tu dois faire autre chose (en particulier lire les sondes de température).

Comme je te disais le plus simple est de le faire en interruption. Par exemple comme ceci:

//sonde
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimerOne.h>


// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xE8, 0xCB, 0x1E, 0x00, 0x00, 0x80, 0x65 };
uint8_t sensor2[8] = { 0x28, 0x06, 0xCD, 0x1E, 0x00, 0x00, 0x80, 0xC3 };
uint8_t sensor3[8] = { 0x28, 0x9B, 0xC7, 0x1E, 0x00, 0x00, 0x80, 0x85 };

unsigned displayValue;  // valeur à afficher

// segment | Arduino board PIN number
#define segG 12
#define segF 11
#define segA 6
#define segB 7
#define segE 10
#define segD 9
#define segC 8
//#define DP 13
#define GND1 13
#define GND2 3
#define GND3 4
#define GND4 5

// functions to display digits
void digit0 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, HIGH);
};
void digit1 () {
  digitalWrite(segA, HIGH);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, HIGH);
};
void digit2 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, HIGH);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, LOW);
};
void digit3 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, LOW);
};
void digit4 () {
  digitalWrite(segA, HIGH);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit5 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, HIGH);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit6 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, HIGH);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit7 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, HIGH);
};
void digit8 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit9 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
//function to display digit from inputed int
void showdigit (int digit)
{
  switch (digit) {
    case 0:
      digit0 ();
      break;
    case 1:
      digit1 ();
      break;
    case 2:
      digit2 ();
      break;
    case 3:
      digit3 ();
      break;
    case 4:
      digit4 ();
      break;
    case 5:
      digit5 ();
      break;
    case 6:
      digit6 ();
      break;
    case 7:
      digit7 ();
      break;
    case 8:
      digit8 ();
      break;
    case 9:
      digit9 ();
      break;
    default:
      break;
  };
};
// showing 4 digits
void showdigits (int number)
{
  // e.g. we have "1234"
  showdigit(number / 1000); // segments are set to display "1"
  digitalWrite(GND1, HIGH); // first digit on,
  digitalWrite(GND2, LOW); // other off
  digitalWrite(GND3, LOW);
  digitalWrite(GND4, LOW);
  delay (60);
  number = number % 1000; // remainder of 1234/1000 is 234
  digitalWrite(GND1, LOW); // first digit is off
  showdigit(number / 100); //// segments are set to display "2"
  digitalWrite(GND2, HIGH); // second digit is on
  delay (60); // and so on....
  number = number % 100;
  digitalWrite(GND2, LOW);
  showdigit(number / 10);
  digitalWrite(GND3, HIGH);
  delay (60);
  number = number % 10;
  digitalWrite(GND3, LOW);
  showdigit(number);
  digitalWrite(GND4, HIGH);
  delay (60);
  //  delay (1600);
};
void setup()
{
  sensors.begin();  // Start up the library
  Serial.begin(9600);

  // locate devices on the bus
  // Serial.print("Locating devices...");
  // Serial.print("Found ");
  //deviceCount = sensors.getDeviceCount();
  //Serial.print(deviceCount, DEC);
  // Serial.println(" devices.");
  // Serial.println("");

  //

  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  //  pinMode(DP, OUTPUT);
  pinMode(GND1, OUTPUT);
  pinMode(GND2, OUTPUT);
  pinMode(GND3, OUTPUT);
  pinMode(GND4, OUTPUT);

  Timer1.initialize(5000);          // appel toutes les 5ms
  Timer1.attachInterrupt(timerIsr); // attache la routine d'interruption
};
void loop ()
{
  sensors.requestTemperatures();

  Serial.print("Sensor 1: ");
  printTemperature(1, sensor1);
  delay(1000);

  Serial.print("Sensor 2: ");
  printTemperature(2, sensor2);
  delay(1000);

  Serial.print("Sensor 3: ");
  printTemperature(3, sensor3);
  delay(1000);

  Serial.println();
}

void printTemperature(byte nSensor, DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");

  displayValue = 1000 * nSensor + tempC * 10; // cette valeur sera affichée en interruption
}

// affiche la valeur displayValue en interruption
void timerIsr()
{
  static int ndigit = 0;      // numéro du digit à afficher
  byte val;
  switch (ndigit)
  {
    case 0:
      digitalWrite(GND1, HIGH); // first digit on,
      digitalWrite(GND2, LOW); // other off
      digitalWrite(GND3, LOW);
      digitalWrite(GND4, LOW);
      val = displayValue / 1000;
      break;
    case 1:
      digitalWrite(GND1, LOW);
      digitalWrite(GND2, HIGH);
      val = displayValue / 100 % 10;
      break;
    case 2:
      digitalWrite(GND2, LOW);
      digitalWrite(GND3, HIGH);
      val = displayValue / 10 % 10;
      break;
    case 3:
      digitalWrite(GND3, LOW);
      digitalWrite(GND4, HIGH);
      val = displayValue % 10;
      break;
  }
  showdigit(val);
  ndigit++;
  if (ndigit >= 4)
    ndigit = 0;
}
//

Merci beaucoup Kamill ! ça fonctionne impeccable !! J'ai descendu la valeur de * delay (); *
sur les segment a 5ms et c'est fluide :slight_smile:

Par contre je n'ai pas compris comment tu a ajouté le chiffre du 1er digit.
En ce qui concerne le DP (point) j'imagine que je n'ai plus de pin digital de dispo (j'utilise de d2 a d13) pour le faire fonctionner en position fixe sur le 3e digit ( 1 3 1. 5) un pin analogique pourrait le faire aussi ?

Le premier chiffre est le chiffre des milliers, donc il suffit de multiplier le numéro du capteur par 1000 et l'ajouter à la valeur de température.

Les pins analogiques sont avant tout des pins numériques. Bien sur que tu peux utiliser les pins analogiques pour piloter le point (sauf les pins A6 et A7 d'une arduino nano qui sont uniquement analogiques).

Ok j'ai compris :slight_smile:
Encore une fois merci Kamill pour ton aide :smiley:

Voici le code final avec les points (DP) sur le A0

//sonde
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TimerOne.h>


// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

// Addresses of 3 DS18B20s
uint8_t sensor1[8] = { 0x28, 0xE8, 0xCB, 0x1E, 0x00, 0x00, 0x80, 0x65 };
uint8_t sensor2[8] = { 0x28, 0x06, 0xCD, 0x1E, 0x00, 0x00, 0x80, 0xC3 };
uint8_t sensor3[8] = { 0x28, 0x9B, 0xC7, 0x1E, 0x00, 0x00, 0x80, 0x85 };

unsigned displayValue;  // valeur à afficher

// segment | Arduino board PIN number
#define segG 12
#define segF 11
#define segA 6
#define segB 7
#define segE 10
#define segD 9
#define segC 8
#define DP A0
#define GND1 13
#define GND2 3
#define GND3 4
#define GND4 5

// functions to display digits
void digit0 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, HIGH);
};
void digit1 () {
  digitalWrite(segA, HIGH);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, HIGH);
};
void digit2 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, HIGH);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, LOW);
};
void digit3 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, LOW);
};
void digit4 () {
  digitalWrite(segA, HIGH);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit5 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, HIGH);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit6 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, HIGH);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit7 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, HIGH);
};
void digit8 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, LOW);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
void digit9 () {
  digitalWrite(segA, LOW);
  digitalWrite(segB, LOW);
  digitalWrite(segC, LOW);
  digitalWrite(segD, LOW);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, LOW);
  digitalWrite(segG, LOW);
};
//function to display digit from inputed int
void showdigit (int digit)
{
  switch (digit) {
    case 0:
      digit0 ();
      break;
    case 1:
      digit1 ();
      break;
    case 2:
      digit2 ();
      break;
    case 3:
      digit3 ();
      break;
    case 4:
      digit4 ();
      break;
    case 5:
      digit5 ();
      break;
    case 6:
      digit6 ();
      break;
    case 7:
      digit7 ();
      break;
    case 8:
      digit8 ();
      break;
    case 9:
      digit9 ();
      break;
    default:
      break;
  };
};
// showing 4 digits
void showdigits (int number)
{
  // e.g. we have "1234"
  showdigit(number / 1000); // segments are set to display "1"
  digitalWrite(GND1, HIGH); // first digit on,
  digitalWrite(GND2, LOW); // other off
  digitalWrite(GND3, LOW);
  digitalWrite(GND4, LOW);
  delay (5);
  number = number % 1000; // remainder of 1234/1000 is 234
  digitalWrite(GND1, LOW); // first digit is off
  showdigit(number / 100); //// segments are set to display "2"
  digitalWrite(GND2, HIGH); // second digit is on
  delay (5); // and so on....
  number = number % 100;
  digitalWrite(GND2, LOW);
  showdigit(number / 10);
  digitalWrite(GND3, HIGH);
  delay (5);
  number = number % 10;
  digitalWrite(GND3, LOW);
  showdigit(number);
  digitalWrite(GND4, HIGH);
  delay (5);
  //  delay (1600);
};
void setup()
{
  sensors.begin();  // Start up the library
  Serial.begin(9600);
  //

  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  pinMode(DP, OUTPUT);
  pinMode(GND1, OUTPUT);
  pinMode(GND2, OUTPUT);
  pinMode(GND3, OUTPUT);
  pinMode(GND4, OUTPUT);

  Timer1.initialize(5000);          // appel toutes les 5ms
  Timer1.attachInterrupt(timerIsr); // attache la routine d'interruption
};
void loop ()
{
  sensors.requestTemperatures();

  Serial.print("Sensor 1: ");
  printTemperature(1, sensor1);
  delay(3000);                    //delai d'affichage 1er temperature 

  Serial.print("Sensor 2: ");
  printTemperature(2, sensor2);
  delay(1500);

  Serial.print("Sensor 3: ");
  printTemperature(3, sensor3);
  delay(1500);

  Serial.println();
}

void printTemperature(byte nSensor, DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print((char)176);
  Serial.print("C  |  ");

  displayValue = 1000 * nSensor + tempC * 10; // cette valeur sera affichée en interruption
}

// affiche la valeur displayValue en interruption
void timerIsr()
{
  static int ndigit = 0;      // numéro du digit à afficher
  byte val;
  switch (ndigit)
  {
    case 0:
      digitalWrite(GND1, HIGH); // first digit on,
      digitalWrite(GND2, LOW); // other off
      digitalWrite(GND3, LOW);
      digitalWrite(GND4, LOW);
      digitalWrite(DP, LOW);

      val = displayValue / 1000;
      break;
    case 1:
      digitalWrite(GND1, LOW);
      digitalWrite(GND2, HIGH);
      digitalWrite(DP, HIGH);
      val = displayValue / 100 % 10;
      break;
    case 2:
      digitalWrite(GND2, LOW);
      digitalWrite(GND3, HIGH);
      digitalWrite(DP, LOW);
      val = displayValue / 10 % 10;
      break;
    case 3:
      digitalWrite(GND3, LOW);
      digitalWrite(GND4, HIGH);
      digitalWrite(DP, HIGH);

      val = displayValue % 10;
      break;
  }
  showdigit(val);
  ndigit++;
  if (ndigit >= 4)
    ndigit = 0;
}
//