159 lines
4.9 KiB
Arduino
159 lines
4.9 KiB
Arduino
|
/* Si la température est < 15°C, un cycle de chauffe.
|
|||
|
Si la température > 25 °C, le ventilateur tourne en proportion.
|
|||
|
Si l’Humidité < 50%, un cycle arrosage.
|
|||
|
Si l’Humidité >70 %, le ventilateur tourne en proportion
|
|||
|
*/
|
|||
|
#define JAUNE 13 //
|
|||
|
#define BLEU 12 //
|
|||
|
#define ROUGE 11 //
|
|||
|
#define VERTE 9 //
|
|||
|
#define APVCC 2 //
|
|||
|
#define APGND 6 //
|
|||
|
#define AP_H A0 //
|
|||
|
#define AP_T A1 //
|
|||
|
|
|||
|
#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 ;
|
|||
|
PT_WAIT_UNTIL(pt, millis() > ttl);
|
|||
|
temp = acquis(AP_T, 0, 50); // pour ptHumi on a : humi = acquis(AP_T, 20, 80);
|
|||
|
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;
|
|||
|
PT_WAIT_UNTIL(pt, millis() > ttl);
|
|||
|
humi = acquis(AP_H, 20, 80);
|
|||
|
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) {
|
|||
|
nb_old = nb_cycles;
|
|||
|
ratio = map(nb_cycles, 0, 100, 254, 0);
|
|||
|
ledPWM(VERTE, ratio);
|
|||
|
PT_WAIT_UNTIL(pt, nb_cycles > nb_old ); // attente nouvel arrosage
|
|||
|
}
|
|||
|
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 < 15);
|
|||
|
digitalWrite(JAUNE, HIGH);
|
|||
|
ttl = millis() + actif ;
|
|||
|
PT_WAIT_UNTIL (pt, millis() > ttl);
|
|||
|
digitalWrite(JAUNE, LOW);
|
|||
|
ttl = millis() + inactif ;
|
|||
|
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 < 50);
|
|||
|
digitalWrite(BLEU, HIGH);
|
|||
|
ttl = millis() + actif ;
|
|||
|
nb_cycles++;
|
|||
|
alarme = ( nb_cycles > 100);
|
|||
|
PT_WAIT_UNTIL (pt, millis() > ttl);
|
|||
|
digitalWrite(BLEU, LOW);
|
|||
|
ttl = millis() + inactif ;
|
|||
|
PT_WAIT_UNTIL (pt, millis() > ttl);
|
|||
|
}
|
|||
|
PT_END(pt);
|
|||
|
} // Eau
|
|||
|
static int ptVenti(struct pt *pt) {
|
|||
|
static int temp_old = 0, humi_old = 0; int t_ratio=0, h_ratio = 0, i ;
|
|||
|
static unsigned long ttl = 0;
|
|||
|
PT_BEGIN(pt);
|
|||
|
while (1) {
|
|||
|
if (temp < 25 && humi < 70) digitalWrite(ROUGE, LOW);
|
|||
|
PT_WAIT_UNTIL(pt, temp > 25 || humi > 70);
|
|||
|
temp_old = temp;
|
|||
|
humi_old = humi ;
|
|||
|
if (temp > 25) t_ratio = map(temp, 0, 50, 0,254);
|
|||
|
if (humi > 70) h_ratio = map(humi, 30, 100, 0,254);
|
|||
|
i = max(t_ratio , h_ratio );
|
|||
|
ledPWM(ROUGE, i) ;
|
|||
|
PT_WAIT_UNTIL(pt, temp != temp_old || humi != humi_old );
|
|||
|
}
|
|||
|
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); // at max
|
|||
|
pinMode(APVCC, OUTPUT); pinMode(APGND, OUTPUT);
|
|||
|
digitalWrite(APVCC, HIGH); digitalWrite(APGND, LOW);
|
|||
|
}
|
|||
|
void setup() {
|
|||
|
int val;
|
|||
|
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);
|
|||
|
Serial.println(F("\nLog de " __FILE__ " du " __DATE__));
|
|||
|
val=analogRead(1);
|
|||
|
ttyPutInt("Raw Temp = ",val);
|
|||
|
val=analogRead(0);
|
|||
|
ttyPutInt("Raw humi = ",val);
|
|||
|
temp = acquis(1, 0, 100);
|
|||
|
ttyPutInt("Temp = ",temp);
|
|||
|
humi = acquis(0, 0, 100);
|
|||
|
ttyPutInt("Humi = ",humi);
|
|||
|
}
|
|||
|
|
|||
|
void loop() {
|
|||
|
ptTemp(&ptT,2000); // acquisition t° chaque 200ms
|
|||
|
ptHumi(&ptH,4000); // acquisition % chaque 500ms
|
|||
|
ptVenti(&ptV); // pilotage ventilation (LED Rouge)
|
|||
|
ptChauffe(&ptC,5,10); // pilotage chauffage de 3s et inactivité de 3s (LED Jaune)
|
|||
|
ptEau(&ptE,3,20); // pilotage arrosage de 3s et inactivité de 5s (LED Bleu)
|
|||
|
ptNiveau(&ptN); // affichage niveau d’eau, PWM Verte de 254 à 0 (LED Verte)
|
|||
|
ptAlarme(&ptA,500); // alarme réserve vide , clignote à 1Hz (LED Verte)
|
|||
|
}
|