Pages: [1]   Go Down
Author Topic: Gestion d'une VMC double flux branchée sur un puits canadien  (Read 854 times)
0 Members and 1 Guest are viewing this topic.
Yvelines Sud
Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Cette fois-ci c'est du sérieux !
Mon deuxième programme Arduino doit faire ce qui est décrit dans le titre.

Skywodd, tu remarqueras que j'ai suivi à la lettre tes recommandations pour présenter et documenter les programmes !

Le schéma de principe de la VMC est en fichier joint.

Je pense que ce programme peut intéresser d'autres personnes, mais il faudra attendre qu'il soit débuggé !
En effet, comme je ne veux pas alimenter ma motorisation de vanne en permanence, j'ai mis une tempo en passant par la commande millis() mais depuis que j'ai introduit cette commande je ne peux compiler complètement !
Alors si quelqu'un peut me  tirer de ce mauvais pas....
D'avance merci.

Code:
/* Gestion d'une VMC double flux sur Puits Canadien
Ce programme gère la vanne de by pass d'un puits canadien. Cette vanne se ferme lorsqu'il fait des températures extérieures trop hautes ou trop basses
de façon à forcer l'air aspiré par la VMC  DF à passer par le puits canadien.
Le schéma de principe de la VMC est mis ici : http://cjoint.com/?CCqszyDbNV8
Le programme ci-dessous ci-dessous constitue le début du projet.
A terme, il est prévu un affichage local par LCD des températures relevées, une mesure de débit sur chaque flux de façon à sortir des bilans thermiques
et un affichage distant des historiques et relevés instantanés
*/
/******************** includes*************************************************************/
#include <OneWire.h>
#include <DallasTemperature.h>

/****************Déclarations du bus 1-wire*************************************************/
#define ONE_WIRE_BUS 2 // sondes DS18B20 sur pin 2 sur la Mega 2560 Arduino
OneWire oneWire(ONE_WIRE_BUS);// Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.

/******************Déclarations des sondes DS18B20 ***************************************/
DeviceAddress T1 = { 0x28, 0xEB, 0x59, 0xE1, 0x03, 0x00, 0x00, 0x8B };//t° extérieure
DeviceAddress T2 = { 0x28, 0xA4, 0x3A, 0xE1, 0x03, 0x00, 0x00, 0x85 };//t° dans le puits canadien
//sondes pas encore installées :
//DeviceAddress T3 = { 0x28, 0xxx, 0xxx, 0xE1, 0x03, 0x00, 0x00, 0xxx };//t° sortie air vicié
//DeviceAddress T4 = { 0x28, 0xxx, 0xxx, 0xE1, 0x03, 0x00, 0x00, 0xxx };//t° entrée air neuf
//DeviceAddress T5 = { 0x28, 0xxx, 0xxx, 0xE1, 0x03, 0x00, 0x00, 0xxx };//t°soufflage
//DeviceAddress T6 = { 0x28, 0xxx, 0xxx, 0xE1, 0x03, 0x00, 0x00, 0xxx };//t° aspiration

/********************Déclaration des débitmètres*****************************************/
//Débimètre Q5
//Débimètre Q6

/*******************Constantes**********************************************************/
const int LED1=10; //LED simulant ouverture registre air en direct sur pin 10
const int LED2=11; //LED simulant fermeture registre air en direct sur pin 11
const int T7=20; //t° intérieure de référence fixée à 20°C
long millis0=0; //variable pour mémoriser millis
unsigned long TempsDeManoeuvre=60000; // délai en millisecondes (temps de manoeuvre de la vanne)

void setup(void)
{
/*************************************Init du port série***********************************/
  Serial.begin(115200);// start serial port
/*************************************Init des sondes************************************/
  sensors.begin(); // Start up the library
  sensors.setResolution(T1, 12);// fixe la resolution a 12 bit sur temp extérieure
  sensors.setResolution(T2, 12);// fixe la resolution a 12 bit sur temp puits canadien
  
/**********************************Init des broches*************************************/
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  //init variables
  millis0 = millis(); //mémorise millis())
}

void printTemperature(DeviceAddress deviceAddress)
{
/*****Lecture des sondes********************/
  float tempC = sensors.getTempC(deviceAddress);
/******Vérifications si erreurs***************/
  if (tempC == -127.00)
  {
    Serial.print("Erreur de lecture temperature");
  } else
/********Affichage des températures*****************/
  {
    Serial.print(tempC);
  }
}

void loop(void)

