/* Si la température est < CMINT°C, un cycle de chauffe. Si la température > CMAXT °C, le ventilateur tourne en proportion. Si l’Humidité < CMINH %, un cycle arrosage. Si l’Humidité >CMAXH %, le ventilateur tourne en proportion */ #define CMINT 15 // consigne basse #define CMAXT 25 // Consigne haute #define CMINH 40 // consigne basse #define CMAXH 50 // Consigne haute #define TMIN 0 // echelle basse #define TMAX 50 // echelle haute #define HMIN 20 // echelle basse #define HMAX 80 // echelle haute #define MAXCYCLE 10 // nb max de cycles arrosage #define JAUNE 13 // chauffe #define BLEU 12 // arrosage #define ROUGE 11 // ventilation #define VERTE 9 // niveau #define APVCC 2 // #define MAXCYCLE 500 // nb max de cycles+5V #define APGND 6 // 0V #define AP_H A2 // potard humidité #define AP_T A1 // potard température #define IHM #include "serialTrace.h" // infos / trace to serial monitor #include "pt.h" static struct pt ptT, ptH, ptV, ptC, ptE, ptN, ptA; // proto threads int temp=0; int humi=0; bool alarme = false; int nb_cycles = 0; void log_acqui(char * msg, int va); void ledPWM(int led, int ratio) { int val=constrain(ratio,0,254); // limit to values [0..254] analogWrite(led, val); } int acquis(int broche, int vmin, int vmax) { // WIP int val ; val=analogRead(broche); // 1024 pts, 0 < U < 5V ==> 0 < val < 1023 return map (val, 0, 1023, vmin, vmax ) ; } static int ptTemp(struct pt *pt, int repit) { static unsigned long ttl = 0; PT_BEGIN(pt); while(1) { ttl = millis() + (repit*1000) ; PT_WAIT_UNTIL(pt, millis() > ttl); temp = acquis(AP_T, TMIN, TMAX); ttyPutInt ("temp: ", temp); } PT_END(pt); } static int ptHumi(struct pt *pt, int repit) { static unsigned long ttl = 0; PT_BEGIN(pt); while(1) { ttl = millis() + (repit*1000); PT_WAIT_UNTIL(pt, millis() > ttl); humi = acquis(AP_H, HMIN, HMAX); ttyPutInt ("humi: ",humi); } PT_END(pt); } static int ptAlarme (struct pt *pt, int duree){ static unsigned long ttl; PT_BEGIN(pt); while (alarme) { ttl = millis() + duree; PT_WAIT_UNTIL(pt, millis() > ttl); digitalWrite(VERTE, !digitalRead(VERTE)); } PT_END(pt); } static int ptNiveau(struct pt *pt){ static int nb_old = 0; int ratio; PT_BEGIN(pt); while (!alarme) { PT_WAIT_UNTIL(pt, nb_cycles > nb_old ); // attente nouvel arrosage ratio = map(nb_cycles, 0, MAXCYCLE, 254, 0); ledPWM(VERTE, ratio); ttyPutInt ("Niveau: ",ratio); nb_old = nb_cycles; } PT_END(pt); } static int ptChauffe(struct pt *pt, int actif, int inactif ){ static unsigned long ttl = 0; PT_BEGIN(pt); while (1) { PT_WAIT_UNTIL(pt, temp < CMINT); digitalWrite(JAUNE, HIGH); ttl = millis() + (actif*1000) ; PT_WAIT_UNTIL (pt, millis() > ttl); digitalWrite(JAUNE, LOW); ttl = millis() + (inactif*1000) ; PT_WAIT_UNTIL (pt, millis() > ttl); } PT_END(pt); } // Chauffe static int ptEau(struct pt *pt, int actif, int inactif ) { static unsigned long ttl = 0; PT_BEGIN(pt); while (!alarme) { PT_WAIT_UNTIL(pt, humi < CMINH); digitalWrite(BLEU, HIGH); ttl = millis() + (actif*1000) ; PT_WAIT_UNTIL (pt, millis() > ttl); digitalWrite(BLEU, LOW); nb_cycles++; alarme = ( nb_cycles >= MAXCYCLE); ttyPutInt ("Cycle: ",nb_cycles); ttl = millis() + (inactif*1000) ; PT_WAIT_UNTIL (pt, millis() > ttl); } PT_END(pt); } // Eau int vRatio(){ int t_ratio=0, h_ratio = 0, i = 0 ; // On pilote la led sur la plage utile la plus petite if (temp > CMAXT) t_ratio = map(temp, CMAXT, TMAX, 0,254); if (humi > CMAXH) h_ratio = map(humi, CMAXH, HMAX, 0,254); return max(t_ratio, h_ratio ); } static int ptVenti(struct pt *pt) { static int temp_old = 0, humi_old = 0; PT_BEGIN(pt); while (1) { PT_WAIT_UNTIL(pt, temp > CMAXT || humi > CMAXH); temp_old = temp; humi_old = humi ; ledPWM(ROUGE, vRatio()) ; // calcul du ration selon les mesures PT_WAIT_UNTIL(pt, temp != temp_old || humi != humi_old ); ledPWM(ROUGE, vRatio()) ; } PT_END(pt); } // Ventilateur void initIO() { pinMode(ROUGE, OUTPUT); analogWrite(ROUGE, 0); pinMode(JAUNE, OUTPUT); pinMode(BLEU, OUTPUT); digitalWrite(JAUNE, LOW); digitalWrite(BLEU, LOW) ; pinMode(VERTE, OUTPUT); analogWrite(VERTE, 254); // max pinMode(APVCC, OUTPUT); pinMode(APGND, OUTPUT); digitalWrite(APVCC, HIGH); digitalWrite(APGND, LOW); } void setup() { initIO(); // Setup: set LEDs & pots // static struct pt ptT, ptH, ptV, ptC, ptE, ptN, ptA ; PT_INIT(&ptT); PT_INIT(&ptH); PT_INIT(&ptV); PT_INIT(&ptC); PT_INIT(&ptE); PT_INIT(&ptN); PT_INIT(&ptA); ttySetIHM(9600); temp = acquis(AP_T, TMIN, TMAX); // acquis potard T° humi = acquis(AP_H, HMIN, HMAX); // acquis potard H% } void loop() { ptTemp(&ptT, 4); // acquisition t°chaque 5sec ptHumi(&ptH, 6); // acquisition % chaque 10sec ptVenti(&ptV); // ventilation ptChauffe(&ptC,5,10); // chauffage 5s, inactivité 10s ptEau(&ptE,3,10); // arrosage 3s, inactivité 40s ptNiveau(&ptN); // niveau d’eau, PWM Verte ptAlarme(&ptA,500); // réserve vide, clignote à 1Hz }