bonjours a tous , je suis en train de finaliser un projet de thermostat via arduino, et après pas mal de recherche sur le net, de boulot personnel, mon projet touche à sa fin.
Au cas où d'autre personne ferais quelque chose du même genre je partage mes base du code.
utilisation de sonde de type CTN sur un pont diviseur
partie initialisation
//////////////////////////////////// les entrées sorties ////////////////////////////////////
int SB=1; // pin sonde température sol
int R1=11000; // valeur de la resistance fixe du pont diviseur en ohm
//////////////////////////////////// gestion de la sonde sol ////////////////////////////////////
int BR1=27275; // Résistance de la sonde mesure 1
int BR2=13677; // Résistance de la sonde mesure 2
int BR3=721; // Résistance de la sonde mesure 3
float BT1=4; // température mesure 1
float BT2=19.5; // température mesure 2
float BT3=92.8; // température mesure 3
float BR=0; // variable résistance sonde de témpérature sol
float BRB=0; // variable signal sonde intérieur
const int numReadingsB = 10 ; // Nombre de relevés pour la moyenne signal
int readingsB [ numReadingsB ] ; // Variable lecture pour la sonde sol
int indexB = 0 ; // position dans la création de la moyenne
int totalB = 0 ; // Total en cours
int averageB = 0 ; // La moyenne
R1 est la valeur de la résistance que vous aurez judicieusement choisis pour le couplage avec la CTN
BR1 et BT1 sont des valeurs déterminé lors d'expérimentation
BR2 et BT2 sont des valeurs déterminé lors d'expérimentation
BR3 et BT3 sont des valeurs déterminé lors d'expérimentation
const int numReadingsB = 10 ; est la nombre de valeur utilisé pour le lissage, 10 mesure est un bon compromis entre stabilité et réactivité.
//////////////////////////////////// calcul de moyenne de la sonde intérieur ////////////////////////////////////
totalR = totalR - readingsR [ indexR ] ;
readingsR [ indexR ] = analogRead ( SR ) ; // read from the sensor:
totalR = totalR + readingsR [ indexR ] ; // add the reading to the total:
indexR = indexR + 1 ; // advance to the next position in the array:
if ( indexR >= numReadingsR ) // if we're at the end of the array...
indexR = 0 ; // ...wrap around to the beginning:
averageR = totalR / numReadingsR ; // calculate the average:
RRB=averageR;
//////////////////////////////////// calcul de la température intérieur via stein hart, pont diviseur et gestion des caractéres pour le processing ////////////////////////////////////
RR=((R1*RRB)/(1023-RRB));
double RY1=1/(RT1+273.15);
double RY2=1/(RT2+273.15);
double RY3=1/(RT3+273.15);
double RL1=log(RR1);
double RL2=log(RR2);
double RL3=log(RR3);
double RV2=(RY2-RY1)/(RL2-RL1);
double RV3=(RY3-RY1)/(RL3-RL1);
double RC=((RV3-RV2)/((RL3-RL2))*((1/(RL1+RL2+RL3))));
double RB=RV2-(RC*((RL1*RL1)+(RL1*RL2)+(RL2*RL2)));
double RA=RY1-((RB+(RL1*RL1)*RC)*RL1);
double RT=((1/(RA+(RB*log(RR))+(RC*((log(RR))*(log(RR))*(log(RR))))))-275.5);
Tous le calcul via les équation de stein hart pour les ctn.
RT et la valeur de température final. Attention dans le dernier calcul il y a la valeur 275.5, normalement c'est 273.5, mais j'ai une dérive de 2°
bon pour répondre à ta question, il s'agit de remplacer tous les thermostat (mal positionner et merdique).
Le but est de géré via processing la température de chaque piéces, gérer le jours nuits avec un abonnement tempo (affichage des compteurs, conso instantané..) et +++
Je vais également démarrer un projet de thermostat / pièce (via Arduino Mega 2560 et DS1820) .
Pour être autonome en cas de pb de PC, j'intègre à l'Arduino les plages des températures programmées en fonction des jours de la semaine. Je cherche des idées d'algorithme, pas encore super claire dans ma tête.
En fait, je suis en train d'écrire le programme de mon thermostat. J'aimerais avoir un max de souplesse. Chaque jour de la semaine doit pouvoir être programmé comme on l'entend (plage, températures basses et hautes...).
Je cherche comment organiser mon programme. Si tu voulais partager ton algorithme ou ton code, cela me donnerait des idées.
tu veux piloter avec le therminal de l'arduino ou processing.
Que veux-tu dire ?
Mon but : la carte Arduino lis la température de la pièce via un DS1820 et active ou pas un relais de chauffage. Le tout sur base de plages horaires programmées dans l'Arduino. A terme, raccordement au PC pour programmer les plages et récupérer les courbes de températures.
@FP24V,
pilotage via un clavier et un afficheur LCD reliés à l'Arduino.
Concernant les réglages, il suffit de les sauvegarder en eeprom pour éviter les soucis.
l'utilisation un code binaire à transferer dans l'arduino du genre:
J1=1000000110000011100011
qui voudrait dire:
jour1,premier 1 inutile; à 0 heure temp basse; à 1h....
sur une interface graphique type processing,
1-tu va avoir jour1 et 24 boutons, éteint, température de ralentit, allumé température de plein gaz, cela va te donner un code binaire en 24 bit.
pour alléger tu le convertit en décimal, vue que chaque code binaire à son propre décimale, chaque combinaison est unique.
2- tu envoies tes décimale dans l'arduino
3- tu lui refait convertir ton décimale en binaire, mais là après moi je suis largué.
le but ce que l'arduino sache que quand il tombe sur un 1 lors de la lecture de la chaine il chauffe à 22° et que quand il est sur un zero il passe à 17°.
donc de tête et avec le peu de connaissance que j'ai je ferai ceci dans l'arduino:
après la réception de la chaîne de 7x24 caractères, tu lui fasse lire bit après bit cette chaine faite de 1 et de 0.
va y avoir du char, du for.
désolé de ne pas être plus précis, je débute, j'ai quelque principe logique, ma bite et mon couteau.