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 :

Projet solaire


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Projet solaire
    Bonjour je suis nouveau sur le forum.

    je suis sur un projet de chauffe eau solaire / chauffage piscine
    je n arrive pas a avoir un code qui fonctionne correctement.
    étant novice en programmation je me tourne vers vous pour un petit coup de pouce.

    Description du projet(installation réalise)


    2 capteurs solaire
    3 sondes 18b20
    un circulateur
    une vanne 3 voie

    mon bute et de mettre le chauffe eau en priorité et ensuite de basculer sur la piscine.

    je vous mais une ebauche que j ai réalise mais cela ne fonctionne pas correctement.

    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
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    /*
      teste 1 prog chauffe eau solaire
     */
     
    // Inclure la librairie LiquidCrystal
    #include <LiquidCrystal.h>
     
    // Initialisation de la librairie Liquid Crystal
    LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
     
    #include <OneWire.h>               // Pour les capteurs de température
     
     
    /*
    **  Déclaration des constantes et des paramètres
    */
     
     
    #define onewireModeLecture 0xBE    // Code pour initier la lecture des capteurs OneWire
    #define onewireModeMesure 0x44     // Code pour déclencher la lecture des capteurs OneWire
    #define onewireNb 3                // Nombre de capteurs OneWire gérés
     
    const int pinOneWire = 9;          // Broche utilisée pour lire les températures disponibles via des composant One-Wire DS18B20
     
     
     
    //relais
    const int RELAISpompe = A3;
    const int RELAISvanne = A4;
     
    // Adresses matérielles des capteurs One-Wire  <== Là, il faut mettre les adresses des capteurs réellement utilisés
    static byte onewireSensorSerial[onewireNb][8] = {
      { 0x28, 0xFF, 0x58, 0xB1, 0x87, 0x16, 0x03, 0x41 },    // Température à l'intérieur des panneaux solaires
      { 0x28, 0xFF, 0x78, 0x46, 0x91, 0x16, 0x04, 0x56 },    // Bas du ballon d'eau chaude
      { 0x28, 0xFF, 0x66, 0xC7, 0x90, 0x16, 0x04, 0x75 },    // REMPERATURE PISCINE
     
    };
     
     
    float tempballon = -99.9;
    float tempcapteur = -99.0;
    float tempretour = -99.0;
    float temppiscine = -99.0;
     
    const float temperatureMini = -40.0 ;                        // Température en dessous de la quelle elle n'est pas prise en compte
    const unsigned long temperatureReadInterval = 10L * 1000L;  // Temps entre 2 lectures de température
     
    unsigned long pumpStartTime = 0;       // Temps écoulé, en millisecondes, depuis le démarrage de la pompe de circulation
    unsigned long temperatureTime = 0;     // Temps écoulé, en millisecondes, depuis la dernière lecture des températures
     
     
    /*
    **  Création des objets
    */
    OneWire oneWire(pinOneWire);           // On défini la broche utilisée pour OneWire
     
     
    void setup() {
      // Configuration de l'afficheur 16 caractères en 2 lignes 
      lcd.begin(16, 2);
      // Ecriture de la ligne 1
       lcd.setCursor(0, 0);
       lcd.print("TP:");
      lcd.setCursor(0, 1);
        lcd.print("TB:");
        lcd.setCursor(8, 1);
        lcd.print("TC:");
     
     // relais
     pinMode(RELAISpompe, OUTPUT);
     pinMode(RELAISvanne, OUTPUT);
     
      // Effectue une première mesure pour alimenter les capteurs de température
      for (int i = 0; i <= onewireNb; i++) {
        onewireMesureTemp(onewireSensorSerial);
      }
      delay(2000);
      for (int i = 0; i <= onewireNb; i++){
        onewireMesureTemp(onewireSensorSerial);
      }
      delay(1000);
     
     
     
     
     
    }
     
    void loop() {
     
      boolean temperatureRead = 0;
      if ( (temperatureTime == 0) || ( (millis() - temperatureTime > temperatureReadInterval) && (millis() >= temperatureTime) ) ) {
        temperatureTime = millis();
        /// Lecture des températures
        tempballon = onewireMesureTemp(onewireSensorSerial[0]);
        tempcapteur = onewireMesureTemp(onewireSensorSerial[1]);
        temppiscine = onewireMesureTemp(onewireSensorSerial[2]);
        temperatureRead = true;
     
      }
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 0);
     
      // Afficgahe de la température
      lcd.print( temppiscine );
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
      // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 1);
     
      // Afficgahe de la température
      lcd.print( tempballon );
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
     
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(11, 1);
     
     
      // Afficgahe d ela température
      lcd.print(tempcapteur);
     
      // delai de 500ms entre deux calculs
      delay(500);
     
     
     
     if (tempballon<=25)
     {
     
      ecs();
     }
     else
     {
     
      piscine();
     } 
     
     
     
    }
      void ecs() 
      {
     
      if (tempballon<=25 && tempcapteur>=tempballon)
        {
          digitalWrite(RELAISpompe,HIGH );
        }
     
     if (tempballon>=25|| tempcapteur<=tempballon)
     {
     digitalWrite(RELAISpompe, LOW);
     }
      }                      
     
     
     
     void piscine ()
     {
     
                  if (tempcapteur>=temppiscine && temppiscine <=30 && tempballon >=25 )
                  {
                    digitalWrite(RELAISpompe, HIGH);
                    digitalWrite(RELAISvanne, HIGH);
                  }              
                  if (tempcapteur<=temppiscine || temppiscine >= 30)
                  {
     // commande relais R1 du circulateur panneau P1:
     digitalWrite(RELAISpompe, LOW);
     digitalWrite(RELAISvanne, LOW);
                  }
     
    }
     
     
     
     
     
     
     
     
     
    float onewireMesureTemp(byte addr[8]) {
      byte data[12];        // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
      int tempet = 0;       // variable pour resultat brute de la mesure
      float tempetf = 0.0;  // variable pour resultat à virgule de la mesure
     
      oneWire.reset();
      oneWire.select(addr);
      oneWire.write(onewireModeMesure, 1);    //
     
      oneWire.reset();
      oneWire.select(addr);    
      oneWire.write(onewireModeLecture);      // Récupération des valeurs de la RAM du capteur
     
      // Lire les 9 octets de la RAM (appelé Scratchpad)
      for ( int i = 0; i < 9; i++) {          // 9 octets de RAM stockés dans 9 octets
        data = oneWire.read();             // lecture de l'octet de rang i stocké dans tableau data
       }
      tempetf = ((data[1] << 8) | data[0]) * 0.0625;
      return (tempetf);
    }

    merci a vous

  2. #2
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Bonjour

    mais cela ne fonctionne pas correctement.
    : C'est à dire ? Quel est le résultat obtenu ? Des messages d'erreur ?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut C est a dir:
    Bonjour,
    En fait, le prog fonctionne
    Quand la t ballon est inferieure a 25 et la t capteur est superieure ,la pompe demarre
    Ensuite le ballon arrive a temp et la vanne 3 voies demarre pour basculer sur la piscine.
    Le probleme est a ce stade: ci la temp ballon redescend ca ne rebascule pas sur le ballon
    Merci de votre intervention

  4. #4
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Quelques remarques rapides sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (tempballon<=25)
     {
      ecs();
     }
     else
     {
      piscine();
     }
    ecs() est appelé si et uniquement si tempballon <= 25. Dans cette même fonction tu refais le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (tempballon<=25 && tempcapteur>=tempballon)
        {
          digitalWrite(RELAISpompe,HIGH );
        }
     
     if (tempballon>=25|| tempcapteur<=tempballon)
     {
     digitalWrite(RELAISpompe, LOW);
     }
    Tu pourrais alléger tes tests pour moins de confusion. Quid tempballon = tempcapteur = 25°C ? les deux conditions ne sont elles pas remplies ?

    Idem dans la fonction piscine() :
    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
    void piscine ()
     {
     
                  if (tempcapteur>=temppiscine && temppiscine <=30 && tempballon >=25 )
                  {
                    digitalWrite(RELAISpompe, HIGH);
                    digitalWrite(RELAISvanne, HIGH);
                  }              
                  if (tempcapteur<=temppiscine || temppiscine >= 30)
                  {
     // commande relais R1 du circulateur panneau P1:
     digitalWrite(RELAISpompe, LOW);
     digitalWrite(RELAISvanne, LOW);
                  }
     
    }
    Tu testes de nouveau tempballon qui est forcément >=25°C sinon la fonction piscine n'aurait pas été appelée. Idem, que se passe-t-il quand tempcapteur = temppiscine = 30°C ?

    Tes conditions doivent s'exclure. Tu pourrais même supprimer le deuxième if par un simple else. Car si la condition suivante n'est pas remplie tempcapteur>=temppiscine && temppiscine <=30, c'est bien que tempcapteur < temppiscine ou bien que temppiscine > 30°C.

    Voilà pour une première analyse. Une question, comment fonctionne ta vanne 3 voies ? Avec une combinaison de relais ? ou bien à chaque impulsion elle switch de voie ?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Bonjour
    Merci pour votre aide
    Je vien de refaire mon code d apres vos observation:

    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
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206	/*
      teste 1 prog chauffe eau solaire
     */
     
    // Inclure la librairie LiquidCrystal
    #include <LiquidCrystal.h>
     
    // Initialisation de la librairie Liquid Crystal
    LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
     
    #include <OneWire.h>               // Pour les capteurs de température
     
     
    /*
    **  Déclaration des constantes et des paramètres
    */
     
     
    #define onewireModeLecture 0xBE    // Code pour initier la lecture des capteurs OneWire
    #define onewireModeMesure 0x44     // Code pour déclencher la lecture des capteurs OneWire
    #define onewireNb 3                // Nombre de capteurs OneWire gérés
     
    const int pinOneWire = 9;          // Broche utilisée pour lire les températures disponibles via des composant One-Wire DS18B20
     
     
     
    //relais
    const int RELAISpompe = A3;
    const int RELAISvanne = A4;
     
    // Adresses matérielles des capteurs One-Wire  <== Là, il faut mettre les adresses des capteurs réellement utilisés
    static byte onewireSensorSerial[onewireNb][8] = {
      { 0x28, 0xFF, 0x58, 0xB1, 0x87, 0x16, 0x03, 0x41 },    // Température à l'intérieur des panneaux solaires
      { 0x28, 0xFF, 0x78, 0x46, 0x91, 0x16, 0x04, 0x56 },    // Bas du ballon d'eau chaude
      { 0x28, 0xFF, 0x66, 0xC7, 0x90, 0x16, 0x04, 0x75 },    // REMPERATURE PISCINE
     
    };
     
     
    float tempballon = -99.9;
    float tempcapteur = -99.0;
    float tempretour = -99.0;
    float temppiscine = -99.0;
     
    const float temperatureMini = -40.0 ;                        // Température en dessous de la quelle elle n'est pas prise en compte
    const unsigned long temperatureReadInterval = 10L * 1000L;  // Temps entre 2 lectures de température
     
    unsigned long pumpStartTime = 0;       // Temps écoulé, en millisecondes, depuis le démarrage de la pompe de circulation
    unsigned long temperatureTime = 0;     // Temps écoulé, en millisecondes, depuis la dernière lecture des températures
     
     
    /*
    **  Création des objets
    */
    OneWire oneWire(pinOneWire);           // On défini la broche utilisée pour OneWire
     
     
    void setup() {
      // Configuration de l'afficheur 16 caractères en 2 lignes 
      lcd.begin(16, 2);
      // Ecriture de la ligne 1
       lcd.setCursor(0, 0);
       lcd.print("TP:");
      lcd.setCursor(0, 1);
        lcd.print("TB:");
        lcd.setCursor(8, 1);
        lcd.print("TC:");
     
     // relais
     pinMode(RELAISpompe, OUTPUT);
     pinMode(RELAISvanne, OUTPUT);
     
      // Effectue une première mesure pour alimenter les capteurs de température
      for (int i = 0; i <= onewireNb; i++) {
        onewireMesureTemp(onewireSensorSerial);
      }
      delay(2000);
      for (int i = 0; i <= onewireNb; i++){
        onewireMesureTemp(onewireSensorSerial);
      }
      delay(1000);
     
     
     
     
     
    }
     
    void loop() {
     
      boolean temperatureRead = 0;
      if ( (temperatureTime == 0) || ( (millis() - temperatureTime > temperatureReadInterval) && (millis() >= temperatureTime) ) ) {
        temperatureTime = millis();
        /// Lecture des températures
        tempballon = onewireMesureTemp(onewireSensorSerial[0]);
        tempcapteur = onewireMesureTemp(onewireSensorSerial[1]);
        temppiscine = onewireMesureTemp(onewireSensorSerial[2]);
        temperatureRead = true;
     
      }
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 0);
     
      // Afficgahe de la température
      lcd.print( temppiscine );
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
      // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 1);
     
      // Afficgahe de la température
      lcd.print( tempballon );
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
     
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(11, 1);
     
     
      // Afficgahe d ela température
      lcd.print(tempcapteur);
     
      // delai de 500ms entre deux calculs
      delay(500);
     
     
     
     if (tempballon<25)
     {
     
      ecs();
     }
     else
     {
     
      piscine();
     } 
     
     
     
    }
      void ecs() 
      {
     
      if (tempcapteur>tempballon)
        {
          digitalWrite(RELAISpompe,HIGH );
        }
     
     else  {
     digitalWrite(RELAISpompe, LOW);
     }
      }                      
     
     
     
     void piscine ()
     {
     
                  if (tempcapteur>temppiscine && temppiscine <30 )
                  {
                    digitalWrite(RELAISpompe, HIGH);
                    digitalWrite(RELAISvanne, HIGH);
                  }              
                  else
                  {
     // commande relais R1 du circulateur panneau P1:
     digitalWrite(RELAISpompe, LOW);
     digitalWrite(RELAISvanne, LOW);
                  }
     
    }
     
     
     
     
     
     
     
     
     
    float onewireMesureTemp(byte addr[8]) {
      byte data[12];        // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
      int tempet = 0;       // variable pour resultat brute de la mesure
      float tempetf = 0.0;  // variable pour resultat à virgule de la mesure
     
      oneWire.reset();
      oneWire.select(addr);
      oneWire.write(onewireModeMesure, 1);    //
     
      oneWire.reset();
      oneWire.select(addr);    
      oneWire.write(onewireModeLecture);      // Récupération des valeurs de la RAM du capteur
     
      // Lire les 9 octets de la RAM (appelé Scratchpad)
      for ( int i = 0; i < 9; i++) {          // 9 octets de RAM stockés dans 9 octets
        data = oneWire.read();             // lecture de l'octet de rang i stocké dans tableau data
       }
      tempetf = ((data[1] << 8) | data[0]) * 0.0625;
      return (tempetf);
    }

    Pour la vanne je dois juste l alimenter pour changer de voi le rappel et automatique par ressort.

    Merci

  6. #6
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Question toute bête : Tu as testé le bon fonctionnement de ta vanne 3 voies avec un simple programme ? Ne manquerais tu pas de puissance pour piloter le relais avec ta carte Arduino ?

    D'après ce que tu as expliqué et ce que j'en ai compris, la vanne redescend si tempballon < 25°C et tempcapteur < tempballon ou si tempballon > 25°C et tempcapteur < temppiscine ?
    Es-tu sur de rencontrer ces conditions ? Essayes de voir en forçant des valeurs.
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Salut
    Alors mon probleme n est pas physique, je passe par un relais car ma vane est pilotee par un serveau moteur en 230v type clarinette plancher chauffant

    Alors:

    Si tempballon <a 25 et tempcapteur > tempballon je demarre la pompe
    Si tempballon> a25 arret
    passage sur la piscine si
    Temppiscine< a30 et tempcapteur> a temppiscine je demarre la pompe et la vanne
    Mon probleme est a ce stade: si tempballon repasse en dessous de 25 je reste sur la piscine a la place de basculer sur le ballon.

    Merci

  8. #8
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    si tempballon repasse en dessous de 25 je reste sur la piscine a la place de basculer sur le ballon
    Oui parce que dans ton code, une fois que tempballon < 25°C, tu passes dans la condition où seule la pompe est pilotée via l'appel de la foncion ecs().

    Je te propose :
    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
    if (tempballon<=25)
    {
    	fermerVanne(); // on repasse sur le ballon
    	if (tempcapteur>tempballon) // on chauffe l'eau pour la douche !
    	{
    	  demarrerPompe();
    	}
    	else
    	{
    	  arreterPompe();
    	}
    }
    else // tempBallon > 25 °C
    {
    	ouvrirVanne(); // on passe sur la piscine
    	if (tempcapteur>temppiscine && temppiscine <30 ) //  on chauffe la piscine !
    	{
    		demarrerPompe();
    	}              
    	else // on repasse sur le chauffe eau
    	{
    		arreterPompe();
    	}
    }
     
     
    void demarrerPompe() 
    {
      digitalWrite(RELAISpompe, HIGH);
    }
     
    void arreterPompe()
    {
      digitalWrite(RELAISpompe, LOW);
    }
     
    void ouvrirVanne()
    {
      digitalWrite(RELAISpompe, HIGH);
    }
     
    void fermerVanne()
    {
      digitalWrite(RELAISvanne, LOW);
    }
    Si j'ai bien compris, la vanne sert à sélectionner la voie que l'on chauffe (piscine ou ballon ?) et la pompe à chauffer ou non ?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Bonjour
    Grand merci
    j ai compris le probleme de mon code
    Je vais tester le nouveau code et vous tiendrez au courant.

    Merci

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    electricien
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : electricien

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut help
    Bonjour, je n'arrive pas a compiler le code
    je vous le mets
    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
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    // Inclure la librairie LiquidCrystal
    #include <LiquidCrystal.h>
     
    // Initialisation de la librairie Liquid Crystal
    LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
     
    #include <OneWire.h>               // Pour les capteurs de température
     
     
    /*
    **  Déclaration des constantes et des paramètres
    */
     
    #define onewireModeLecture 0xBE    // Code pour initier la lecture des capteurs OneWire
    #define onewireModeMesure 0x44     // Code pour déclencher la lecture des capteurs OneWire
    #define onewireNb 4                // Nombre de capteurs OneWire gérés
     
    const int pinOneWire = 9;          // Broche utilisée pour lire les températures disponibles via des composant One-Wire DS18B20
     
     
     
    //relais
    const int RELAISpompe = A3;
    const int RELAISvanne = A4;
     
    // Adresses matérielles des capteurs One-Wire  <== Là, il faut mettre les adresses des capteurs réellement utilisés
    static byte onewireSensorSerial[onewireNb][8] = {
      { 0x28, 0xFF, 0x58, 0xB1, 0x87, 0x16, 0x03, 0x41 },    // Température à l'intérieur des panneaux solaires
      { 0x28, 0xFF, 0x78, 0x46, 0x91, 0x16, 0x04, 0x56 },    // Bas du ballon d'eau chaude
      { 0x28, 0xFF, 0x66, 0xC7, 0x90, 0x16, 0x04, 0x75 },    // TEMPERATURE PISCINE
      { 0x28, 0xFF, 0xCA, 0xAF, 0x87, 0x16, 0x03, 0x58 },    // TEMPERATURE RETOURE
    };
     
     
     
    float tempballon ;
    float tempcapteur = 99.0;
    float tempretour = 99.0;
    float temppiscine = 99.0;
    OneWire oneWire(pinOneWire);           // On défini la broche utilisée pour OneWire
     
     
    const float temperatureMini = -40.0 ;                        // Température en dessous de la quelle elle n'est pas prise en compte
    const unsigned long temperatureReadInterval = 10L * 1000L;  // Temps entre 2 lectures de température
     
    unsigned long pumpStartTime = 0;       // Temps écoulé, en millisecondes, depuis le démarrage de la pompe de circulation
    unsigned long temperatureTime = 0;     // Temps écoulé, en millisecondes, depuis la dernière lecture des températures
     
     
     
    void setup() {
      // Configuration de l'afficheur 16 caractères en 2 lignes 
      lcd.begin(16, 2);
      // Ecriture de la ligne 1
       lcd.setCursor(0, 0);
          lcd.print("TP:");
       lcd.setCursor (8,0);
        lcd.print ("TR:");   
      lcd.setCursor(0, 1);
        lcd.print("TB:");
        lcd.setCursor(8, 1);
        lcd.print("TC:");
     
     // relais
     pinMode(RELAISpompe, OUTPUT);
     pinMode(RELAISvanne, OUTPUT);
     
     
      // Effectue une première mesure pour alimenter les capteurs de température
      for (int i = 0; i <= onewireNb; i++) {
        onewireMesureTemp(onewireSensorSerial[i]);
      }
      delay(2000);
      for (int i = 0; i <= onewireNb; i++){
        onewireMesureTemp(onewireSensorSerial[i]);
      }
      delay(1000);
     
    }
     
    void loop() {
     
      boolean temperatureRead = 0;
      if ( (temperatureTime == 0) || ( (millis() - temperatureTime > temperatureReadInterval) && (millis() >= temperatureTime) ) ) {
        temperatureTime = millis();
        /// Lecture des températures
        tempballon = onewireMesureTemp(onewireSensorSerial[0]);
        temppiscine = onewireMesureTemp(onewireSensorSerial[2]);
        tempcapteur = onewireMesureTemp(onewireSensorSerial[1]);
        tempretour = onewireMesureTemp(onewireSensorSerial[3]);
        temperatureRead = true;
     
      }
     
      lcd.setCursor(3, 0);
      lcd.print( temppiscine );
      lcd.setCursor (11,0);
      lcd.print (tempretour);
      delay(500);   
      lcd.setCursor(3, 1);
      lcd.print( tempballon );
      delay(500);   
      lcd.setCursor(11, 1);
      lcd.print(tempcapteur);
      delay(500);
     
    if (tempballon<=25)
    {
      FermerVanne(); // on repasse sur le ballon
      if (tempcapteur>tempballon) // on chauffe l'eau pour la douche !
      {
        demarrerPompe();
      }
      else
      {
        arreterPompe();
      }
    }
    else // tempBallon > 25 °C
    {
      ouvrirVanne(); // on passe sur la piscine
      if (tempcapteur>temppiscine && temppiscine <30 ) //  on chauffe la piscine !
      {
        demarrerPompe();
      }              
      else // on repasse sur le chauffe eau
      {
        arreterPompe();
      }
    }
     
     
    void demarrerPompe() 
    {
      digitalWrite(RELAISpompe, HIGH);
    }
     
    void arreterPompe()
    {
      digitalWrite(RELAISpompe, LOW);
    }
     
    void ouvrirVanne()
    {
      digitalWrite(RELAISvanne, HIGH);
    }
     
    void FermerVanne()
    {
      digitalWrite(RELAISvanne,LOW);
    }
    }
    float onewireMesureTemp(byte addr[8]) {
      byte data[12];        // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
      int tempet = 0;       // variable pour resultat brute de la mesure
      float tempetf = 0.0;  // variable pour resultat à virgule de la mesure
     
      oneWire.reset();
      oneWire.select(addr);
      oneWire.write(onewireModeMesure, 1);    //
     
      oneWire.reset();
      oneWire.select(addr);    
      oneWire.write(onewireModeLecture);      // Récupération des valeurs de la RAM du capteur
     
      // Lire les 9 octets de la RAM (appelé Scratchpad)
      for ( int i = 0; i < 9; i++) {          // 9 octets de RAM stockés dans 9 octets
        data[i] = oneWire.read();             // lecture de l'octet de rang i stocké dans tableau data
       }
      tempetf = ((data[1] << 8) | data[0]) * 0.0625;
      return (tempetf);
    }
     
     
     
     
     sa mais le message suivant:
    'FermerVanne' was not declared in this scope
    je vois pas d ou vient le problème.
     
    Pour palier a cela j ai modifier mon code de départ en m'inspirant de votre code mais cella ne fonctionne toujours pas je le mais Egalement
     
     
    code:
    /*
      teste 1 prog chauffe eau solaire
     */
     
    // Inclure la librairie LiquidCrystal
    #include <LiquidCrystal.h>
     
    // Initialisation de la librairie Liquid Crystal
    LiquidCrystal lcd(11, 10, 5, 4, 3, 2);
     
    #include <OneWire.h>               // Pour les capteurs de température
     
     
    /*
    **  Déclaration des constantes et des paramètres
    */
     
    #define onewireModeLecture 0xBE    // Code pour initier la lecture des capteurs OneWire
    #define onewireModeMesure 0x44     // Code pour déclencher la lecture des capteurs OneWire
    #define onewireNb 4                // Nombre de capteurs OneWire gérés
     
    const int pinOneWire = 9;          // Broche utilisée pour lire les températures disponibles via des composant One-Wire DS18B20
     
     
     
    //relais
    const int RELAISpompe = A3;
    const int RELAISvanne = A4;
     
    // Adresses matérielles des capteurs One-Wire  <== Là, il faut mettre les adresses des capteurs réellement utilisés
    static byte onewireSensorSerial[onewireNb][8] = {
      { 0x28, 0xFF, 0x58, 0xB1, 0x87, 0x16, 0x03, 0x41 },    // Température à l'intérieur des panneaux solaires
      { 0x28, 0xFF, 0x78, 0x46, 0x91, 0x16, 0x04, 0x56 },    // Bas du ballon d'eau chaude
      { 0x28, 0xFF, 0x66, 0xC7, 0x90, 0x16, 0x04, 0x75 },    // TEMPERATURE PISCINE
      { 0x28, 0xFF, 0xCA, 0xAF, 0x87, 0x16, 0x03, 0x58 },    // TEMPERATURE RETOURE
    };
     
     
     
    float tempballon = -99 ;
    float tempcapteur = -99;
    float tempretour = -99;
    float temppiscine = -99;
     
    const float temperatureMini = -40.0 ;                        // Température en dessous de la quelle elle n'est pas prise en compte
    const unsigned long temperatureReadInterval = 10L * 1000L;  // Temps entre 2 lectures de température
     
    unsigned long pumpStartTime = 0;       // Temps écoulé, en millisecondes, depuis le démarrage de la pompe de circulation
    unsigned long temperatureTime = 0;     // Temps écoulé, en millisecondes, depuis la dernière lecture des températures
     
     
    /*
    **  Création des objets
    */
    OneWire oneWire(pinOneWire);           // On défini la broche utilisée pour OneWire
     
     
    void setup() {
      // Configuration de l'afficheur 16 caractères en 2 lignes 
      lcd.begin(16, 2);
      // Ecriture de la ligne 1
       lcd.setCursor(0, 0);
          lcd.print("TP:");
       lcd.setCursor (8,0);
        lcd.print ("TR:");   
      lcd.setCursor(0, 1);
        lcd.print("TB:");
        lcd.setCursor(8, 1);
        lcd.print("TC:");
     
     // relais
     pinMode(RELAISpompe, OUTPUT);
     pinMode(RELAISvanne, OUTPUT);
     
     
      // Effectue une première mesure pour alimenter les capteurs de température
      for (int i = 0; i <= onewireNb; i++) {
        onewireMesureTemp(onewireSensorSerial[i]);
      }
      delay(2000);
      for (int i = 0; i <= onewireNb; i++){
        onewireMesureTemp(onewireSensorSerial[i]);
      }
      delay(1000);
     
     
     
     
     
    }
     
    void loop() {
     
      boolean temperatureRead = 0;
      if ( (temperatureTime == 0) || ( (millis() - temperatureTime > temperatureReadInterval) && (millis() >= temperatureTime) ) ) {
        temperatureTime = millis();
        /// Lecture des températures
        tempballon = onewireMesureTemp(onewireSensorSerial[0]);
        temppiscine = onewireMesureTemp(onewireSensorSerial[2]);
        tempcapteur = onewireMesureTemp(onewireSensorSerial[1]);
        tempretour = onewireMesureTemp(onewireSensorSerial[3]);
        temperatureRead = true;
     
      }
     
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 0);
     
      // Afficgahe de la température
      lcd.print( temppiscine );
     
      lcd.setCursor (11,0);
      lcd.print (tempretour);
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
      // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(3, 1);
     
      // Afficgahe de la température
      lcd.print( tempballon );
     
     
      // delai de 500ms entre deux calculs
      delay(500);   
     
       // positionnement du curseur en ligne 2 1ere position ( on partd e zéro)
      lcd.setCursor(11, 1);
     
     
      // Afficgahe d ela température
      lcd.print(tempcapteur);
     
      // delai de 500ms entre deux calculs
      delay(500);
     
     
     
     if (tempballon<=40)
    {
      digitalWrite(RELAISvanne,   LOW);
     
      if (tempcapteur>tempballon) // on chauffe l'eau pour la douche !
      {
       digitalWrite(RELAISpompe, HIGH);
      }
      else
      {
        digitalWrite(RELAISpompe, LOW);
      }
    }
    else // tempBallon > 25 °C
    {
      digitalWrite(RELAISvanne,HIGH); // on passe sur la piscine
      if (tempcapteur>temppiscine && temppiscine <30 ) //  on chauffe la piscine !
      {
        digitalWrite(RELAISpompe, HIGH);
      }              
      else // on repasse sur le chauffe eau
      {
        digitalWrite(RELAISpompe, LOW);
      }
    }
     
     
     
     
     
     
    }
     
     
     
     
     
    float onewireMesureTemp(byte addr[8]) {
      byte data[12];        // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
      int tempet = 0;       // variable pour resultat brute de la mesure
      float tempetf = 0.0;  // variable pour resultat à virgule de la mesure
     
      oneWire.reset();
      oneWire.select(addr);
      oneWire.write(onewireModeMesure, 1);    //
     
      oneWire.reset();
      oneWire.select(addr);    
      oneWire.write(onewireModeLecture);      // Récupération des valeurs de la RAM du capteur
     
      // Lire les 9 octets de la RAM (appelé Scratchpad)
      for ( int i = 0; i < 9; i++) {          // 9 octets de RAM stockés dans 9 octets
        data[i] = oneWire.read();             // lecture de l'octet de rang i stocké dans tableau data
       }
      tempetf = ((data[1] << 8) | data[0]) * 0.0625;
      return (tempetf);
    }

    je ne comprends pas pourquoi le programme ne veut pas passer sur la piscine, de temps en temps j ai l'impression que les lectures de température délirent.
    mais si je ne me trompe pas, une fois la tempballon atteinte je dois activer la vanne ?? et bah non ce n'est pas le cas.

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  2. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33
  3. Réponses: 6
    Dernier message: 21/06/2002, 14h48
  4. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51

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