installation chauffe eau solaire

// --- Programme Arduino ---
// Copyright finizi - Créé le 14/07/2012
// www.DomoEnergyTICs.com 
//  Code sous licence GNU GPL : 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
/*
******************************************************************************************************************************************************
**  
**      Utilisation des broches
**      
**      Analogiques
**        3 :  => Solar Relai pompe de circulation
**
**       Digitales
**        3 :  => bus OneWire
**
******************************************************************************************************************************************************
*/
  
  
/*
******************************************************************************************************************************************************
**
**  Début du code
**   . Includes
**   . Defines
**   . Variables globales
**   . Objets
**
******************************************************************************************************************************************************
*/
  
#include <avr/wdt.h>               // Pour le WatchDog
#include <OneWire.h>               // Pour les capteurs de température
#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
 
File myFile;
DS3231  rtc(SDA,SCL);

int pinCS = 10; // Pin 10 on Arduino Uno
  
/*
**  Déclaration des constantes et des paramètres
*/
  
#define paramLongSun 600000        // en millisecondes : Durée de fonctionnement à partir de laquelle on considère que le fonctionnement est établi depuis longtemps (600000 = 10 minutes)
#define paramDeltaTempStart 8.0    // en degrés : Ecart de température nécessaire pour la mise en route de la pompe
#define paramDeltaTempStop 4.0     // en degrés : Ecart de température minimum pour le fonctionnement de la pompe
  
#define etatInconnu 0              // L'état est inconnu. C'est la valeur par défaut. C'est donc l'état au démarrage
#define etatArret 4                // Le circuit est plein, prêt à fonctionner. La pompe est à l'arrêt 
#define etatSoleil 5               // La pompe fonctionne et le soleil chauffe les panneaux 
#define etatLongSoleil 6           // La pompe fonctionne et le soleil chauffe les panneaux depuis plus de paramLongSoleil  
#define etatManuOff 8              // Toute l'installation est mise à l'arrêt
#define etatManuPump 9             // La pompe de circulation est en marche forcée
  
#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 2                // Nombre de capteurs OneWire gérés
  
const int pinOneWire = 3;          // Broche utilisée pour lire les températures disponibles via des composant One-Wire DS18B20
const int pinRelayPump = A3;       // Commande du relai de pompe de circulation
  
#define relayOn 0
#define relayOff 255
  
/* 
** Déclaration des variables et initialisations
*/
int etat = etatInconnu;
int lastEtat = etatInconnu;
float tempPanel = -99.9;
float tempBottom = -99.0;
  
// 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, 0x39, 0x69, 0xFF, 0x09, 0x00, 0x00, 0xE2 },    // Température à l'intérieur des panneaux solaires
  { 0x28, 0xED, 0xD8, 0xFF, 0x09, 0x00, 0x00, 0x78 },    // Température Piscine
};
  
  
// Chaines d'état à afficher (certaines seront utilisées plus tard)
const String etatsText[10] = { 
  "Inconnu",         // #define etatInconnu 0
  "Vide",            // #define etatVide 1
  "Remplissage",     // #define etatRemplissage 2
  "Vidange",         // #define etatVidange 3
  "Arret",           // #define etatArret 4
  "Soleil",          // #define etatSoleil 5
  "SoleilLong",      // #define etatLongSoleil 6
  "ClosingValve",    // #define etatClosingValve 7
  "ManuOff",         // #define etatManuOff 8
  "ManuPompe"        // #define etatManuPump 9
};
  
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
  
// État d'activation de la tempo
int tempoActive = 0;
 
// Temps à l'activation de la tempo
unsigned long tempoDepart = 0;

  
/*
******************************************************************************************************************************************************
**
**  setup  ==>  Fonction obligatoire d'initialisation
**
******************************************************************************************************************************************************
*/
void setup() {

  Serial.begin(115200);

  // Initialisation du WatchDog. Se déclenche au bout de 8 secondes d'inactivité
  wdt_enable(WDTO_8S);
  
  // Initialiser les broches pour que le relai soit inactif au démarrage
  analogWrite(pinRelayPump, relayOff);
  
  // Initialiser les autres broches comme broche de commande
  pinMode(pinRelayPump, OUTPUT); 
  
  // Ouvrir tous les relais (ne plus rien alimenter)
  stopPump();
  
  // 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);
  
  etat = etatInconnu;
  lastEtat = etatInconnu;

    pinMode(pinCS, OUTPUT);
  
  // SD Card Initialization
  if (SD.begin())
  {
    Serial.println("SD card is ready to use.");
  } else
  {
    Serial.println("SD card initialization failed");
    return;
  }
  rtc.begin();    

}