// --- 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();
}