Files
Presentations/arduino_proto_threads/tp_dragon/tp_dragon.ino
T
2026-10-24 04:36:38 +11:00

156 lines
5.2 KiB
Arduino
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*--------------------------------------------------------------*/
/* Projet: Atelier proto threads pour l'Arduino */
/* File : tp_pt.ino */
/* Author: jearz@HPP 30/07/21 */
/*--------------------------------------------------------------*/
/*
Animation de 4 leds suite à l'appui d'un boutton poussoir
*/
#define JAUNE 13 //
#define BLEUE 12 //
#define ROUGE 11 //
#define AUTRE 10 // provision
#define VERTE 9 //
#define POUSSOIR 8 // boutton
#include "pt.h" // version modifiée de l'original <pt.h>
static struct pt ptP, ptR, ptRv, ptJ, ptB, ptVc, ptVd; // proto threads
bool cycle = false; uint16_t periode = 7000; // gestion du cycle
bool degrade = false; int nb_cycles = 0; const int deb_cycle_ko = 10; // 255;
void initIO() {
pinMode(POUSSOIR, INPUT_PULLUP);
pinMode(ROUGE, OUTPUT); analogWrite(ROUGE, LOW);
pinMode(JAUNE, OUTPUT); digitalWrite(JAUNE, LOW);
pinMode(BLEUE, OUTPUT); digitalWrite(BLEUE, LOW);
pinMode(VERTE, OUTPUT); analogWrite(VERTE, 254); // gauge at max
pinMode(POUSSOIR, INPUT_PULLUP);
}
void setup() {
initIO(); // Setup: set LEDs & boutton
PT_INIT(&ptP); PT_INIT(&ptR); PT_INIT(&ptRv); PT_INIT(&ptJ);
PT_INIT(&ptB); PT_INIT(&ptVc); PT_INIT(&ptVd);
}
/*------------------------------------------------------------------*/
void ledPWM(uint8_t led, int ratio) {
uint8_t val=constrain(ratio,0,254); // limité à [0..254]
analogWrite(led, val);
}
bool capterPoussoir() { // fonction anti rebonds
int nb=0;
for (int i=0;i<10;i++) {
delay(10); // utiliser un thread ?
nb+= digitalRead(POUSSOIR); // Pullup pin: HIGH <=> button off
} // & LOW <=> button on
return (nb<5) ; //
}
static int ptPoussoir(struct pt *pt) {
static unsigned long started =0;
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, capterPoussoir() ); // appel fonction anti rebonds
cycle=true; nb_cycles++; // c’est parti pour un tour
if (nb_cycles == deb_cycle_ko ) degrade = true; // mode dégradé actif
started=millis();
PT_WAIT_UNTIL(pt, millis() - started > periode ); // test fin de cycle
cycle=false; // signale la fin aux autres PT
}
PT_END(pt);
} // ptPoussoir
static int ptVerteD(struct pt *pt, int duree) // Verte en mode dégradé
{
static unsigned long ttl = 0;
PT_BEGIN(pt);
while ( degrade ) {
ttl = millis() + duree ;
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(VERTE, !digitalRead(VERTE));
}
PT_END(pt);
} // VerteD
static int ptVerteC(struct pt *pt) // Verte en mode compte à rebours
{
static uint16_t ratio = 0;
static unsigned long ttl = 0;
PT_BEGIN(pt);
while (! degrade && cycle ) {
ratio = map(nb_cycles, 0, 254, 254, 0);
ledPWM(VERTE, ratio);
ttl = millis() + periode ;
PT_WAIT_UNTIL(pt, millis() > ttl);
}
PT_END(pt);
} // VerteC
static int ptJaune(struct pt *pt, uint16_t offset, uint16_t duree )
{
static unsigned long ttl = 0;
PT_BEGIN(pt);
while( ! degrade && cycle ) {
ttl = millis() + offset ;
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(JAUNE, HIGH);
ttl = millis() + duree ;
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(JAUNE, LOW);
PT_WAIT_UNTIL(pt, ! cycle );
}
PT_END(pt);
} // Jaune
static int ptBleue(struct pt *pt, uint16_t offset, uint16_t duree )
{
static unsigned long ttl = 0;
PT_BEGIN(pt);
while( ! degrade && cycle ) {
ttl = millis() + offset ;
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(BLEUE, HIGH);
ttl = millis() + duree ;
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(BLEUE, LOW);
PT_WAIT_UNTIL(pt, ! cycle );
}
PT_END(pt);
} // bleue
static int ptVarRouge(struct pt *pt, int debut, int fin, int inc, int palier)
{
static int i=0 ; // static unsigned long ttl = 0;
PT_BEGIN(pt);
ledPWM(ROUGE, debut) ;
do {
PT_DELAY(pt, palier);
i=i+inc;
ledPWM(ROUGE, i) ;
} while (i != fin );
PT_END(pt);
} // gestion PWM rouge
static int ptRouge(struct pt *pt, uint16_t debut, uint16_t plafond, uint16_t fin)
{
static unsigned long ttl = 0;
PT_BEGIN(pt);
while ( cycle ) {
ttl = millis() + debut ;
PT_WAIT_THREAD(pt, ptVarRouge(&ptRv,0,254,1,7));
PT_WAIT_UNTIL(pt, millis() > ttl);
ttl = millis() + plafond ;
digitalWrite(ROUGE, HIGH);
PT_WAIT_UNTIL(pt, millis() > ttl);
ttl = millis() + fin ;
PT_WAIT_THREAD(pt, ptVarRouge(&ptRv,254,0,-1,7));
PT_WAIT_UNTIL(pt, millis() > ttl);
digitalWrite(ROUGE, LOW);
PT_WAIT_UNTIL(pt, ! cycle );
}
PT_END(pt);
} // rouge
void loop() {
int r1=3000, r2=1000, r3=3000, j1=1500, j2=2000, b1=2000, b2=3000;
ptPoussoir(&ptP); // proto thread gestion appui poussoir
ptRouge(&ptR,r1,r2,r3); // proto thread cycle Rouge
ptJaune(&ptJ,j1,j2); // proto thread cycle jaune
ptBleue(&ptB,b1,b2); // proto thread cycle Bleue
ptVerteC(&ptVc); // proto thread Verte compte à rebours
ptVerteD(&ptVd,500); // proto thread Verte mode dégradé
}