IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Comment exploiter deux sondes de température en même temps ?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut Comment exploiter deux sondes de température en même temps ?
    Bonjour,

    Je débute sur Arduino.

    Je voudrais utiliser deux son de température, une pour l'air et une pour l'eau.
    J'arrive à en faire fonctionner une mais pas les deux.

    Mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include "OneWire.h"
    #include "DallasTemperature.h"
    const int BtnPac = 2;
    int EtatPac;
     
    #define EAU_TEMP_PIN A0 
    #define AIR_TEMP_PIN A1
    OneWire oneWire(EAU_TEMP_PIN); 
    OneWire oneWire(AIR_TEMP_PIN);
    DallasTemperature sensors(&oneWire);
     
     
    void setup() 
    {
      // On initialise la connexion série
      Serial.begin(9600);
      delay(2000);
     
      // On imprime un texte de bienvenu
      Serial.println("Salut je me réveille");
     
      //pinMode(bouton, INPUT_PULLUP);
    }
     
    void loop() 
    {
     
      //etat = digitalRead(bouton);
     
      // On récupère la température de la sonde
      sensors.requestTemperatures();
      double dTempWater = sensors.getTempCByIndex(0);
     
     
      // On imprime la température de l'eau
      Serial.print("Température de l'eau: ");
      Serial.print(dTempWater);
      Serial.println("°C");
     
      double dTempAir = sensors.getTempCByIndex(1);
     
      // On imprime la température de l'air
      Serial.print("Température de l'air: ");
      Serial.print(dTempAir);
      Serial.println("°C");
     
      // On attends 5 secondes
      delay(5000);
    }
    Ca doit être basic je supposde
    merci de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci de votre aide,

    J'ai régardé oui mais je ne comprends pas comment je gère les 2 entrées analogiques de mes sondes.
    Dans le code exemple, ils indiquent un seul port, le 2.
    Et si j'ai deux sondes, je dois forcément connecter 2 ports non ?

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Salut

    Non, Voyez ça Un peu comme la route qui va chez vous (je suppose qu’il y a des voisins) et le facteur quand il vient apporter une lettre prend l’unique route mais trouve la bonne personne grâce à l’adresse et le nom sur l’enveloppe

    Ici c’est pareil. comme son nom l’indique OneWire n’a besoin que d’un seul fil (bon en pratique deux fils, un fil de données et un fil de masse). C’est un bus de communication série permettant l'adressage (chaque composant sur le bus a une adresse) et l'utilisation donc de plusieurs capteurs sur le même fil.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci Jay,

    Ok, je comprend l'idée de la même route avec l'adresse.
    Donc je raccorde mes deux sondes à la même borne analogique ?
    Mais comment savoir qui est qui ?
    Quelle sonde va avec quelle adresse ?
    Ou même qu'elle est l'adresse à utliser ?

    Merci de votre aide, c'est très pédagogique ;-)

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bonjour

    Vous n’avez pas forcément besoin d’une broche analogique, c’est un protocole de communication numérique.

    Chaque composant dispose d’un numéro d’identification unique intégré dans le composant (son adresse) et vous pouvez interroger un appareil particulier par son adresse ou alors parcourir tous les objets branchés sur le bus un par un

    Avez vous essayé l’exemple ? si vous regardez les commentaires (en anglais) ils expliquent les différentes façons d’interroger les appareils.

    Si vous voulez savoir qui et qui sur le bus, vous faites un petit montage avec qu’un seul appareil, vous faites afficher son adresse et vous la notez dans un coin, puis branchez le prochain composant et notez son adresse etc. Ensuite il ne vous reste plus qu’à les mettre tous sur le bus et les interroger dans l’ordre que vous voulez en les recherchant par cette adresse unique.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci de votre aide,

    J'avoue ne pas bien maitriser l'anglais ce qui est un handicap pour la programmation.
    Avec votre aide, j'ai réussi à faire fonctionner mais 2 sondes, merci.

    Maintenant j'ai un autre problème :
    Je voulais ajouter un capteur de température et de taux d'humidité de l'air.
    J'ai donc mes deux sondes qui fonctionnent bien.
    Leur code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    //Librairies
    #include "OneWire.h"
    #include "DallasTemperature.h"
     
    #define ONE_WIRE_PIN A0 
    #define TEMPERATURE_PRECISION 9
     
    OneWire oneWire(ONE_WIRE_PIN);
    DallasTemperature sensors(&oneWire);
     
    // arrays to hold device addresses
    DeviceAddress insideThermometer, outsideThermometer;
     
    void setup() 
    {
      //On initialise la connexion série
      Serial.begin(9600);
      delay(2000);
     
      //On imprime un texte de bienvenu
      Serial.println("Salut je me réveille");
     
      //pinMode(bouton, INPUT_PULLUP);
      // Start up the library
      sensors.begin();
     
      // locate devices on the bus
      Serial.print("Locating devices...");
      Serial.print("Found ");
      Serial.print(sensors.getDeviceCount(), DEC);
      Serial.println(" devices.");
     
      // report parasite power requirements
      Serial.print("Parasite power is: ");
      if (sensors.isParasitePowerMode()) Serial.println("ON");
      else Serial.println("OFF");
     
      // method 1: by index
      if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
      if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
     
      // show the addresses we found on the bus
      Serial.print("Device 0 Address: ");
      printAddress(insideThermometer);
      Serial.println();
     
      Serial.print("Device 1 Address: ");
      printAddress(outsideThermometer);
      Serial.println();
     
      // set the resolution to 9 bit per device
      sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
      sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
     
      Serial.print("Device 0 Resolution: ");
      Serial.print(sensors.getResolution(insideThermometer), DEC);
      Serial.println();
     
      Serial.print("Device 1 Resolution: ");
      Serial.print(sensors.getResolution(outsideThermometer), DEC);
      Serial.println();
     
     
     
    }
     
    // function to print a device address
    void printAddress(DeviceAddress deviceAddress)
    {
      for (uint8_t i = 0; i < 8; i++)
      {
        // zero pad the address if necessary
        if (deviceAddress[i] < 16) Serial.print("0");
        Serial.print(deviceAddress[i], HEX);
      }
    }
     
    // function to print the temperature for a device
    void printTemperature(DeviceAddress deviceAddress)
    {
      float tempC = sensors.getTempC(deviceAddress);
      if(tempC == DEVICE_DISCONNECTED_C) 
      {
        Serial.println("Error: Could not read temperature data");
        return;
      }
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.print(DallasTemperature::toFahrenheit(tempC));
    }
     
    // function to print a device's resolution
    void printResolution(DeviceAddress deviceAddress)
    {
      Serial.print("Resolution: ");
      Serial.print(sensors.getResolution(deviceAddress));
      Serial.println();
    }
     
    // main function to print information about a device
    void printData(DeviceAddress deviceAddress)
    {
      Serial.print("Device Address: ");
      printAddress(deviceAddress);
      Serial.print(" ");
      printTemperature(deviceAddress);
      Serial.println();
    }
     
    /*
       Main function, calls the temperatures in a loop.
    */
     
    void loop() 
    {
     
      //etat = digitalRead(bouton);
     
      // On récupère la température de la sonde
      sensors.requestTemperatures();
      double dTempWater = sensors.getTempCByIndex(0);
     
     
      // On imprime la température de l'eau
      Serial.print("Température de l'eau: ");
      Serial.print(dTempWater);
      Serial.println("°C");
     
      double dTempAir = sensors.getTempCByIndex(1);
     
      // On imprime la température de l'air
      Serial.print("Température de l'air: ");
      Serial.print(dTempAir);
      Serial.println("°C");
     
      // On attends 5 secondes
      delay(5000);
    }
    J'ai un DHT11 qui était inclus dans un kit arduino
    Quand je test le DHT11 seul, pas de problème, les données sont bien captées
    Son code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    //www.elegoo.com
    //2018.10.25
     
     
    #include <dht_nonblocking.h>
    #define DHT_SENSOR_TYPE DHT_TYPE_11
     
    static const int DHT_SENSOR_PIN = 2;
    DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
     
     
     
    /*
     * Initialize the serial port.
     */
    void setup( )
    {
      Serial.begin( 9600);
    }
     
     
     
    /*
     * Poll for a measurement, keeping the state machine alive.  Returns
     * true if a measurement is available.
     */
    static bool measure_environment( float *temperature, float *humidity )
    {
      static unsigned long measurement_timestamp = millis( );
     
      /* Measure once every four seconds. */
      if( millis( ) - measurement_timestamp > 3000ul )
      {
        if( dht_sensor.measure( temperature, humidity ) == true )
        {
          measurement_timestamp = millis( );
          return( true );
        }
      }
     
      return( false );
    }
     
     
     
    /*
     * Main program loop.
     */
    void loop( )
    {
      float temperature;
      float humidity;
     
      /* Measure temperature and humidity.  If the functions returns
         true, then a measurement is available. */
      if( measure_environment( &temperature, &humidity ) == true )
      {
        Serial.print( "T = " );
        Serial.print( temperature, 1 );
        Serial.print( " deg. C, H = " );
        Serial.print( humidity, 1 );
        Serial.println( "%" );
      }
    }
    Mais quand j'essaie de combiner les codes, les résultats du DHT11 ne s'affichent pas.
    Je n'ai que les valeurs des sondes de température

    mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    //Librairies et paramètres DS18B20
    #include "OneWire.h"
    #include "DallasTemperature.h"
    #define ONE_WIRE_PIN A0 
    #define TEMPERATURE_PRECISION 9
    OneWire oneWire(ONE_WIRE_PIN);
    DallasTemperature sensors(&oneWire);
    DeviceAddress insideThermometer, outsideThermometer;
     
    //Librairies et paramètre DHT 11
    #include <dht_nonblocking.h>
    #define DHT_SENSOR_TYPE DHT_TYPE_11
    static const int DHT_SENSOR_PIN = 2;
    DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
     
    void setup() 
    {
      //On initialise la connexion série
      Serial.begin(9600);
      delay(2000);
     
      //On imprime un texte de bienvenu
      Serial.println("Début..");
     
      // Start up the library
      sensors.begin();
     
      //locate devices on the bus
      Serial.print("Locating devices...");
      Serial.print("Found ");
      Serial.print(sensors.getDeviceCount(), DEC);
      Serial.println(" devices.");
     
      //report parasite power requirements
      Serial.print("Parasite power is: ");
      if (sensors.isParasitePowerMode()) Serial.println("ON");
      else Serial.println("OFF");
     
      // method 1: by index
      if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
      if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
     
      // show the addresses we found on the bus
      Serial.print("Device 0 Address: ");
      printAddress(insideThermometer);
      Serial.println();
     
      Serial.print("Device 1 Address: ");
      printAddress(outsideThermometer);
      Serial.println();
     
      // set the resolution to 9 bit per device
      sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
      sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
     
      Serial.print("Device 0 Resolution: ");
      Serial.print(sensors.getResolution(insideThermometer), DEC);
      Serial.println();
     
      Serial.print("Device 1 Resolution: ");
      Serial.print(sensors.getResolution(outsideThermometer), DEC);
      Serial.println();
    }
     
    /*
     * Poll for a measurement, keeping the state machine alive.  Returns
     * true if a measurement is available.
     */
    static bool measure_environment( float *temperature, float *humidity )
    {
      static unsigned long measurement_timestamp = millis( );
     
      /* Measure once every four seconds. */
      if( millis( ) - measurement_timestamp > 3000ul )
      {
        if( dht_sensor.measure( temperature, humidity ) == true )
        {
          measurement_timestamp = millis( );
          return( true );
        }
      }
     
      return( false );
    }
     
    // function to print a device address
    void printAddress(DeviceAddress deviceAddress)
    {
      for (uint8_t i = 0; i < 8; i++)
      {
        // zero pad the address if necessary
        if (deviceAddress[i] < 16) Serial.print("0");
        Serial.print(deviceAddress[i], HEX);
      }
    }
     
    // function to print the temperature for a device
    void printTemperature(DeviceAddress deviceAddress)
    {
      float tempC = sensors.getTempC(deviceAddress);
      if(tempC == DEVICE_DISCONNECTED_C) 
      {
        Serial.println("Error: Could not read temperature data");
        return;
      }
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.print(DallasTemperature::toFahrenheit(tempC));
    }
     
    // function to print a device's resolution
    void printResolution(DeviceAddress deviceAddress)
    {
      Serial.print("Resolution: ");
      Serial.print(sensors.getResolution(deviceAddress));
      Serial.println();
    }
     
    // main function to print information about a device
    void printData(DeviceAddress deviceAddress)
    {
      Serial.print("Device Address: ");
      printAddress(deviceAddress);
      Serial.print(" ");
      printTemperature(deviceAddress);
      Serial.println();
    }
     
    /*
       Main function, calls the temperatures in a loop.
    */
     
    void loop() 
    {
     
      float temperature;
      float humidity;
     
      /* Measure temperature and humidity.  If the functions returns
         true, then a measurement is available. */
      if( measure_environment( &temperature, &humidity ) == true )
      {
        Serial.print( "T = " );
        Serial.print( temperature, 1 );
        Serial.print( " deg. C, H = " );
        Serial.print( humidity, 1 );
        Serial.println( "%" );
      }
     
      // On récupère la température de la sonde
      sensors.requestTemperatures();
      double dTempWater = sensors.getTempCByIndex(0);
     
     
      // On imprime la température de l'eau
      Serial.print("Température de l'eau: ");
      Serial.print(dTempWater);
      Serial.println("°C");
     
      double dTempAir = sensors.getTempCByIndex(1);
     
      // On imprime la température de l'air
      Serial.print("Température de l'air: ");
      Serial.print(dTempAir);
      Serial.println("°C");
     
      // On attends 5 secondes
      delay(5000);
    }
    Merci de votre aide

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Prenez la bibliothèque adafruit pour la dht11, ce sera synchrone et donc vous ferez vraiment une tache après l’autre

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci Jay,

    Je vais tester ça.
    Dsl, je suis totalement débutant et perdu
    Merci de votre aide

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Mersi Jay,

    J'ai reprise les codes de Adafruit et ça marche nickel.
    Merci de votre aide

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    super

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Comment imprimer deux feuilles (sheets) sur la même page ?
    Par verredewhisky dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/02/2013, 21h33
  2. Réponses: 6
    Dernier message: 30/05/2012, 20h19
  3. Réponses: 6
    Dernier message: 16/08/2010, 17h42
  4. Réponses: 13
    Dernier message: 10/12/2005, 13h34
  5. [MySQL] Se connecter à deux base de données en même temps ??
    Par leo13 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 20/01/2005, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo