Deuligne et entrées analogiques

Forum spécifique au shield Deuligne

Deuligne et entrées analogiques

Message non lude SamSab83 » Jeu 10 Jan 2013 15:52

Bonjour,

Je rencontre un disfonctionnement avec un capteur de température LM35DZ connecté sur une entrée analogique disponible du Deuligne.

Voici mon code :

Code: Tout sélectionner
/*    Thermomètre Mini / Maxi avec un LM35DZ connecté à l'entrée analogique A1, affichage sur le LCD Deuligne
//    mémorisation des mini / maxi consultables par les flèches haut / bas du joystick
//    retour au thermomètre par la touche validation
*/

#include <Wire.h>          // déclaration de la librairie I2C
#include <Deuligne.h>      // déclaration de la librairie LCD Deuligne

Deuligne lcd;                           // déclaration de l'objet lcd (afficheur LCD Deuligne)

float Temp_Mini = 100.00;      // définition de la variable de stockage de la mesure mini         
float Temp_Maxi = 0.00;        // définition de la variable de stockage de la mesure maxi
int joystick;                  // définition de la variable touche joystick
int choix = 4;                 // définition de la variable choix
float ValeurCapteur, Temp;     // définition des variables valeur capteur LM35DZ et température

void setup()
  {
  Wire.begin();                   // initialisation du bus I2C pour communication avec l'afficheur LCD Deuligne
  lcd.init();                     // initialisation de l'afficheur LCD
  lcd.clear();                    // effacement de l'afficheur LCD
  lcd.backLight(true);            // allumage du rétroéclairage de l'afficheur LCD
  lcd.setCursor(1,0);             // positionne le curseur de l'afficheur LCD colonne 1, ligne 0
  lcd.print("Configuration");     // affichage texte "Configuration"
  lcd.setCursor(7,1);             // positionne le curseur de l'afficheur LCD colonne 7, ligne 1
  lcd.print("Ok");                // affichage texte "Ok"
  delay(2000);                    // pause de 2 secondes
  lcd.clear();                    // effacement de l'afficheur LCD
  }

void loop()
  {
  joystick = lcd.get_key();       // lecture de l'entrée analogique joystick
  if (joystick != -1)        // appui touche joystick détecté
  {
    delay(50);                // délai d'anti-rebondissement
    joystick = lcd.get_key();     // lecture de l'entrée analogique joystick
    if (joystick != -1)        // appui touche joystick détecté      
    {         
      choix = joystick;           // mise en mémoire du choix effectué
    }
  }
 
  ValeurCapteur = analogRead(A1);  // mesure de l'entrée analogique A1
  Temp = ValeurCapteur*500/1023;   // conversion en °C
 
  switch(choix)
  {
    case 4 :
    if (Temp > 100 || Temp < 0)    // si la température n'est pas dans la plage 0 - 100°C
    {
      lcd.clear();                 // effacement de l'afficheur LCD
      lcd.setCursor(0, 0);         // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
      lcd.print("Hors limite");    // affichage texte "Hors limite"
    }
    else
    {
    if (Temp > Temp_Maxi)          // mise en mémoire de la température maxi
    {
      Temp_Maxi = Temp ;
    }
    if (Temp < Temp_Mini)          // mise en mémoire de la température mini
    {
      Temp_Mini = Temp;
    }
 
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0, 0);           // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Temp = ");          // affichage texte "Temp ="
    lcd.print(Temp);               // affichage de la température mesurée
    }
    break;
   
  case 1 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Temp Maxi = ");     // affichage texte "Temp Maxi ="
    lcd.print(Temp_Maxi);          // affichage de la température maxi
    break;
 
  case 2 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Temp Mini = ");     // affichage texte "Temp Mini ="
    lcd.print(Temp_Mini);          // affichage de la température mini
    break;
  }
 
  delay(1000);                      // pause de 1 seconde
  }


La température affichée est aléatoire et erronée. Alors que la tension en entrée sur A1 est bonne et stable (environ 190mV).

Même conséquence si le capteur est connecté en A2 ou A3 et si la carte Arduino est alimentée en externe.

J'ai observé que si je remplace le LM35DZ par un potentiomètre, le code fonctionne très bien avec une mesure juste et stable.

Si je transforme en zone de commentaires le bout de code "sélection touche" contenant la fonction lcd.get_key(), la mesure est également juste et stable.

Pourriez-vous m'éclairer car je ne comprends pas pourquoi le convertisseur analogique/numérique est affecté ?
Est-ce la librairie Deuligne et la fonction lcd.get_key() ?
Le schéma du Deuligne est-il disponible en ligne ?


