Projet thermomètre multi-sondes

Salut à toutes et à tous !

J'ai découvert Arduino par hasard il y a environ 2 mois. Je suis en train d'installer un insert bouilleur chez moi (c'est un insert à bois qui chauffe de l'eau qui est stockée dans un ballon tampon puis envoyée à la demande dans des radiateurs en gros).

Pour pouvoir contrôler le plus finement possible mon installation, j'ai besoin de pouvoir mesurer la température à 6 endroits de mon circuit d'eau chaude. Certaines personnes de l'excellent forum FuturaSciences m'ont dit que l'Arduino pouvait être une solution efficace à moindre frais.

Après quelques petites recherches, j'ai commandé un kit de débutant, un écran LCD keypad shield et 3 sondes ds18b20 pour me lancer. J'ai commencé par des manips toutes simples : allumer et éteindre des leds, faire un feu tricolore, gérer un afficheur 7 segments, afficher des messages sur l'écran LCD, faire une horloge, etc.

Et depuis peu, je me suis lancé dans l'utilisation de ses fameuses sondes tout d'abord avec l'affichage sur l'écran de l'ordinateur de 1 puis 2 sondes puis sur l'écran LCD. Et là, je commence à bloquer un peu...

Voilà mon code actuel :

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


static const int PIN_LCD_BACKLIGHT  = 10;

 // select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// control LCD backlight
void lcd_backlight_set( bool on )
{
    digitalWrite( PIN_LCD_BACKLIGHT, 0 );
    pinMode( PIN_LCD_BACKLIGHT, on ? INPUT : OUTPUT );
}

// Control LED on pin 13
void led_set( bool on )
{
    pinMode( 13, OUTPUT );
    digitalWrite( 13, on );
}



OneWire oneWire1(2);
DallasTemperature sensors(&oneWire1);

void setup()
{ 
    // init serial port
    Serial.begin(9600); 
    Serial.println("# Temp Probe");
    
    // init lcd
    lcd.begin(16, 2);              // start the library
    lcd.setCursor(0,0);
    lcd.print("Sondes de"); 
    lcd.setCursor(0,1);
    lcd.print("temperatures"); 
    delay (3000);
    
    sensors.begin();
    lcd.clear ();
}

void loop()
{    
    sensors.requestTemperatures(); // Send the command to get temperatures

    for( int idx=0; idx<2; idx++ )
    {
        lcd.setCursor((idx&2)*2,(idx&1));
        lcd.setCursor(0,0);
        lcd.print("Sonde 1 =");
        lcd.setCursor(0,1);
        lcd.print("Sonde 2 ="); 
        lcd.setCursor(9,0);
        float temp = sensors.getTempCByIndex(idx);
        lcd.print( temp );
        lcd.print((char)223); // caractère °
        lcd.print("C");
         
   
       
        Serial.print( temp );
        Serial.print("\t");
      
    }
    
    Serial.println();
}

Grâce à cela, j'obtiens, après l'affichage de mon message de bienvenue ("Sondes de température") :

Sonde 1 = 19,69°C
Sonde 2 =

J'ai réussi à traficoter un peu le code pour afficher ce que je viens de vous décrire. Au départ, j'avais les 3 températures sur l'écran du type :

19.56 23.65
21.64

Les objectifs seraient les suivants (oui, il y en a beaucoup) :

1 - J'aimerais afficher si possible seulement 1 chiffre après la virgule.

2 - J'aimerais pouvoir afficher juste 2 températures sur l'écran avec le capteur correspondant
exemple :

radiateurs = 52,4°C
ballon = 83,2°C

3 - Et comme, je vais avoir au moins 6 sondes, pouvoir basculer d'un capteur à l'autre en appuyant sur les boutons de l'écran (exemple : le bouton gauche affiche la température de 2 capteurs, le bouton droite affiche la température de 2 autres capteurs, etc.).

4 - Et dernière chose qui est toute simple que je n'ai pas encore recherché, éteindre/allumer le rétroéclairage en appuyant sur un autre bouton.

