Timer ne fonctionne pas !!!

#include “Timer.h” // Version 2.1

Timer t;

int ledInit, ledCal, ledMeas;
long PERIOD=200;
const int RED=4,GREEN=7,BLUE=8;

void setup()
{
Serial.begin(9600);
delay(100);

pinMode(RED,OUTPUT);
pinMode(GREEN,OUTPUT);
pinMode(BLUE,OUTPUT);

testleds();
initialisation(); delay(5000);
calibration(); delay(5000);
measurements(); delay(5000);
endofprogram();
}
void loop()
{
t.update();
}
void testleds()
{
digitalWrite(RED,HIGH); delay(500); digitalWrite(RED,LOW); delay(500);
digitalWrite(GREEN,HIGH); delay(500); digitalWrite(GREEN,LOW); delay(500);
digitalWrite(BLUE,HIGH); delay(500); digitalWrite(BLUE,LOW); delay(500);
}
void initialisation()
{
ledInit=t.oscillate(RED,PERIOD,HIGH);
Serial.print(“INITIALISATION : “);
for (byte i=0;i<=9;i++) {Serial.print(i); delay(1000);}
Serial.println(” Initialisation terminée”);
t.stop(ledInit);
}
void calibration()
{
ledCal=t.oscillate(GREEN,PERIOD,HIGH);
Serial.println("CALIBRATION : ");
for (byte i=0;i<=9;i++) {Serial.println(millis()); delay(1000);}
Serial.println(“Calibration terminée”);
t.stop(ledCal);
}
void measurements()
{
ledMeas=t.oscillate(BLUE,PERIOD,HIGH);
Serial.println("MESURES : ");
for (byte i=0;i<=9;i++) {Serial.println(millis()); delay(1000);}
Serial.println(“Mesures terminées”);
t.stop(ledMeas);
}
void endofprogram()
{
Serial.println(“FIN DU PROGRAMME”);
digitalWrite(RED,LOW);
digitalWrite(GREEN,LOW);
digitalWrite(BLUE,LOW);
}

Bonjour,
je ne m’en sorts pas avec ce casse-tête !!!
Les infos sont correctement affichées sur le moniteur série mais impossible de faire clignoter :

  • la LED rouge uniquement pendant la procédure “Initialisation”,
  • la LED verte uniquement pendant la procédure “Calibration”,
  • la LED bleue uniquement pendant la procédure “Measurement”.
    En fait, les LEDs s’allument en continu au court des procédures mais ne clignotent pas comme prévu.
    A la fin du programme, les LEDs s’éteignent bien grâce aux 3 “digitalWrite()” autrement elles restent allumées.
    Merci pour votre aide
    owkenobi

Comment dit on “code tags”, en français?

@AWOL on dit "balise de code"

fdufnews:
@AWOL on dit “balise de code”

Merci

TheMemberFormerlyKnownAsAWOL:
Comment dit on “code tags”, en français?

Cela peut aussi se dire [Bien editer son post pour les nuls](http://Comment dit on)

Bonjour,

Dans tes fonctions initialisation, calibration, ... tu as des delay(), donc la fonction t.update() n'est pas appelée pendant l’exécution de la fonction. Donc ça ne peut pas fonctionner.

De plus comme on n'est pas sorti du setup(), loop() n'est pas appelé

Comme indiqué précédemment mets ton code entre balises de code.

Je ne connais pas la bibliothèque timer, est-ce celle-ci (J. Christensen) ?

La seule chose que je voie, c'est que la méthode oscillate renvoie un int8_t pas un int.

int8_t oscillate(uint8_t pin, unsigned long period, uint8_t startingValue);

De même, stop prend aussi un int8_t en argument :

void stop(int8_t id);

Mais je ne sais pas si ça suffit à expliquer le problème.

on dirait que @owkenobi en parti en congés…
@kamill a donné la bonne réponse

la fonction fait en gros:

activation du timer: ledInit=t.oscillate(RED,PERIOD,HIGH);
un bout de code qui prend 10 secondes mais sans appel à t.update() donc le timer ne fait rien

  Serial.print("INITIALISATION : ");
  for (byte i=0;i<=9;i++) {Serial.print(i); delay(1000);}
  Serial.println(" Initialisation terminée");

puis arrêt du timer t.stop(ledInit);

comme c’est noël… un truc du genre

void initialisation()
{
  ledInit=t.oscillate(RED,PERIOD,HIGH);
  Serial.print("INITIALISATION : ");
  uint32_t chronoDebut = millis();
  while (millis() - chronoDebut < 10000) {
    t.update();
  }
  Serial.println(" Initialisation terminée");
  t.stop(ledInit);
}

pourrait faire l’affaire. s’il faut afficher un décompte, il faut rajouter un petit bout de code qui compte les secondes sans faire de delay()