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 :

Hysteresis sur Arduino


Sujet :

Arduino

  1. #1
    Membre à l'essai
    Homme Profil pro
    A la retraite...
    Inscrit en
    Janvier 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : A la retraite...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 43
    Points : 22
    Points
    22
    Par défaut Hysteresis sur Arduino
    Bonjour à tous,

    Cela fait un (long)moment que j'ai mis de coté la programmation. Et voilà... je reviens avec une idée qui me taraude la tête depuis peu.

    Je voudrais faire un suivit de soleil avec un petit panneau photovoltaïque qui alimentera un petit ventilateur en fonction de la température intérieure de mon abris de jardin.

    J'ai déjà commandé la partie mécanique qui supportera le panneau. je possède une mega 2560 et j'ai déjà fait un petit sketch arduino pour le capteur LM35. A priori le prog fonctionne mais je voudrais peaufiner la mesure et implémenter un hystérésis.

    J'ai eu beau lire et relire des exemples mais je bloque. J'aurais besoin d'un peu d'aide pour intégrer ça dans mon prog.

    Merci en attendant...

    Georges

    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
     
    /*
       Code d'exemple pour le capteur LM35 (2°C ~ +110°C) avec une meilleure précision.
    */
    #include <LiquidCrystal_I2C.h>        // Include the required Arduino libraries:
    LiquidCrystal_I2C LCD(0x27, 16, 2);   // Create a new instance of the LiquidCrystal_I2C class:
     
    float Temp = 0;
     
    byte Degree[] = {          // Degree symbol:
      B00111,
      B00101,
      B00111,
      B00000,
      B00000,
      B00000,
      B00000,
      B00000,
    };
     
    byte EAccentAigu[] = {     // e accent aigu
      B00010,
      B00100,
      B01110,
      B10001,
      B11111,
      B10000,
      B01110,
      B00000,
    };
     
     
    // Fonction setup(), appelée au démarrage de la carte Arduino
    void setup() {
     
      // Initialise la communication avec le PC
      Serial.begin(9600);
     
      // Améliore la précision de la mesure en réduisant la plage de mesure
      analogReference(INTERNAL1V1); // Pour Arduino MEGA 2560
      pinMode(13, OUTPUT);       // met la broche numérique en sortie
     
      LCD.init();                     // Start the LCD and turn on the backlight:
      LCD.backlight();
      LCD.createChar(0, Degree);      // Create a custom character:
      LCD.createChar(1, EAccentAigu);
     
    }
     
    // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
    void loop() {
     
      // Mesure la tension sur la broche A11
      int Temp = analogRead(A1);
     
      // Transforme la mesure (nombre entier) en température via un produit en croix
      float temperature_celcius = Temp * (1.1 / 1008.0 * 100.0);
     
      // Envoi la mesure au PC pour affichage et attends 1 seconde
      Serial.println(temperature_celcius);
     
      delay(1000);
      // 
      LCD.setCursor(0, 0);                // Print the temperature on the LCD;
      LCD.print ("Temp");                  // mot Température avec accent aigu
      LCD.write (byte (1));               // affiche le caractère personnalisé EAccentAigu
      LCD.print ("rature:");
     
      LCD. setCursor ( 0, 1 ) ;
      LCD.print ((int)(float) (temperature_celcius));
      LCD.print('.');
      LCD. print ((int)((float)(temperature_celcius - (int)temperature_celcius) * 10 )) ;
      LCD. write(byte (0)) ;             // affiche le caractère personnalisé Degré
      LCD. print ( "C" ) ;
     
    if  (temperature_celcius >= 26.5){
        digitalWrite (13, HIGH) ;
      }
      else {
        digitalWrite (13, LOW) ;
      }
     
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut
    Bonjour,

    La gestion de l'hystérésis utilise ici deux valeurs constantes T_lo et T_hi qui représentent respectivement les seuils bas et haut de l'hystérésis. On peut aussi utiliser une valeur cible, T_target par exemple, avec une tolérance dT ( T_lo = T_target - dT et T_hi = T_target + dT). Une variable isOn conserve l'état actuel et permet d'éviter des digitalWrite répétitifs mais elle n'est pas absolument nécessaire.

    De même, en conservant l'avant dernière valeur de la température, on évite des opérations d'affichage si la température n'a pas bougé. Ce n'est pas indispensable ici (réécriture seulement toutes les secondes).

    Il est préférable de mettre la temporisation d'une seconde à la fin de la boucle car, là où elle est, l'affichage à un retard d'une seconde avec la mesure et ne correspond peut être plus à la réalité.

    Code C++ : 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
    /* Code d'exemple pour le capteur LM35 (2°C ~ +110°C) avec une meilleure précision. */
    #include <LiquidCrystal_I2C.h>                   // Include the required Arduino libraries:
    LiquidCrystal_I2C LCD(0x27, 16, 2);              // New instance of LiquidCrystal_I2C class:
     
    byte Degree[]      = {B00111, B00101, B00111, 0, 0, 0, 0, 0}; // "°"
    byte EAccentAigu[] = {B00010, B00100, B01110, B10001, B11111, B10000, B01110, 0};  // "é"
     
    const float T_lo = 26.0, T_hi = 27;              // Hystérésis 
    float T_old = 0.0;                               // Avant dernière valeur
    bool isOn  = false;                              // Etat actuel
     
    // Fonction setup(), appelée au démarrage de la carte Arduino
    void setup() {
       // Initialise la communication avec le PC
       Serial.begin(9600);
       // Améliore la précision de la mesure en réduisant la plage de mesure
       analogReference(INTERNAL1V1);                 // Pour Arduino MEGA 2560
       pinMode(13, OUTPUT);                          // met la broche numérique en sortie
       LCD.init();                                   // Start the LCD and turn on the backlight:
       LCD.backlight();
       LCD.createChar(0, Degree);                    // Create a custom character:
       LCD.createChar(1, EAccentAigu);
    }
     
    // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
    void loop() { 
       // Transforme la mesure (nombre entier) en température via un produit en croix
       float T_new = analogRead(A1)*(55.0 / 504.0);
       // Envoi la mesure au PC pour affichage et attends 1 seconde
       Serial.println(T_new);
       if(T_new != T_old) { 
          LCD.setCursor(0, 0);                       // Print the temperature on the LCD;
          LCD.print("Temp");                         // Mot Température avec accent aigu
          LCD.write(byte(1));                        // Affiche le caractère personnalisé EAccentAigu
          LCD.print("rature :");
          LCD.setCursor (0, 1 ) ;
          LCD.print(int(T_new));
          LCD.print('.');
          LCD.print(int((T_new - int(T_new))*10));
          LCD.write(byte(0)) ;                       // Affiche le caractère personnalisé °
          LCD.print("C") ;
          T_old = T_new;
       }
       if(isOn && (T_new < T_lo)) {                  // Gestion de l'hystérésis
          isOn = false;
          digitalWrite (13, LOW);
       } else if(! isOn && (T_new > T_hi) {
          isOn = true;
          digitalWrite (13, HIGH) ;
       }
       delay(1000);
    }

    Attention, programme non testé.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Changement de phase
    Bonjour,

    Il y a quand même un présupposé sur le fait qu'un ventilateur fait diminuer la température ce qui est faux. Il brasse l'air et tend à ramener la température à sa valeur moyenne (réchauffer les zones plus fraiches et rafraichir les zones plus chaudes. Mais la valeur moyenne ne bouge pas (voire même elle augmente avec la dissipation - certes faible - du moteur du ventilateur.

    Si l'être humain sent une fraicheur accrue c'est parce que le souffle d'air accélère la dissipation de la sueur ce qui diminue la température de la peau sans trop altérer la température ambiante.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  4. #4
    Membre à l'essai
    Homme Profil pro
    A la retraite...
    Inscrit en
    Janvier 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : A la retraite...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Désolé pour le temp de réponse.


    Citation Envoyé par Guesset Voir le message
    Bonjour,


    Si l'être humain sent une fraicheur accrue c'est parce que le souffle d'air accélère la dissipation de la sueur ce qui diminue la température de la peau sans trop altérer la température ambiante.

    Salutations
    Oui, on est bien d'accord...

    GG

  5. #5
    Membre à l'essai
    Homme Profil pro
    A la retraite...
    Inscrit en
    Janvier 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : A la retraite...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    re...

    le sketch fonctionne ... Il manquait seulement une accolade en fin de ligne 47 mais c'est déjà d'un niveau de programmation bien bien supérieur au mien...


    EDIT: un détail que j'ai omis d'indiquer .... dans mon premier message, le ventilo sert d'extracteur de chaleur

Discussions similaires

  1. Mise en place d'un lecteur mp3 sur Arduino
    Par lassgui dans le forum Arduino
    Réponses: 4
    Dernier message: 31/03/2014, 21h47
  2. Installer Mysql sur arduino
    Par Hamouti dans le forum Installation
    Réponses: 1
    Dernier message: 14/05/2013, 18h06
  3. [pyserial] lecture port série sur arduino
    Par blaster68 dans le forum Déploiement/Installation
    Réponses: 1
    Dernier message: 07/03/2013, 09h00
  4. C++ sur Arduino : mettre en forme une chaîne
    Par maccoa dans le forum Débuter
    Réponses: 3
    Dernier message: 27/03/2012, 00h14
  5. Réponses: 3
    Dernier message: 01/02/2010, 09h54

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