Transférer les fichiers vers 'arduino_proto_threads/tp_serre'
Code associé au TP µserre
This commit is contained in:
parent
ee155fe7d6
commit
d983a61d51
76
arduino_proto_threads/tp_serre/pt.h
Normal file
76
arduino_proto_threads/tp_serre/pt.h
Normal file
@ -0,0 +1,76 @@
|
||||
#ifndef __PT_H__
|
||||
#define __PT_H__
|
||||
|
||||
typedef unsigned short lc_t;
|
||||
#define LC_INIT(s) s = 0; // LC_INIT
|
||||
#define LC_RESUME(s) switch(s) { case 0: // LC_RESUME
|
||||
#define LC_SET(s) s = __LINE__; case __LINE__: // LC_SET line
|
||||
#define LC_END(s) } // LC_END
|
||||
|
||||
struct pt { lc_t lc; };
|
||||
|
||||
#define PT_WAITING 0
|
||||
#define PT_YIELDED 1
|
||||
#define PT_EXITED 2
|
||||
#define PT_ENDED 3
|
||||
#define PT_INIT(pt) LC_INIT((pt)->lc) // INIT
|
||||
#define PT_THREAD(name_args) char name_args // THREAD
|
||||
#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) // BEGIN
|
||||
#define PT_END(pt) LC_END((pt)->lc); \
|
||||
PT_YIELD_FLAG = 0; \
|
||||
PT_INIT(pt); return PT_ENDED; } // END
|
||||
#define PT_WAIT_UNTIL(pt, condition) \
|
||||
do { \
|
||||
LC_SET((pt)->lc); \
|
||||
if(!(condition)) { \
|
||||
return PT_WAITING; \
|
||||
} \
|
||||
} while(0) // WAIT_UNTIL
|
||||
#define PT_WAIT_WHILE(pt, cond) \
|
||||
PT_WAIT_UNTIL((pt), !(cond)) // WAIT_WHILE
|
||||
#define PT_WAIT_THREAD(pt, thread) \
|
||||
PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) // WAIT_THREAD
|
||||
#define PT_SPAWN(pt, child, thread) \
|
||||
do { \
|
||||
PT_INIT((child)); \
|
||||
PT_WAIT_THREAD((pt), (thread)); \
|
||||
} while(0) // SPAWN
|
||||
#define PT_RESTART(pt) \
|
||||
do { \
|
||||
PT_INIT(pt); \
|
||||
return PT_WAITING; \
|
||||
} while(0) // RESTART
|
||||
#define PT_EXIT(pt) \
|
||||
do { \
|
||||
PT_INIT(pt); \
|
||||
return PT_EXITED; \
|
||||
} while(0) // EXIT
|
||||
#define PT_SCHEDULE(f) ((f) < PT_EXITED) // SCHEDULE
|
||||
#define PT_YIELD(pt) \
|
||||
do { \
|
||||
PT_YIELD_FLAG = 0; \
|
||||
LC_SET((pt)->lc); \
|
||||
if(PT_YIELD_FLAG == 0) { \
|
||||
return PT_YIELDED; \
|
||||
} \
|
||||
} while(0) // YIELD
|
||||
#define PT_YIELD_UNTIL(pt, cond) \
|
||||
do { \
|
||||
PT_YIELD_FLAG = 0; \
|
||||
LC_SET((pt)->lc); \
|
||||
if((PT_YIELD_FLAG == 0) || !(cond)) { \
|
||||
return PT_YIELDED; \
|
||||
} \
|
||||
} while(0) // YIELD_UNTIL
|
||||
// checked for n calls in a thread : seems OK
|
||||
#define PT_DELAY(pt, ms) \
|
||||
do { \
|
||||
static unsigned long _PTTTL_ ; \
|
||||
_PTTTL_ = millis() + (unsigned int)(ms); \
|
||||
PT_WAIT_UNTIL((pt), (millis() > _PTTTL_)); \
|
||||
} while(0) // DELAY
|
||||
#define PT_SYNC(pt, mark, ms) \
|
||||
do { \
|
||||
PT_WAIT_UNTIL((pt), (millis() - (mark) > (ms) )); \
|
||||
} while(0) // SYNC
|
||||
#endif /* __PT_H__ */
|
103
arduino_proto_threads/tp_serre/serialTrace.h
Normal file
103
arduino_proto_threads/tp_serre/serialTrace.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*------------------------------------------------------------------*/
|
||||
/* Projet: Dev Tools */
|
||||
/* File : serialTrace.h */
|
||||
/* Author: user@W500 08/28/20 */
|
||||
/*------------------------------------------------------------------*/
|
||||
// RCS CI/CO : Cx v v, terminate log : CcCc, view log : Cx v l
|
||||
// TODO: all this should be in a class or a singleton class
|
||||
// TODO: strings should be in Flash 32kb code
|
||||
// #include <avr/pgmspace.h>
|
||||
|
||||
#ifndef __SERIALTRACE_H__
|
||||
#define __SERIALTRACE_H__
|
||||
extern char *__brkval;
|
||||
unsigned long freeMemory() {
|
||||
char top;
|
||||
return &top - (__brkval ? __brkval : __malloc_heap_start);
|
||||
}
|
||||
|
||||
void retard(unsigned long ms, int mini) {
|
||||
#ifndef TEST
|
||||
delay(ms);
|
||||
#else
|
||||
delay(mini);
|
||||
#endif
|
||||
}
|
||||
// functions used for I/O using serial monitor
|
||||
#ifndef IHM // if IHM undefined then just empty functions.
|
||||
// So users don't need to change code, just define/undefine IHM.
|
||||
// A bit of a waste, but main purpose is testing.
|
||||
bool ttyAskN ( String prompt ) {}
|
||||
bool ttyAskY ( String prompt ) {}
|
||||
char ttyGetChar ( String prompt ) {}
|
||||
int ttyGetInt ( String prompt ) {}
|
||||
void ttyPutInt ( String prompt, int num ) {}
|
||||
void ttyPutMem ( ) {}
|
||||
void ttyPutStr ( String txt ) {}
|
||||
void ttyPutUin ( String prompt, unsigned int num ) {}
|
||||
void ttyPutFloat ( String prompt, float num ) {}
|
||||
void ttySetIHM ( long baud ) {}
|
||||
void ttyWipe ( short lines ) {}
|
||||
|
||||
#else
|
||||
void ttySetIHM(long baud) {
|
||||
Serial.begin(baud); // WIP check if baud in correct values ?
|
||||
for (int i=0;i<10;i++) Serial.print("\n") ;
|
||||
}
|
||||
void ttyPutStr(String txt) { Serial.println(txt);
|
||||
}
|
||||
void ttyPutMem() {
|
||||
char buf[32];
|
||||
unsigned long octets = freeMemory();
|
||||
int k = octets / 1024 ; int o = octets % 1024;
|
||||
sprintf(buf, "SRAM: %dKo%d free",k,o);
|
||||
Serial.println (buf) ;
|
||||
}
|
||||
void ttyPutInt(String prompt, int num ) {
|
||||
char buf[64];
|
||||
sprintf(buf, "%s %d", prompt.c_str(), num ) ;
|
||||
Serial.println (buf) ;
|
||||
}
|
||||
void ttyPutUin(String prompt, unsigned int num ) {
|
||||
char buf[64];
|
||||
sprintf(buf, "%s %d", prompt.c_str(), num ) ;
|
||||
Serial.println(buf) ;
|
||||
}
|
||||
int ttyGetInt(String prompt) {
|
||||
Serial.println(prompt);
|
||||
while (Serial.available()==0) {} //Wait for user input
|
||||
String val=Serial.readString();
|
||||
return val.toInt();
|
||||
}
|
||||
void ttyPutFloat ( String prompt, float num ) {
|
||||
Serial.print(prompt);
|
||||
Serial.println (num) ;
|
||||
}
|
||||
void ttyPutFloatRound ( String prompt, float num ) {
|
||||
char buf[64];
|
||||
sprintf(buf, "%s %d", prompt.c_str(), int(num) ) ;
|
||||
Serial.println (buf) ;
|
||||
}
|
||||
char ttyGetChar(String prompt) {
|
||||
Serial.println(prompt);
|
||||
while (Serial.available()==0) {} //Wait for user input
|
||||
return Serial.read();
|
||||
}
|
||||
bool ttyAskY(String prompt){
|
||||
byte R = 223 & (byte)ttyGetChar(prompt);
|
||||
if ('Y' == R ) return true;
|
||||
else return false ;
|
||||
}
|
||||
bool ttyAskN(String prompt){
|
||||
byte R = 223 & (byte)ttyGetChar(prompt);
|
||||
if ('N' == R ) return true;
|
||||
return false ;
|
||||
}
|
||||
void ttyWipe (short lines) {
|
||||
//const short ESC=27 ; KO in Arduino serial monitor, works with others tty
|
||||
// Serial.write(ESC); Serial.print("[2J"); // cls
|
||||
// Serial.write(ESC); Serial.print("[H"); // cursor to home
|
||||
while (lines--) Serial.print("\n") ; // somehow overkill !
|
||||
}
|
||||
#endif // IHM
|
||||
#endif // __SERIALTRACE_H__
|
158
arduino_proto_threads/tp_serre/tp_serre.ino
Normal file
158
arduino_proto_threads/tp_serre/tp_serre.ino
Normal file
@ -0,0 +1,158 @@
|
||||
/* 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)
|
||||
}
|
Loading…
Reference in New Issue
Block a user