Voilà !

Merci par avance pour votre aide.

A plus

Petit 1/ lcd.print(temp,1); // affiche temp avec un chiffre après la virgule

Petit 2 et 3/ il te faut une variable qui s'incrémente à chaque appui sur un bouton, une fonction qui lit les températures et qui mémorise les températures dans 6 variables différentes (toutes les 5s par exemple) et dans le loop, un test sur la variable liée au bouton, une fonction d'affichage qui affiche les températures en fonction de la valeur de la variable (oups, ça commence à faire) ...

Petit 4/ tu as déjà la fonction d'éclairage du lcd dans ton programme ... Bien qu'étrange ... Je ferai pinMode(PIN_LCD_BACKLIGHT,Output); dans le setup... Ensuite si tu appuies sur un bouton, tu fais digitalWrite(PIN_LCD_BACKLIGHT,1); puis quelques secondes après, tu fais digitalWrite(PIN_LCD_BACKLIGHT,0); ... Mais sans utiliser de delay.

Quand on débute ça peut paraître obscure ... Mais ton programme n'a rien de compliqué et je peux t'aider

Tu sais lire les appuis sur les boutons ?
Écris une fonction qui lit tes sondes de temp et qui les stocke dans autant de variables (temp1, temp2 ...)
Écris une fonction qui en fonction d'un numéro de page (qui variera entre 1 et 3 par exemple) affichera sur le lcd : temp1 et temp2 si page =1, temp3 et temp4 si page =2 etc ... Avec les noms en clair de la sonde ...

Pour le 4: Sinon pour économiser une entrée de ton arduino tu mets simplement un commutateur en série sur ta borne A.

Salut et merci pour votre aide !

Quand on débute ça peut paraître obscure ... Mais ton programme n'a rien de compliqué et je peux t'aider

J'en conviens... Le problème est que je suis un vrai débutant pris par le temps avec l'installation hydraulique de mon bouilleur; du coup, il m'en reste moins pour l'Arduino ! Je finis d'installer l'insert très probablement le weekend du 21/02 et j'aimerais pouvoir lire mes différentes températures qui sont sources de contrôles mais aussi de sécurité de l'installation.

Du coup, je prends toute aide, bout de code ou autre qui peut me permettre de boucler au plus vite ce projet.

En gros :

il te faut une variable qui s'incrémente à chaque appui sur un bouton, une fonction qui lit les températures et qui mémorise les températures dans 6 variables différentes (toutes les 5s par exemple) et dans le loop, un test sur la variable liée au bouton, une fonction d'affichage qui affiche les températures en fonction de la valeur de la variable (oups, ça commence à faire) ...

et

Écris une fonction qui lit tes sondes de temp et qui les stocke dans autant de variables (temp1, temp2 ...)
Écris une fonction qui en fonction d'un numéro de page (qui variera entre 1 et 3 par exemple) affichera sur le lcd : temp1 et temp2 si page =1, temp3 et temp4 si page =2 etc

C'est entre de l'anglais et du chinois pour moi ! Je comprends un peu mais pas trop...

Merci d'avance.

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


//////////////////// Ecran LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define PIN_LCD_BACKLIGHT  10    //pin du back light
unsigned long lcd_backlight_off; //chrono pour l'extinction du lcd
byte t_lcd_on = 10;              //timer d'allumage en secondes

/////////////////////Sondes de température
//adresses des 6 sondes Ds18b20 ... à adapter à tes sondes !!
#define PINTEMP 2             // pin sur laquelle les sondes seront branchées
byte adresse[6][8] = {
  0x28, 0x32, 0x34, 0x58, 0x4, 0x0, 0x0, 0x5C , //   adresse sonde 0
  0x28, 0x1A, 0xBA, 0x57, 0x4, 0x0, 0x0, 0xB8 , //   adresse sonde 1
  0x28, 0x56, 0x1F, 0x58, 0x4, 0x0, 0x0, 0xCB , //   adresse sonde 2
  0x28, 0x62, 0xC9, 0x57, 0x4, 0x0, 0x0, 0xA2 , //   adresse sonde 3
  0x28, 0xCC, 0x97, 0x57, 0x4, 0x0, 0x0, 0xDA , //   adresse sonde 4
  0x28, 0xCC, 0x28, 0x58, 0x4, 0x0, 0x0, 0x60   //   adresse sonde 5
};
//tableau d'enregistrement des températures (6)
float temp[6];
//déclaration du OneWire
OneWire onewire(PINTEMP);
//déclaration des fonctions de convertion
DallasTemperature sensors(&onewire);
byte t_temp = 5;      //intervale de lectures des sondes (ici 5 secondes)
unsigned long next_temp = t_temp * 1000;  //date de la prochaine lecture des sondes (en 1/1000 de s)

////////////// gestion des boutons de l'ecran
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

////////////// autres merdouilles
//nom des sondes 
char *Nom[6] = {"Chambre", "Salon", "Cheminee", "toto", "titi", "tutu"};
byte page;            //index sur la page en cours d'affichage
#define NB_PAGES 3    //nombre de pages (d'écran) différentes que l'on peut afficher

void setup() {
  // init serial port
  Serial.begin(9600);
  Serial.println("# Temp Probe");

  //init des sondes de température
  sensors.begin();
  sensors.setResolution(11);           //fixe la précision à 0,12°
  sensors.setWaitForConversion(false); //ne bloque pas le programme pendant la conversion
  sensors.requestTemperatures();       //demande aux sondes de mesurer la T°

  // init lcd
  pinMode(PIN_LCD_BACKLIGHT, OUTPUT);   //déclare la pin de controle de l'élairage
  digitalWrite(PIN_LCD_BACKLIGHT, HIGH); //allume l'écran
  lcd_backlight_off = 1000 * t_lcd_on;  //date d'extinction de l'écran

  lcd.begin(16, 2);              // start the library
  lcd.setCursor(0, 0);
  lcd.print("Sondes de");
  lcd.setCursor(0, 1);
  lcd.print("temperatures");
  delay(1000);

  //lit les mesures de temp
  lit_sondes();

  //affiche la première page
  lcd.clear ();
  page = 0;
  affiche_ecran();
}

//regarde si un bouton est enfoncé, renvoie son code
int read_LCD_buttons() {              // read the buttons
  int adc_key_in = analogRead(0);       // read the value from the sensor

  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  // We make this the 1st option for speed reasons since it will be the most likely result

  if (adc_key_in > 1000) return btnNONE;

  // For V1.1 us this threshold
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
  if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT;

  return btnNONE;                // when all others fail, return this.
}

//affiche une ligne sur le LCD sur le modele "nom = xx.y °C"
void affiche_ligne(byte ligne, byte sonde) {
  lcd.setCursor(0, ligne);
  lcd.print(F("                ")); //efface la ligne
  lcd.setCursor(0, ligne);
  lcd.print(Nom[sonde]);            // affiche le nom en clair de la sonde
  lcd.print(F(" ="));
  lcd.print(temp[sonde], 1);        //affiche la valeur de la température
  lcd.print((char)223);             // caractère °
  lcd.print(F("C"));
}

//affiche l'écran selon la page (une page = un affichage différent sur l'ecran)
void affiche_ecran() {
  if (page >= NB_PAGES) page = 0;   //si on dépasse le nombre de pages max, on revient au début (ici 3 pages)
  if (page == 0) {
    //page 0, on affiche la sonde 0 et 1
    affiche_ligne(0, 0); //ligne 0
    affiche_ligne(1, 1); //ligne 1
  } else if (page == 1) {
    //page 1, on affiche la sonde 2 et 3
    affiche_ligne(0, 2);
    affiche_ligne(1, 3);
  } else if (page == 2) {
    //page 1, on affiche la sonde 2 et 3
    affiche_ligne(0, 4);
    affiche_ligne(1, 5);
  }
}

// fonction qui lit les sondes, mémorise leur valeur, et demande une nouvelle mesure
void lit_sondes() {
  for (byte i = 0; i < 6 ; i++) { //parcoure les 6 sondes
    temp[i] = sensors.getTempC(adresse[i]); //lit la sonde en °C
  }
  sensors.requestTemperatures(); //demande aux sondes de refaire une nouvelle mesure
}

void loop() {
  //ici le programme tourne en boucle

  //lecture des boutons pour voir si on a appuyé
  byte bouton = read_LCD_buttons(); //lit le bouton (cette fonction renvoie un code)
  if ( bouton != btnNONE) {  //on a appuyé sur un bouton (btnNONE == pas d'appui)
    //on éclaire l'écran
    digitalWrite(PIN_LCD_BACKLIGHT, HIGH);
    //on fixe la date d'extinction
    lcd_backlight_off = millis() + 1000 * t_lcd_on;

    //en fonction du bouton appuyé on change de page
    if (bouton == btnUP) { //exemple : appui sur le bouton HAUT, on recule d'une page
      if (page > 0) page = page - 1;
      else page = NB_PAGES - 1; //si on était à la première page (0), on va à la dernière (elles sont numérotées de 0 à NB_PAGES-1)
    }
    if (bouton == btnDOWN) { //exemple : appui sur le bouton BAS, on avance d'une page
      page = page + 1;
      if (page >= NB_PAGES) page = 0;  //si on dépasse la dernière page, on va à la première
    }

    //affiche la page actuelle
    affiche_ecran();
  }

  //si la dernière mesure des temps remontre à plus que l'intervalle, on lit les sondes
  if (millis() > next_temp) {
    next_temp  = next_temp + 1000 * t_temp; //date de la prochaine lecture
    lit_sondes();                           //lit les sondes
    affiche_ecran();                        //affiche les nouvelles mesures
  }

  //vérifie si on doit éteindre l'écran
  if (millis() > lcd_backlight_off) digitalWrite(PIN_LCD_BACKLIGHT, LOW); //eteind l'écran

}

Voilà ... c'est presque du tout cuit !!

Je pense qu'il y a assez de commentaires pour que tu puisses comprendre.

Il faudra trouver les adresses de tes sondes et les mettre dans le tableau en début de programme (pour trouver les adresses, il y a l'exemple onewire > ds18x20_temperature : modifie la pin sur laquelle sont connectées tes sondes et il t'affichera toutes les sondes qu'il trouvera sur le bus ... )

Re,

C'est donc ça qu'on appelle l'efficacité !

Je vais essayer de lire le code, le comprendre (tes commentaires doivent déjà bien aidé) et je le transfèrerai demain.

J'aurais 2 ou 3 questions (pas sur le code car pas encore regardé) :
As-tu fait tout toi-même ou as-tu pris ce code ou certaines parties sur le net ?
Depuis combien de temps manipules-tu l'Arduino ?
As-tu déjà programmé avant (C++, BASIC) ?

Je vais regarder tout ça en détails.

Merci beaucoup en tout cas.

A plus

La j'ai tout écris sauf la partie read_lcd_buttons car je n'ai pas cet écran chez moi et que je suis tombé sur un exemple qui répond exactement à ton besoin... Souvent sur le net tu trouves des trucs équivalents à ce que tu veux faire, mais tu perds plus de temps à les comprendre et à les adapter à ton besoin ... Alors je préfères écrire moi même ...

Ce fait 5 ou 6 ans que je joue avec l'arduino ... Mon plus gros projet étant la domotique

Salut,

5 ans d'expérience, ça commence à compter. Tu peux me décrire rapidement ton projet domotique (matériel utilisé, temps passé, budget, ...)

Je teste le code ce soir mais avant ça, je vais déjà essayer de récupérer l'adresse des sondes.

Je tiens au jus des avancées.

A plus

Salut,

Je viens de tester de récupérer les adresses de mes 3 sondes ds18b20 (j'attends les autres avec un câble plus long et en silicone).

J'ai fait ce code :

#include <OneWire.h>
 
// DS18S20 Temperature chip i/o
OneWire ds(10); // on pin 10
 
void setup()
{
Serial.begin(9600);
}
 
void loop()
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
 
ds.reset_search();
if ( !ds.search(addr)) {
Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
 
Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
 
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}
 
if ( addr[0] == 0x10) {
Serial.print("Device is a DS18S20 family device.\n");
}
else if ( addr[0] == 0x28) {
Serial.print("Device is a DS18B20 family device.\n");
}
else {
Serial.print("Device family is not recognized: 0x");
Serial.println(addr[0],HEX);
return;
}
delay(1000);
}

Et j'obtiens ça : R=28 20 B6 0 0 0 80 F7 Device is a DS18B20 family device.

Je pensais récupérer une adresse par capteur. Est-ce normal docteur ?

Re,

Je viens de faire une par une et c'est good !

Ok pour les adresses ... C'est vraiment génial les ds18b20

Mon projet n'a pas dû coûter plus de 100 euros ... Mais je n'ai pas tenu de cahier de compte ... Le temps passé ? Des centaines d'heures sans doute ...

J'ai une dizaine de sondes de température, des détecteurs de présence. je mesure ma conso d'eau, conso edf, production edf solaire et les courbes sont sur un site de stockage en ligne (xively pour ne pas le nommer). J'ai mis en place des contrôles à distance et des automatismes sur la clim, la vmc, le portail motorisé, le chauffe eau, la charge de la Zoé, des prises télécommandées, le remplissage et la pompe de la piscine ...
L'interface web me permet de tout surveiller et contrôler, tout en pouvant reprendre la main facilement. Sur internet je lit l'heure et la météo ... Et la carte m'envoie des mails en cas de soucis et pour les infos pour calculer mes bilans énergétiques ...

Le tout est sur une carte Mega ... Et il reste de la place ..

Salut,

Quand je vois tout ce qu'on peut faire avec, je me dis que cette petite carte mérite d'être davantage connue.

De mon côté, j'ai bossé que sur le bouilleur durant le weekend ! Je ferai ma première flambée demain. Du coup, j'ai pas beaucoup touché à l'Arduino...

J'ai testé ton code avec les 3 sondes que je possède actuellement et ça m'a l'air pas mal du tout. Je dois recevoir les autres sondes mercredi.

Je ferai les tests au plus tôt et j'apporterai quelques modifications dans la limite de mes compétences (donc pas grand-choses) ou demanderai conseils.

A très bientôt.

Salut,

J'ai commandé mes sondes sur Ebay mais malheureusement à mon ancienne adresse et je m'en suis rendu compte un peu trop tard... Je les recevrai donc un peu en retard... Je reposterai quand j'aurai un plus de choses à dire !

A plus

Salut,

Retour de vacances, sondes reçues, au travail !

J'ai récupéré les adresses de mes 6 sondes et j'ai modifié (un tout petit peu) le code :

  • j'ai donné le nom voulu à mes sondes,
  • j'ai modifié l'affichage de l'écran : plus de timer mais bouton haut = allumé, bouton bas = éteint,
  • j'ai modifié le défilement des pages : bouton sélect = page 0, bouton gauche = page 1 et bouton droit = page 2.

Voilà le nouveau code :

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


//////////////////// Ecran LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define PIN_LCD_BACKLIGHT  10    //pin du back light


/////////////////////Sondes de température
//adresses des 6 sondes Ds18b20 ... à adapter à tes sondes !!
#define PINTEMP 2             // pin sur laquelle les sondes seront branchées
byte adresse[6][8] = {
  0x28, 0xFF, 0xC7, 0x31, 0xB0, 0x15, 0x3, 0xB1 , //   adresse sonde 0
  0x28, 0xFF, 0xC9, 0xDC, 0x2, 0x15, 0x2, 0x6A , //   adresse sonde 1
  0x28, 0xFF, 0x27, 0x3E, 0x93, 0x15, 0x3, 0x81 , //   adresse sonde 2
  0x28, 0xFF, 0x65, 0x3D, 0x93, 0x15, 0x3, 0x63 , //   adresse sonde 3
  0x28, 0xFF, 0xB, 0x69, 0x93, 0x15, 0x1, 0xBA , //   adresse sonde 4
  0x28, 0x43, 0xB6, 0x0, 0x0, 0x0, 0x80, 0x6D , //   adresse sonde 5
};
//tableau d'enregistrement des températures (6)
float temp[6];
//déclaration du OneWire
OneWire onewire(PINTEMP);
//déclaration des fonctions de convertion
DallasTemperature sensors(&onewire);
byte t_temp = 5;      //intervale de lectures des sondes (ici 5 secondes)
unsigned long next_temp = t_temp * 1000;  //date de la prochaine lecture des sondes (en 1/1000 de s)

////////////// gestion des boutons de l'ecran
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

////////////// autres merdouilles
//nom des sondes
char *Nom[6] = {"BT Haut", "BT Bas ", "Insert", "Retour", "Radiat.", "Retour "};
byte page;            //index sur la page en cours d'affichage
#define NB_PAGES 3    //nombre de pages (d'écran) différentes que l'on peut afficher

void setup() {
  // init serial port
  Serial.begin(9600);
  Serial.println("# Temp Probe");

  //init des sondes de température
  sensors.begin();
  sensors.setResolution(11);           //fixe la précision à 0,12°
  sensors.setWaitForConversion(false); //ne bloque pas le programme pendant la conversion
  sensors.requestTemperatures();       //demande aux sondes de mesurer la T°

  // init lcd
  pinMode(PIN_LCD_BACKLIGHT, OUTPUT);   //déclare la pin de controle de l'élairage
  digitalWrite(PIN_LCD_BACKLIGHT, HIGH); //allume l'écran
  
  lcd.begin(16, 2);              // start the library
  lcd.setCursor(0, 0);
  lcd.print("Sondes de");
  lcd.setCursor(0, 1);
  lcd.print("temperatures");
  delay(1000);

  //lit les mesures de temp
  lit_sondes();

  //affiche la première page
  lcd.clear ();
  page = 0;
  affiche_ecran();
}

//regarde si un bouton est enfoncé, renvoie son code
int read_LCD_buttons() {              // read the buttons
  int adc_key_in = analogRead(0);       // read the value from the sensor

  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  // We make this the 1st option for speed reasons since it will be the most likely result

  if (adc_key_in > 1000) return btnNONE;

  // For V1.1 us this threshold
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
  if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT;

  return btnNONE;                // when all others fail, return this.
}

//affiche une ligne sur le LCD sur le modele "nom = xx.y °C"
void affiche_ligne(byte ligne, byte sonde) {
  lcd.setCursor(0, ligne);
  lcd.print(F("                ")); //efface la ligne
  lcd.setCursor(0, ligne);
  lcd.print(Nom[sonde]);            // affiche le nom en clair de la sonde
  lcd.print(F(" ="));
  lcd.print(temp[sonde], 1);        //affiche la valeur de la température
  lcd.print((char)223);             // caractère °
  lcd.print(F("C"));
}

//affiche l'écran selon la page (une page = un affichage différent sur l'ecran)
void affiche_ecran() {
 
  if (page == 0) {
    //page 0, on affiche la sonde 0 et 1
    affiche_ligne(0, 0); //ligne 0
    affiche_ligne(1, 1); //ligne 1
  } else if (page == 1) {
    //page 1, on affiche la sonde 2 et 3
    affiche_ligne(0, 2);
    affiche_ligne(1, 3);
  } else if (page == 2) {
    //page 1, on affiche la sonde 4 et 5
    affiche_ligne(0, 4);
    affiche_ligne(1, 5);
  }
}

// fonction qui lit les sondes, mémorise leur valeur, et demande une nouvelle mesure
void lit_sondes() {
  for (byte i = 0; i < 6 ; i++) { //parcoure les 6 sondes
    temp[i] = sensors.getTempC(adresse[i]); //lit la sonde en °C
  }
  sensors.requestTemperatures(); //demande aux sondes de refaire une nouvelle mesure
}

void loop() {
  //ici le programme tourne en boucle

  //lecture des boutons pour voir si on a appuyé
  byte bouton = read_LCD_buttons(); //lit le bouton (cette fonction renvoie un code)
  if ( bouton != btnNONE) {  //on a appuyé sur un bouton (btnNONE == pas d'appui)
    //on éclaire l'écran
    digitalWrite(PIN_LCD_BACKLIGHT, HIGH);
    
    //en fonction du bouton appuyé on change de page
    if (bouton == btnUP) { //exemple : appui sur le bouton HAUT, 
       digitalWrite(PIN_LCD_BACKLIGHT, HIGH);
    }
    if (bouton == btnDOWN) { //exemple : appui sur le bouton BAS, 
      digitalWrite(PIN_LCD_BACKLIGHT, LOW);
    }
  if (bouton == btnLEFT) { //exemple : appui sur le bouton left, 
page = 1;
  }
  if (bouton == btnRIGHT) { //exemple : appui sur le bouton left, 
page = 2;
  }
if (bouton == btnSELECT) { //exemple : appui sur le bouton left, 
page = 0;
  }
    
    //affiche la page actuelle
    affiche_ecran();
  }

  //si la dernière mesure des temps remontre à plus que l'intervalle, on lit les sondes
  if (millis() > next_temp) {
    next_temp  = next_temp + 1000 * t_temp; //date de la prochaine lecture
    lit_sondes();                           //lit les sondes
    affiche_ecran();                        //affiche les nouvelles mesures
  }

  

}

Tout a l'air de fonctionner correctement. Je vais de ce pas poser les sondes sur l'installation.

Si j'ai un souci de fonctionnement, je viendrai demander de l'aide dans peu de temps.

En tout cas, merci pour tout.

A plus

cool !

Re,

Chose que je n'avais pas abordée : est-il possible de récupérer les mesures ?

Cela me permettrait de faire des courbes. Pour ce soir, je vais noter heure par heure puis demain matin, je ferai le point. Il me manquera les données durant la nuit...

En tout cas, super content, ça marche du tonnerre ! J'ai branché l'Arduino sur un transfo 9 V, l'éclairage est énorme !

A plus

Pour sauvegarder les mesures il faut :
Soit une carte SD avec le Shield qui va bien
Soit laisser le pc connecté à l'arduino et récupérer les valeurs dans la console
Soit envoyer les données sur un site en ligne
...

Ok

Comment on fait pour la troisième solution ?

Bonjour à vous 2 je vous ai lu avec attention. Je viens d'acheter une carte uno R3 avec laquelle je voudrais faire de la mesure et de la régulation de température avec 5 ou 6 sondes ( 2 dans la cave à vins, 1 collé sur une bouteille pour avoir la T° du liquide, 1 dans le caisson de la clim qui si la T° dépasse 58°C continue à tourner sans donner de froid, bonjour le compteur EDF, 1 extérieure. J'ai déjà utilisé un DS18B20, sur une carte avec un STC12C5A60S2 écrit en Langage C. Mais je ne sais pas comment lire les autres sondes qui sont toutes branchées sur le 1-wire. Je pense que mon projet est très prêt du tiens. Alors si tu peux me procurer le schémas, le code ce serait très simpa. D’autant que j'ai fait 10 ans d'assembleur pur mais pas de C.. Je passe trop de temps à essayer de comprendre la programmation des autres. J'utilise un écran LCD12864V2, j'espère que l'on peux le programmer en mode série car il n'y a pas autant de PIO sur l'ATmega328P que sur un STC12C5A60S2. Voilà Merci de votre aide.

c'est le même afficheur mais je ne sais pas si le mien LCD12864V2 peux se programmer en mode série.