Merci revlys pour ta réponse.
Mon besoin est de mesurer les tachymètres des ventilateurs de ma VMC double flux DIY.
Les interruptions sont appelées au début du setup et les fonctions appelés, vraiment simples... ...sont à la fin : tachyIn et tachyOut.
Code : Tout sélectionner
/*
Vitesse des ventilateurs :
PWM Vin Vout
0 3690 3580 300
10 3420 3380 200
20 3250 3280 200
40 3040 2920 350
60 2680 2660 300
80 2380 2340 400
100 2060 2040 200
120 1820 1780 300
140 1500 1480 200
160 1300 1260 200
180 1120 1080 200
200 940 960 50
220 900 880
*/
#include <Ethernet.h>
#include <NTPClient.h>
#include <PWM.h>
#include <DHT.h>
const byte TachyInPin = 2;
const byte TachyOutPin = 3;
const byte DHTInPin = 4;
const byte DHTOutPin = 5;
const byte VentiloInPin = 9;
const byte VentiloOutPin = 10;
const byte ModeNuit = 0;
const byte ModeJour = 1;
const byte SaisonFroide = 0;
const byte SaisonFraiche = 1;
const byte SaisonTempere = 2;
const byte SaisonChaude = 3;
const byte Vmin = 220;
const byte V1 = 200;
const byte V2 = 180;
const byte V3 = 160;
const byte V4 = 140;
const byte V5 = 120;
const byte V6 = 100;
const byte V7 = 80;
const byte V8 = 60;
const byte V9 = 40;
const byte V10 = 20;
const byte Vmax = 0;
byte mac[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x10 };
//byte mac[6] = { 0x90, 0xA2, 0xDA, 0x70, 0x66, 0xD1 };
//byte mac[6] = { 0x90, 0xA2, 0xDA, 0x91, 0xCF, 0xF5 };
EthernetUDP udp;
NTPClient timeClient(udp);
String formattedDate, timeStamp, buff;
int Hour,Minute,NTPHour,NTPMinute,i,NTPReadOK,Mode,PremierJour,MesureExtMax,MesureExtMin,Shift,ShiftedHour,VitesseVentiloIn,VitesseVentiloOut,Saison,Consigne;
float TempRef[24],TempExtMoyenne,TempExtMax,TempExtMin,HumIn,TempIn,HumOut,TempOut,HumAbsOut,HumAbsIn;
unsigned long TicSecondes, TicJours, TicHeures, TicMinutes, Pulse;
unsigned long ToursIn=0;
unsigned long ToursOut=0;
DHT dhtIn(DHTInPin, DHT22);
DHT dhtOut(DHTOutPin, DHT22);
void setup() {
pinMode(TachyInPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(TachyInPin), tachyIn, RISING);
pinMode(TachyOutPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(TachyOutPin), tachyOut, RISING);
SetPinFrequency(VentiloInPin, 8);
SetPinFrequency(VentiloOutPin, 8);
Serial.begin(115200);
dhtIn.begin();
dhtOut.begin();
Ethernet.begin(mac);
timeClient.begin();
timeClient.setTimeOffset(3600);
Serial.print("localIP: ");Serial.println(Ethernet.localIP());
Serial.print("subnetMask: ");Serial.println(Ethernet.subnetMask());
Serial.print("gatewayIP: ");Serial.println(Ethernet.gatewayIP());
Serial.print("dnsServerIP: ");Serial.println(Ethernet.dnsServerIP());
//initialisation de la temp moyenne avec la temp actuelle
for (i=0;i<24;i++) TempRef[i]=dhtIn.readTemperature();
TicJours=millis();
TicHeures=millis() - 3600000;
TicMinutes=millis() - 60000;
TicSecondes=millis() - 1000;
NTPReadOK=0; Hour=0; Minute=0;
Mode=ModeNuit;
PremierJour=1;
analogWrite(VentiloInPin,Vmin);
analogWrite(VentiloOutPin,Vmin);
}
void loop() {
//Boucle des jours
if (millis() > TicJours + 86400000) {
TicJours=millis();
if (PremierJour == 0) {
Saison = SaisonChaude;
if (TempExtMoyenne < 22) Saison = SaisonTempere;
if (TempExtMoyenne < 16) Saison = SaisonFraiche;
if (TempExtMoyenne < 10) Saison = SaisonFroide;
}
PremierJour=0; }
//Boucle des heures
if (millis() > TicHeures + 3600000) {
TicHeures=millis();
getNTPTime();
Serial.print("NTP ");Serial.print(NTPHour);Serial.print(":");Serial.println(NTPMinute);
if ((NTPHour != NULL) && (NTPMinute != NULL)) {
Hour = NTPHour;
Minute = NTPMinute;
NTPReadOK=1; }
else {
NTPReadOK=0;
Hour=Hour+1;
if (Hour >= 24) Hour=0; }
TempRef[Hour]=dhtIn.readTemperature();
Serial.print("Heure : ");Serial.print(Hour);Serial.print("Temperature exterieure : ");Serial.println(TempRef[Hour]);
TempExtMoyenne=0;
TempExtMax=TempExtMin=TempRef[0];
for (i=0;i<24;i++) {
TempExtMoyenne+=TempRef[i];
if (TempRef[i] > TempExtMax) {TempExtMax = TempRef[i]; MesureExtMax = i;}
if (TempRef[i] < TempExtMin) {TempExtMin = TempRef[i]; MesureExtMin = i;}
TempExtMoyenne=TempExtMoyenne/24; }
if ((PremierJour == 0) && (NTPReadOK == 0)){
//Fixe l'heure à partir du principe que l'heure la plus chaude est 16h. (utilisé en cas de défaut NTP)
Shift = 16 - MesureExtMax;
ShiftedHour = Hour + Shift;
if (ShiftedHour <0) Hour = ShiftedHour + 24;
if (ShiftedHour > 23) Hour = ShiftedHour - 24;
Hour = ShiftedHour;
//Fixe le mode jour/nuit en fonction de l'heure
if ((Hour > 20) || (Hour < 8)) Mode = ModeNuit;
else Mode = ModeJour;
} }
//Boucle des minutes
if (millis()>= TicMinutes + 60000){
TicMinutes=millis();
Serial.print(Hour);Serial.print(":");Serial.println(Minute);
Serial.print("Temperature In :");Serial.println(dhtIn.readTemperature());
Serial.print("Humidite In :");Serial.println(dhtIn.readHumidity());
Serial.print("Temperature Out :");Serial.println(dhtOut.readTemperature());
Serial.print("Humidite Out :");Serial.println(dhtOut.readHumidity());
Serial.print("Rotation In :");Serial.print(VitesseVentiloIn);Serial.println("RPM");
Serial.print("Rotation Out :");Serial.print(VitesseVentiloOut);Serial.println("RPM");
HumIn = dhtIn.readHumidity();
TempIn = dhtIn.readTemperature();
HumOut = dhtOut.readHumidity();
TempOut = dhtOut.readTemperature();
HumAbsOut = HumiditeAbsolue(HumOut,TempOut);
HumAbsIn = HumiditeAbsolue(HumIn,TempIn);
Consigne= V5;
if (HumOut > 40) Consigne = V6;
if (HumOut > 50) Consigne = V7;
if (HumOut > 60) Consigne = V9;
if (HumOut > 70) Consigne = V10;
if (HumOut > 80) Consigne = Vmax;
if (TempIn < TempOut) {
if (Saison == SaisonFroide) Consigne = Consigne + 60;
if (Saison == SaisonFraiche) Consigne = Consigne + 40;
if (Saison == SaisonChaude) Consigne = Consigne - 60; }
else {
if (Saison == SaisonFroide) Consigne = Consigne - 60;
if (Saison == SaisonFraiche) Consigne = Consigne - 60;
if (Saison == SaisonChaude) Consigne = Consigne + 60; }
if (Mode == ModeNuit) {
if ((Saison == SaisonChaude) && (Hour < 5) && (Consigne > V7)) Consigne = V7;
if ((Saison != SaisonChaude) && (Consigne > V5)) Consigne = V5; }
if (HumAbsOut > HumAbsIn) Consigne = Vmin;
if (Consigne < Vmin) Consigne = Vmin;
if (Consigne > Vmax) Consigne = Vmax;
analogWrite(VentiloInPin,Consigne);
analogWrite(VentiloOutPin,Consigne);
Minute++;
if (Minute >= 60) Minute=0; }
//Boucle des secondes
if (millis()>= TicSecondes + 1000){
TicSecondes=millis();
VitesseVentiloIn=ToursIn*20;
VitesseVentiloOut=ToursOut*20;
ToursIn=0;
ToursOut=0; }
}
void tachyIn() {ToursIn++;}
void tachyOut() {ToursOut++;}
void getNTPTime() {
timeClient.update();
formattedDate=timeClient.getFormattedTime();
NTPHour = formattedDate.substring(0, 2).toInt();
NTPMinute = formattedDate.substring(3, 5).toInt();
}
float HumiditeAbsolue(float HumRelative,float Temperature) {
float pvs,ps,xe,n,ne,me;
// Formuile de Ranline simplifiée : pression de vapeur saturante (soit 100% d'humidité) = 13,7-(5120/T) (en Kelvin)
pvs=13,7-(5120/(Temperature+273,15));
// Ps=3,169kPa ; la pression partielle de vapeur d'eau dans l'atmosphère est donc : Pe=pvs*HumRelative
ps=pvs*HumRelative;
// En assimilant l'atmosphère à un mélange de gaz parfaits, la fraction molaire de la vapeur d'eau est : xe=(ps/1,013.10^5)
xe = ps/101300;
//La quantité totale de gaz dans 1m3 d'air humide est : PV/RT : (1.013*10^5*1)/8,314*T (en Kelvoin)
n = 101300/(8,314*(Temperature+273,15));
// La quantité de vapeur d'eau dans 1m3 d'air est donc : ne = xe * n
ne = xe * n;
// La masse molaire de l'eau étant : M=18g/mol, la masse de vapeur d'eau dans 1m3 est donc ne * 18
me = ne * 18;
return me;
}