La même structure de code avec un capteur à ultrason connecté sur les entrées / sorties numériques fonctionne correctement.

Code que voici :

Code: Tout sélectionner
/*    Mesure de distance avec le transpondeur HC-SR04 et sa librairie
//    avec affichage sur l'écran LCD
//    Mesure entre 100 et 500mm et mémorisation des mini / maxi
//    consultables par les flèches haut / bas du joystick
//    retour à la mesure par la touche validation
*/

#include <Ultrasonic.h>    // déclaration de la librairie du capteur à ultrason
#include <Wire.h>          // déclaration de la librairie I2C
#include <Deuligne.h>      // déclaration de la librairie LCD Deuligne

#define Trig  13          // déclaration de la pin 13 en Trigger (capteur ultrason)
#define Echo  12          // déclaration de la pin 12 en Echo (capteur ultrason)

Ultrasonic CapteurUS(Trig, Echo);       // déclaration de l'objet CapteurUS (capteur à ultrason)
Deuligne lcd;                           // déclaration de l'objet lcd (afficheur LCD Deuligne)

float Cm_Mini = 100.00;      // définition de la variable mesure mini         
float Cm_Maxi = 0.00;        // définition de la variable mesure maxi
int joystick;                // définition de la variable touche joystick
int choix =4;                // définition de la variable choix

void setup()
  {
  Wire.begin();                   // initialisation du bus I2C pour communication avec l'afficheur LCD Deuligne
  lcd.init();                     // initialisation de l'afficheur LCD
  lcd.clear();                    // effacement de l'afficheur LCD
  lcd.backLight(true);            // allumage du rétroéclairage de l'afficheur LCD
  lcd.setCursor(1,0);             // positionne le curseur de l'afficheur LCD colonne 1, ligne 0
  lcd.print("Configuration");     // affichage texte "Configuration"
  lcd.setCursor(7,1);             // positionne le curseur de l'afficheur LCD colonne 7, ligne 1
  lcd.print("Ok");                // affichage texte "Ok"
  delay(2000);                    // pause de 2 secondes
  lcd.clear();                    // effacement de l'afficheur LCD
  }

void loop()
  {
  joystick = lcd.get_key();       // lecture de l'entrée analogique joystick
  if (joystick != -1)        // appui touche joystick détecté
  {
    delay(50);                // délai d'anti-rebondissement
    joystick = lcd.get_key();     // lecture de l'entrée analogique joystick
    if (joystick != -1)        // appui touche joystick détecté      
    {         
      choix = joystick;           // mise en mémoire du choix
    }
  }
   
  long microsec = CapteurUS.timing();                      // mesure de la distance
  float cm = CapteurUS.convert(microsec, Ultrasonic::CM);  // conversion en centimètre

  switch(choix)
  {
    case 4 :
    if (cm > 50 || cm < 10)        // si distance hors de la plage 10 - 50cm
    {
      lcd.clear();                 // effacement de l'afficheur LCD
      lcd.setCursor(0, 0);         // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
      lcd.print("Hors limite");    // affichage texte "Hors limite"
    }
    else
    {
    if (cm > Cm_Maxi)
    {
      Cm_Maxi = cm ;               // mise en mémoire de la distance maxi
    }
    if (cm < Cm_Mini)
    {
      Cm_Mini = cm;                // mise en mémoire de la distance mini
    }
 
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0, 0);           // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Distance = ");      // affichage texte "Distance ="
    lcd.print(cm);                 // affichage valeur de la distance mesurée
    }
    break;
   
  case 1 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Maxi = ");          // affichage texte "Maxi ="
    lcd.print(Cm_Maxi);            // affichage valeur de la distance maxi mesurée
    break;
 
  case 2 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Mini = ");          // affichage texte "Mini ="
    lcd.print(Cm_Mini);            // affichage valeur de la distance mini mesurée
    break;
  }
 
  delay(200);                      // pause de 200ms
  }
 


En vous remerciant.

Bonne année à tous.
SamSab83
 
Messages: 2
Inscription: Mer 9 Jan 2013 18:15

Re: Deuligne et entrées analogiques

Message non lude SamSab83 » Mar 15 Jan 2013 12:39

J'ai résolu le disfonctionnement rencontré en insérant un montage suiveur non-inverseur à base de LM358, entre le capteur de température LM35DZ et l'entrée analogique A1.

En adaptant les impédances, j'ai retrouvé un fonctionnement normal du convertisseur analogique/numérique.

Voici le code final :

