Salut,
Juste pour info : on m'a fait ce code pour 6 sondes :
J'ai testé sur 3 sondes (je dois recevoir les autres dans la semaine) et ça a l'air pas mal du tout. Il doit y avoir des petites améliorations à faire mais la base est là !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 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
A plus
-----