Librairie Timer qui ne veut plus "timer" sans téleverser (O_o)

Bonjour,

Comme c'est mon premier message sur ce forum, je me présente un chouille : Julien, 30 ans du Tarn.

Je débute avec arduino et peut être que je passe à coté de quelque chose car j'ai un soucis que je classe dans la catégorie "bisarerie bisard".

Je me suis procuré un arduino mini pro et un programmateur FTDI qui va bien et j'ai réalisé mon premier programme qui quand je le téléverse, fonctionne exactement comme je le souhaite. Si je débranche le programmateur et que je le rebranche (simplement pour alimenter mon montage), le sketch démarre normalement mais j'ai l'impresion que le timer se bloque et comme tout est basé sur lui, tout est bloqué...

Au niveau composants, actuellement j'ai 5 leds (que je vais remplacer par des cartes de puissance plus tard) et un bouton poussoir avec un anti rebond materiel.

Voici mon code :

#include "Timer.h"

Timer t;

int led = 13;
int brassage_1 = 4;
int brassage_2 = 5;
int distribution_1 = 6;
int distribution_2 = 7;
int capteur_niveau = 9;
int vidange = 10;

int bouton_mode = 2;
int bac_2 = 8;

int mode = 0;
int scenario = 0;

int temps_distribution = 5;
int nb_distribution = 3;
int temps_pause_distribution = 20;
int temps_capteur_niveau = 30;

int nb_courant = 0;
int temps_courant = 0;
int bac_2_valeur = HIGH;
int capteur_courant = 0;

int ledEvent;

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(brassage_1, OUTPUT);
  pinMode(brassage_2, OUTPUT);
  pinMode(distribution_1, OUTPUT);
  pinMode(distribution_2, OUTPUT);
  pinMode(vidange, OUTPUT);
  
  pinMode(bouton_mode, INPUT_PULLUP); 
  pinMode(bac_2, INPUT_PULLUP); 
  pinMode(capteur_niveau, INPUT); 
  
  attachInterrupt(0, action_manuelle, FALLING);
  t.every(1000, time);
}

void loop()
{
  t.update();
}

void action_manuelle()
{
  switch(mode)
  {
   case 0:  // Off
     bac_2_valeur = digitalRead(bac_2);
     t.stop(ledEvent);
     ledEvent = t.oscillate(led, 1000, LOW);
     digitalWrite(brassage_1, HIGH);
     if(bac_2_valeur == LOW)
     {
       digitalWrite(brassage_2, HIGH);
     }
     mode = 1;
     break; 
   case 1:  // Brassage
     t.stop(ledEvent);
     ledEvent = t.oscillate(led, 100, LOW);
     digitalWrite(brassage_1, LOW);
     if(bac_2_valeur == LOW)
     {
       digitalWrite(brassage_2, LOW);
     }
     nb_courant = nb_distribution;
     scenario = 1;
     mode = 2;
     break; 
  }
    
}

void time() { // debut de la fonction d'interruption Timer2
  
  if(temps_courant == 0)
  {
    switch(scenario)
    {
     case 1: // allume la distribution 1
       digitalWrite(distribution_1, HIGH);
       temps_courant = temps_distribution;
       scenario = 2;
       break;
     case 2: // eteint la distribution 1
       digitalWrite(distribution_1, LOW);
       if(nb_courant == 0)
       {
         if(bac_2_valeur == LOW)
         {
           scenario = 3;
           nb_courant = nb_distribution;
         }else{
           scenario = 5; 
         }
       }else{
         scenario = 1;
         nb_courant = nb_courant - 1;
       }
       temps_courant = temps_pause_distribution;
       break;
   
     
     case 3: // allume la distribution 2
       digitalWrite(distribution_2, HIGH);
       temps_courant = temps_distribution;
       scenario = 4;
       break;
     case 4: // eteint la distribution 2
      digitalWrite(distribution_2, LOW);
       if(nb_courant == 0)
       {
           scenario = 5; 
       }else{
         scenario = 3;
         nb_courant = nb_courant - 1;
       }
       temps_courant = temps_pause_distribution;
       break;
     case 5:
       t.stop(ledEvent);
       t.oscillate(led, 5000, LOW);
       mode = 0;
       scenario = 6;
       break;
  
    } 
  }else{
    temps_courant = temps_courant - 1;
  }
  
  int capteur_niveau_valeur = digitalRead(capteur_niveau);
  if(capteur_niveau_valeur == HIGH)
  {
    capteur_courant = temps_capteur_niveau; 
    digitalWrite(vidange, HIGH);
  }
  
  if(capteur_courant == 0)
  {
    digitalWrite(vidange, LOW); 
  }else{
    capteur_courant = capteur_courant - 1; 
  }
  
}

J'ai juste jeté un oeil 2 minutes sur le code sans essayer de le comprendre.
Déjà il y a quelque chose qui me choque. Il y a 6 broches déclarées en sortie dans le setup et pour aucune d'elle il n'y a un digitalWrite() afin de fixer un état par défaut.

Dans le case 1: // Brassage à la fin tu affectes à mode une valeur qui ne branche sur une action qui n'existe pas dans le switch case actuel

Salut fdufnews

Oui en effet, je n'avais pas eu besoin d'assigner l'état de mes sorties par défaut car j'utilisais des led et ça fonctionnait bien ainsi.
Maintenant j'ai cablé ds cartes relais et j'ai eu besoin d'assigner l'état haut pour que les relais restent éteint au lancement.

Pour la variable qui ne pointe nul part c'est pour paralyser l'interruption du bouton poussoir seulement au second appuis le temps qu'une suite d'action pulser par le timer se déroulent, cette variable est remis à zéro à la fin de mes actions pour libérer le bouton poussoir.

J'ai résolu mon problème en utilisant millis() à la place du timer mais je souhaite comprendre pourquoi cette version de mon code fonctionne quand je téléverse et ne fonctionne plus quand j'alimente lle montage

koala:
Si je débranche le programmateur et que je le rebranche (simplement pour alimenter mon montage), le sketch démarre normalement mais j'ai l'impresion que le timer se bloque et comme tout est basé sur lui, tout est bloqué...

As-tu vérifié la tension lorsque tu alimentes ta carte sans le programmateur?