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