Code: Tout sélectionner
/*    Thermomètre Mini / Maxi avec un LM35DZ connecté à l'entrée analogique A1, via un montage suiveur non-inverseur à base de LM358 (adaptation impédance)
//    affichage sur le LCD Deuligne
//    mémorisation des mini / maxi consultables par les flèches haut / bas du joystick
//    retour au thermomètre par la touche validation
*/

#include <Wire.h>                // déclaration de la librairie I2C
#include <Deuligne.h>            // déclaration de la librairie LCD Deuligne
Deuligne lcd;                    // déclaration de l'objet lcd (afficheur LCD Deuligne)
int joystick;                    // définition de la variable touche joystick
int choix = 4;                   // définition de la variable choix
float Temp_Mini = 100.0;         // définition de la variable de stockage de la mesure mini         
float Temp_Maxi = 0.0;           // définition de la variable de stockage de la mesure maxi
byte degre[8] = {                // définition du caractère °
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
  };

void setup()
  {
  Wire.begin();                   // initialisation du bus I2C pour communication avec l'afficheur LCD Deuligne
  lcd.init();                     // initialisation de l'afficheur LCD
  lcd.clear();                    // effacement de l'afficheur LCD
  lcd.backLight(true);            // allumage du rétroéclairage de l'afficheur LCD
  lcd.setCursor(1,0);             // positionne le curseur de l'afficheur LCD colonne 1, ligne 0
  lcd.print("Configuration");     // affichage texte "Configuration"
  lcd.setCursor(7,1);             // positionne le curseur de l'afficheur LCD colonne 7, ligne 1
  lcd.print("Ok");                // affichage texte "Ok"
  delay(2000);                    // pause de 2 secondes
  lcd.clear();                    // effacement de l'afficheur LCD
  lcd.setCursor(2,0);             // positionne le curseur de l'afficheur LCD colonne 2, ligne 0
  lcd.print("Thermometre");       // affichage texte "Thermometre"
  lcd.setCursor(2,1);             // positionne le curseur de l'afficheur LCD colonne 2, ligne 1
  lcd.print("Mini / Maxi");       // affichage texte "Mini / Maxi"
  delay(2000);                    // pause de 2 secondes
  lcd.createChar(0, degre);       // création du caractère ° en 0
  }

void loop()
  {
  joystick = lcd.get_key();       // lecture de l'entrée analogique joystick
  if (joystick != -1)        // appui touche joystick détecté
  {
    delay(50);                // délai d'anti-rebondissement
    joystick = lcd.get_key();     // lecture de l'entrée analogique joystick
    if (joystick != -1)        // appui touche joystick détecté      
    {         
      choix = joystick;           // mise en mémoire du choix effectué
    }
  }
 
  int ValeurCapteur = analogRead(A1);        // mesure de l'entrée analogique A1
  float Temp = ValeurCapteur*500.0/1023.0;   // conversion en °C
 
  switch(choix)
  {
    case 4 :
    if (Temp > 100 || Temp < 0)    // si la température n'est pas dans la plage 0 - 100°C
    {
      lcd.clear();                 // effacement de l'afficheur LCD
      lcd.setCursor(0, 0);         // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
      lcd.print("Hors limite");    // affichage texte "Hors limite"
    }
    else
    {
    if (Temp > Temp_Maxi)          // mise en mémoire de la température maxi
    {
      Temp_Maxi = Temp ;
    }
    if (Temp < Temp_Mini)          // mise en mémoire de la température mini
    {
      Temp_Mini = Temp;
    }
 
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0, 0);           // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Temp : ");          // affichage texte "Temp :"
    lcd.print(Temp,1);               // affichage de la température mesurée
    lcd.write(0);
    lcd.print("C");
    }
    break;
   
  case 1 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Maxi : ");          // affichage texte "Maxi :"
    lcd.print(Temp_Maxi,1);          // affichage de la température maxi
    lcd.write(0);
    lcd.print("C");
    break;
 
  case 2 :
    lcd.clear();                   // effacement de l'afficheur LCD
    lcd.setCursor(0,0);            // positionne le curseur de l'afficheur LCD colonne 0, ligne 0
    lcd.print("Mini : ");          // affichage texte "Mini :"
    lcd.print(Temp_Mini,1);          // affichage de la température mini
    lcd.write(0);
    lcd.print("C");
    break;
  }
  delay(1000);                      // pause de 1 seconde
  }
 
SamSab83
 
Messages: 2
Inscription: Mer 9 Jan 2013 18:15


Retourner vers Deuligne

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron