[Autre] Bricolage thermomètre multi-sondes - Page 4
Répondre à la discussion
Page 4 sur 4 PremièrePremière 4
Affichage des résultats 91 à 106 sur 106

Bricolage thermomètre multi-sondes



  1. #91
    Narbouki

    Re : Bricolage thermomètre multi-sondes


    ------

    Salut,

    Juste pour info : on m'a fait ce code pour 6 sondes :

    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
    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à !

    A plus

    -----

  2. #92
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    Salut,

    Juste pour ceux qui pourraient être intéressés : le code tel que je l'ai (légèrement) modifié à ma sauce

    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, 0xC9, 0xDC, 0x2, 0x15, 0x2, 0x6A , //   adresse sonde 0
      0x28, 0xFF, 0xC7, 0x31, 0xB0, 0x15, 0x3, 0xB1 , //   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
      }
    
      
    
    }
    Maintenant, je cherche un moyen pour récupérer les données pour faire des graphiques (genre 4 mesures de température par heure sur chaque sonde). Si certains ont une idée.

    A plus

  3. #93
    adipie

    Re : Bricolage thermomètre multi-sondes

    1/ Ajouter une RTC et un lecteur de carte SD, puis analyser les données sur excel.
    2/ Créer une liaison UART avec un PC, puis avec une application Windows, stocker et raiter les données

  4. #94
    adipie

    Re : Bricolage thermomètre multi-sondes

    Un exemple de visualisation d'un chauffage en utilisant un PIC, 8 sondes DS18B20 et une liaison sans fil Xbee vers une application Delphi sur PC.
    Ce système archive les donnée sur carte SD et permet de tracer des courbes.
    Exemple de visualisation en temps réel:
    SynPac.JPG

    Exemple de courbes d'une journée:
    BilPac.JPG

  5. #95
    picvert60

    Re : Bricolage thermomètre multi-sondes

    bonsoir
    la recup de données peut se faire sur le PC temp(1) temp(2) etc...
    --par le port serie et gobetwino ( un peu dur a mettre en route).
    --sur une carte SD en format CSV pour excel
    --sur l'écran mais le 20*4 est insuffisant en pixels
    il faut un ecran TFT (3.2" 320 *480 pixels et un arduino mega pour un travail tranquille)
    plus petit je n'ai pas l'expérience en tous cas ecran couleur pour différencier les sondes
    ça existe pour uno

    bon courage

  6. #96
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    Salut et merci pour vos avis.

    Je ne me suis pas encore renseigné sur le domaine donc quand vous parlez "gobetwino", "une liaison UART" ou autre, c'est vraiment du chinois pour moi !

    Ce que je n'ai pas envie c'est d'avoir un câble du PC à l'Arduino ou de devoir déplacer une carte SD pour lire les infos.

    Exemple de visualisation en temps réel:
    Je trouve ça pas mal du tout ! Difficile à mettre en place ?

  7. #97
    picvert60

    Re : Bricolage thermomètre multi-sondes

    gobetwino est un logiciel

    a priori il ne te reste que la solution ecran TFT
    un petit tutoriel
    http://tiptopboards.free.fr/arduino_...c.php?f=2&t=73

  8. #98
    adipie

    Re : Bricolage thermomètre multi-sondes

    Citation Envoyé par Narbouki Voir le message
    Ce que je n'ai pas envie c'est d'avoir un câble du PC à l'Arduino ou de devoir déplacer une carte SD pour lire les infos.
    Dans ce cas, utilise 2 modules sans fil XBEE ou XBEE PRO (dépend de la distance)
    S'utilise comme une liaison RS232.

  9. #99
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    Re,

    En gros, il y a une dizaine de mètres sans aucun obstacle.

    Le gros écran TFT me plaît bien mais j'aimerai pouvoir aussi avoir les données sur le PC.

    Merci et à plus.

  10. #100
    bobflux

    Re : Bricolage thermomètre multi-sondes

    Si t'as le wifi à portée tu peux mettre un module wifi sur ton arduino...

  11. #101
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    J'ai le Wifi mais il est rarement en fonctionnement et je ne souhaite pas l'allumer en permanence.

  12. #102
    adipie

    Re : Bricolage thermomètre multi-sondes

    Citation Envoyé par Narbouki Voir le message
    En gros, il y a une dizaine de mètres sans aucun obstacle.
    Dans ce cas il te faut:
    2 Modules XBEE http://www.lextronic.fr/P5455-module...4-awi-001.html

    1 base coté PC http://www.lextronic.fr/P26733-dongl...dule-xbee.html

    1 Base coté Arduino http://www.lextronic.fr/P19084-plati...r-arduino.html

  13. #103
    adipie

    Dernière modification par adipie ; 05/03/2016 à 16h53.

  14. #104
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    Ok nickel !

    Par contre, ça fait un petit budget...

    Question : étant donné que le PC ne sera pas allumé en permanence, les données seront-elles stockées et exploitables par la suite ?

    A plus

  15. #105
    adipie

    Re : Bricolage thermomètre multi-sondes

    Citation Envoyé par Narbouki Voir le message
    Ok nickel !
    Par contre, ça fait un petit budget...
    Question : étant donné que le PC ne sera pas allumé en permanence, les données seront-elles stockées et exploitables par la suite ?
    A plus
    C'est pas donné, mais facile à mettre en oeuvre.
    Un PC hors tension ne peux rien stocker, d'ou l'intérêt de stocker sur carte SD, puis analyse avec un PC.
    Dans mon application je stocke sur carte SD toutes les 3 s. la date, l'heure, 8 températures et un mot d'état des entrées Tor,
    Ce qui correspond à environ 90 Mo par mois.

  16. #106
    Narbouki

    Re : Bricolage thermomètre multi-sondes

    Salut,

    Je trouve ça vraiment pas mal. La seule choses qui me freine, c'est le prix...

Page 4 sur 4 PremièrePremière 4

Discussions similaires

  1. Le MSAN,Multi-Service Access Node ou le Noeud d'Accès Multi-Service
    Par invitedbc53c88 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 0
    Dernier message: 22/03/2010, 15h01
  2. Thermomètre à mercure VS thermomètre à gaz parfait
    Par invitef1881787 dans le forum Physique
    Réponses: 7
    Dernier message: 14/08/2008, 15h21
  3. 2 sondes de T° sur un thermomètre
    Par paulomoto11 dans le forum Électronique
    Réponses: 20
    Dernier message: 21/11/2007, 10h40
  4. Chargeur (GSM) - multi input - multi output
    Par james_patageul dans le forum Électronique
    Réponses: 0
    Dernier message: 15/07/2006, 18h14
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...