{
  delay(2000); //delai de 2"
  Serial.print("Temperatures...\n\r");
  sensors.requestTemperatures();
  
  Serial.print("Temp ext : ");
  printTemperature(T1);
  Serial.print("\n\r");
  Serial.print("Temp puits : ");
  printTemperature(T2);
  Serial.print("\n\r");
 
  Serial.print("Temp ext - Temp int :");
  Serial.print((sensors.getTempC(T1)) - T7);
  Serial.print("\n\r\n\r");
  Serial.print("Temp puits - Temp int :");
  Serial.print((sensors.getTempC(T2)) - T7);
  Serial.print("\n\r\n\r");
 
/************Test et action sur les LED*****************************************************/
  if (((sensors.getTempC(T1))- T7)>= ((sensors.getTempC(T2)- T7))) //condition de température
//si vrai : il fait trés chaud ou trés froid dehors   donc la vanne de by pass doit être fermée pour que l'air passe par le puits
   {if(millis()-millis0>TempsDeManoeuvre)//si on a  dépassé le délai de fermeture de la vanne
      {
    digitalWrite (LED1, LOW);//On coupe le courant sur la vanne  restée fermée (fil marron non alimenté)
    digitalWrite (LED2, LOW);// et l'air passe par le puits canadien (fil blanc non alimenté)
      }
     else
 {
digitalWrite (LED1, HIGH);//cde fermeture de la vanne en cours (fils marron + blanc alimentés)
    digitalWrite (LED2, HIGH);//  (l'air doit passer par le puits canadien)
millis0=millis();//incrémentation du temps jusqu'à la fin de la fermeture de la vanne
      }
   }  
//si faux : La température extérieure est aux environs de 20° donc la vanne de by pass doit être ouverte pour que l'air de l'extérieur entre directement
    else
   {if(millis()-millis0>TempsDeManoeuvre)//si on a  dépassé le délai d'ouverture de la vanne
       {  
      digitalWrite (LED1, LOW);//alors on coupe le courant sur la vanne restée ouverte (fils marron + blanc non alimentés)
      digitalWrite (LED2, LOW);// et l'air ne passe pas par le puits canadien
       }
      else
  {
 digitalWrite (LED1, HIGH);//sinon la vanne de by pass est en cours d'ouverture
      digitalWrite (LED2, LOW); // et l'air ne passe plus par le puits canadien (fil marron alimenté et fil blanc non alimenté)
 millis0=millis();//incrémentation du temps jusqu'à la fin de l'ouverture de la vanne
       }
    }
 
}

* PrincipeVMC_PuitsCanadien.pdf (61.44 KB - downloaded 44 times.)
« Last Edit: March 16, 2013, 01:28:17 pm by FideleCastor » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Bon moi je ne vois petite erreur, milli0 doit être du type 'unsigned long' ( c'est un compteur 32 bits de 0 à 2^32). De plus je crois que comparer ou faire des opérations avec des variables d'un type différent est aléatoire.
A+
Logged

Yvelines Sud
Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir Cros31,

Ta remarque étant pertinente, je viens donc de corriger mais cela n'a pas suffi à régler mon problème.

Depuis que j'ai posté cette question, j'ai branché un LCD qui affiche toutes mes températures et les 4 états de ma vanne.
Je lui fais aussi afficher les valeurs de milli0 et millis(). Cela m'a permis de mieux comprendre ce qui se passait à chaque passage de boucle.
Je n'avais pas compris que millis() comptait sans s'arrêter à partir du début du  lancement du programme !
Quand j'aurais bien tracé tout cela je finirais par trouver mais j'avoue que cela aura été plus long que prévu !
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3769
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mais depuis que j'ai introduit cette commande je ne peux compiler complètement !

Faudrait développer un peu ...
Logged


Yvelines Sud
Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour B@tto,

J'ai détecté d'où venait le problème mais pas encore résolu :

C'est uniquement en lançant la compilation via NPPExec depuis NotePad++.
Je  préfère travailler avec NP++ mais je rencontre de temps en temps des problèmes qui m'obligent à effacer et réinstaller NP++. 

Si je travaille avec l'IDE Arduino seul ça compile.

Quant à l'utilisation de millis() pour créer une alimentation de ma LED pour une  une durée limitée  c'est un autre problème qui n'est pas encore résolu ! Mais je n'ai pas encore pris le temps de suivre à fond l'évolution des valeurs prises par millis0.

Logged

Pages: [1]   Go Up
Jump to: