installation chauffe eau solaire

2eme et dernière partie du programme

/*
******************************************************************************************************************************************************
**
**  loop  ==>  Fonction obligatoire. Boucle infinie de fonctionnement
**
******************************************************************************************************************************************************
*/
void loop() {
  
  // Reset du watchDog : C'est reparti pour 8 secondes
  wdt_reset();
  
  /*************************************************************
  **
  ** Lecture de tous les capteurs
  */
  boolean temperatureRead = 0;
  if ( (temperatureTime == 0) || ( (millis() - temperatureTime > temperatureReadInterval) && (millis() >= temperatureTime) ) ) {
    temperatureTime = millis();
    /// Lecture des températures
    tempPanel = onewireMesureTemp(onewireSensorSerial[0]);
    tempBottom = onewireMesureTemp(onewireSensorSerial[1]);
    temperatureRead = true;
    
  }

    /*************************************************************
  **
  ** Actions à  mener en fonction des mesures effectuées et de l'état en cours
  */
  switch(etat) {
    
    case etatManuOff:        // ==> L'installation a été mise à  l'arrêt manuellement
      // Ne rien faire et laisser ainsi
      break;  
    
    case etatManuPump:       // ==> La pompe est en marche forcée (mise en marche manuelle)
      // Ne rien faire et laisser ainsi
      break;  
    
    case etatArret:          // ==> la pompe est à  l'arrêt
      // Vérifier si les condition de mise en route sont remplies
      if (tempPanel >= tempBottom + paramDeltaTempStart) {
        startPump(); 
      }
      break;
    
    case etatSoleil:         // ==> La pome de circulation est en route de façon NON prolongée
      // Vérifier si la pompe doit être arrêtée
      if (tempPanel <= tempBottom + paramDeltaTempStop) {
        stopPump(); 
        etat = etatArret;
      }
      // Vérifier si le régime de croisière est atteint
      if ( (millis() - pumpStartTime > paramLongSun) && (millis() >= pumpStartTime) ) {
        pumpStartTime = 0;
        etat = etatLongSoleil;     
      }
      break;
    
    case etatLongSoleil:     // ==> La pome de circulation est en route de façon prolongée et est donc en régime de croisière
      // Vérifier si l'écart de température entre les panneaux et le bas du ballon d'eau chaude est suffisante
      if (tempPanel <= tempBottom + paramDeltaTempStop) {
        stopPump(); 
        etat = etatArret;
      }
      break;
    
    case etatInconnu:        // ==> Survient normalement au démarrage
      stopPump(); 
      etat = etatArret;
      break;
  }
  
  // Enregistrer l'état pour la boucle suivante
  lastEtat = etat;
  
  // Attendre un peu avant de boucler (une demi seconde)
  delay(500);

// Si état pompe est off cad 4,
    if ( etat = 4 ) {
         
        // Alors on active la temporisation
        tempoActive = 1;
        tempoDepart = millis();
         
    }
     
    // Si la temporisation est active,
    if ( tempoActive ) {
         
        // Et si il s'est écoulé 1h=3600s,
        if ( ( millis() - tempoDepart ) >= 3600000 ) {
             
            // Alors on ecrit sur la carte sd
                myFile = SD.open("test.txt", FILE_WRITE);
                if (myFile) {    
                myFile.print(rtc.getDateStr());
                myFile.print(";");  
                myFile.print(rtc.getTimeStr());
                myFile.print(";"); 
                myFile.print("Ts:");     
                myFile.print(tempPanel);
                myFile.print(";");
                myFile.print("Tp:");
                myFile.print(tempBottom);
                myFile.print(";");
                myFile.print("Pompe:");
                myFile.print(etat);
                myFile.close(); // close the file
              }
              // if the file didn't open, print an error:
              else {
                Serial.println("error opening test.txt");
  
  delay(3000);
  }

            
             
            // Et on désactive la temporisation pour ne pas afficher ce message une seconde fois
            tempoActive = 0;
             
        }
         
    }
// Si état pompe est on cad 6,
    if ( etat = 6 ) {
         
        // Alors on active la temporisation
        tempoActive = 1;
        tempoDepart = millis();
         
    }
     
    // Si la temporisation est active,
    if ( tempoActive ) {
         
        // Et si il s'est écoulé 2min,
        if ( ( millis() - tempoDepart ) >= 120000 ) {
             
            // Alors on ecrit sur la carte sd
                myFile = SD.open("test.txt", FILE_WRITE);
                if (myFile) {    
                myFile.print(rtc.getDateStr());
                myFile.print(";");  
                myFile.print(rtc.getTimeStr());
                myFile.print(";"); 
                myFile.print("Ts:");     
                myFile.print(tempPanel);
                myFile.print(";");
                myFile.print("Tp:");
                myFile.print(tempBottom);
                myFile.print(";");
                myFile.print("Pompe:");
                myFile.print(etat);
                myFile.close(); // close the file
      }
      // if the file didn't open, print an error:
          else {
        Serial.println("error opening test.txt");
  
      delay(3000);
      }

            
             
            // Et on désactive la temporisation pour ne pas afficher ce message une seconde fois
            tempoActive = 0;
             
        }
         
    }
}      
  


  
/*
******************************************************************************************************************************************************
**
**      Fonctions diverses
**
******************************************************************************************************************************************************
*/
  
/* 
** Fonction pour arrêter la pompe de circulation. L'installation devient alors à  l'arrêt
*/
void stopPump() {
  analogWrite(pinRelayPump, relayOff);
  pumpStartTime = 0;
  etat = etatArret;
}
  
/* 
** Fonction pour démarrer la pompe de circulation. L'installation devient alors en fonctionnement
*/
boolean startPump() {
  analogWrite(pinRelayPump, relayOn);
  pumpStartTime = millis();
  etat = etatSoleil; 
  return(true);  
}
  
/*
** Fonction pour lire une température sur le capteur dont l'adresse est en paramètre
*/
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);


   
}