Projet qui ne marche pas. Help me please

Bonjour,
Lors de la programation de mon projet j'ai rencontré un problème sur lequel j'ai passé une semaine, et que je n'ai toujours pas réussi à résoudre.
Voici une présentation du programme.
Le système est composé de deux boitiers, l'un qui commande, et l'autre qui ne fait que s'allumer quand celui qui commande lui dit.
Ils communiquent par xbee.

FP1 : Minuteur et réveil automatique de l’équipage en cas de problème, principe de l’homme mort

FP2 : Alarme de cap avec plage paramétrable et affichage sur un boîtier déporté visible sans avoir à descendre

FP3 : Réveiller l’équipage en cas de chute à la mer

Alarme à acquitter toutes les 5, 10, 30 secondes
Déclenchement de l’alarme sur le boitier 2 (l'esclave) et acquitement de l'alarme sur le boitier 1
Une sonnerie se déclenche dans le bateau si on n’acquitte pas l’alarme

Déclenchement d’une première alarme externe durant 30 secondes en cas de perte de communication avec le boitier externe
Si au bout de 30 secondes la communication n’a pas été rétablie, l’alarme est sonnée (buzzer)

Une fois sur le bon cap, l’arduino enregistre le cap fourni par le GPS
Le système prévient lorsque le cap dépasse la plage de tolérance (entre 5 et 15°)
Si l’écart est supérieur à 15°, un buzzer se déclenche pour alerter l’homme de quart

Le problème est que le programme allume juste la led_mob et bloque, alors qu'il devrait ne pouvoir l'allumer qu'après 30 secondes!

#include <TinyGPS++.h>
#include <Time.h>
#include <TimeAlarms.h>

/*
  Liste des sorties:
  -rouge en A5
  -verte en A4
  -interrupteur cap en 2
  -boutons definition du cap en 3*/

int led_mob = A5;          //val mob
char r;
int buzzer = A1;



int led = 13;                  //val minuteur
const int bouton_pin = A0;
const int on_off_pin = A2;
int on_off = 0;
boolean off = false;
int voila = 0;
int tps = 15;
int tps_5_pin = 3;
int tps_15_pin = 4;
int tps_30_pin = 5;
int output_val_haute = 6;
boolean tps_5 = false;
boolean tps_15 = false;
boolean tps_30 = false;

int minuteur;




                //val cap

// A sample NMEA stream.
char *gpsStream = 
  "$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n"
  "$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n"
  "$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n"
  "$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000*6C\r\n"
  "$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A*7D\r\n"
  "$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000*6F\r\n"
  "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62\r\n"
  "$GPRMC,160050.05,A,1132.989,N,04344.236,E,300.00,4.96,110213,0.0,E*5E\r\n"
  "$GPRMC,160055.12,A,1133.404,N,04344.230,E,300.00,355.32,110213,0.0,E*5B\r\n"
  "$GPRMC,160026.73,A,1131.081,N,04344.067,E,300.00,4.96,110213,0.0,E*5A\r\n"
  "$GPRMC,160103.23,A,1134.068,N,04344.174,E,300.00,355.32,110213,0.0,E*51\r\n";
  
  
  // The TinyGPS++ object
TinyGPSPlus gps;
double ecart = 10;   //écart de cap
double cap = 349;   //cap à suivre 
double cog;          //cap suivi
double lmtplus;        //limite haute
double lmtmoins;        //limite basse
int ledv_cap_pin = A4;             //port LED
int ledr_cap_pin = A5;
int ledj_cap_pin = A3;
const int bouton_cap_pin = 2;
const int reset_pin = 3;

int tps_mob = 30;


void setup() {
  pinMode(buzzer, OUTPUT);      
  pinMode(led_mob, OUTPUT);        //LED mob
  
  
   Serial.begin(4800);              // initialisation cap
 pinMode(ledv_cap_pin, OUTPUT); 
 pinMode(ledr_cap_pin, OUTPUT); 
  pinMode(bouton_cap_pin, INPUT);
  digitalWrite(bouton_cap_pin, HIGH);
  pinMode(reset_pin, INPUT);
  digitalWrite(reset_pin, HIGH);


pinMode(output_val_haute, OUTPUT);        // initialisation minuteur
 digitalWrite(output_val_haute, HIGH);
 pinMode(tps_5_pin, INPUT);
 pinMode(tps_15_pin, INPUT);
 pinMode(tps_30_pin, INPUT);
  pinMode(bouton_pin, INPUT);
  digitalWrite(bouton_pin, HIGH);
  
  pinMode(on_off_pin, INPUT);
  digitalWrite(on_off_pin, HIGH);  
  
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);

  setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
  temps();
  Alarm.timerOnce(tps, OnceOnly); 
 AlarmId voila = Alarm.timerOnce(tps, OnceOnly); 
}

void loop() {
  r = Serial.read();                        
  if(r == 'r')
  {   }
  else
  { Serial.write("h");
   Alarm.timerOnce(tps_mob, MOB);
   }
  r = 0;
  
  if (gps.encode(*gpsStream++))
       displayInfo();
        
        
        
        
   on_off = digitalRead(on_off_pin); //minuteur
  if(on_off == 0)
  {Alarm.disable(voila);
  off = true;  }
  else if (off == true)  {
    off= false;
    temps();
  }
  
  Alarm.delay(1000); // ne JAMAIS supprimer
  delay(500);
  }







void displayInfo()
{  
  
   lmtmoins = cap-ecart;
   lmtplus = cap+ecart;
   cog = gps.course.deg(); //affecte le COG NMEA à la variable cog
    boutons();
  
  //convertion 360 
    if (lmtplus >= 360)
   { lmtplus = lmtplus-360;
     }
   if (lmtmoins < 0)
   {lmtmoins = lmtmoins+360;
     }
   
   //boucles de test
   if (lmtmoins<lmtplus && cog<lmtplus && cog>lmtmoins)
      {digitalWrite(ledj_cap_pin, HIGH);
      digitalWrite(ledr_cap_pin, LOW);
      digitalWrite(ledv_cap_pin, LOW);      
    }
   else if (lmtplus<lmtmoins && cog>lmtmoins && cog>lmtplus)
       {digitalWrite(ledj_cap_pin, HIGH);
      digitalWrite(ledr_cap_pin, LOW);
      digitalWrite(ledv_cap_pin, LOW);}
   else if (lmtplus<lmtmoins && cog<lmtmoins && cog<lmtplus) 
       {digitalWrite(ledj_cap_pin, HIGH);
      digitalWrite(ledr_cap_pin, LOW);
    digitalWrite(ledv_cap_pin, LOW);} 
   else                                   // a finir
       { 
         if(cog < cap )
      digitalWrite(ledj_cap_pin, LOW);}
      delay(1000);
    }
    
    
    
    
    void boutons()
    {int val_2 = digitalRead(bouton_cap_pin);
      int val_3 = digitalRead(reset_pin);
       if(val_2 == HIGH)
       {   ecart = 5; }
       else
       {   ecart = 10;  }       
       if(val_3 == LOW)
       {  cap = cog = gps.course.deg();  }
    }



void OnceOnly(){
       digitalWrite(led, HIGH);
  
      minuteur = digitalRead(bouton_pin);
      Serial.write("m");
      while ( minuteur != 0)
      {
        minuteur = digitalRead(bouton_pin);
      digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(400); 
      }
       
      temps();
      AlarmId voila = Alarm.timerOnce(tps, OnceOnly);
   
    }
    
    
void temps()
{
  tps_5 = digitalRead(tps_5_pin);
  tps_15 = digitalRead(tps_15_pin);
  tps_30 = digitalRead(tps_30_pin);
  
  if (tps_5 == HIGH)
  {  tps = 5;  }
  if (tps_15 == HIGH)
  {  tps = 15;  }
  if (tps_30 == HIGH)
  {  tps = 30;  }
}

void MOB ()
{
  r = Serial.read();                        
  if(r == 'r')
  {   }
  else
  { while (r =! 'r')
  {
    digitalWrite(led_mob, HIGH);
   r = Serial.read(); 
   digitalWrite(buzzer, HIGH); // buzzer
  }
  }
  
}

Waa on devrait mettre ça en post-it : Indentez correctement !

Bon, après une rapide aide de mon IDE habituel (Qt Creator) pour tout remettre en forme il y a 2 problème que j'ai rapidement trouvé :

  • Deux variables pointant vers le même pin
int led_mob = A5;          //val mob
int ledr_cap_pin = A5;
  • La double déclaration de la variable voila (qui d'ailleurs est un très mauvais nom pour une variable, ça ne veut rien dire)
int voila = 0;
    AlarmId voila = Alarm.timerOnce(tps, OnceOnly);

Ce qui rend la ligne suivante inutile :

        Alarm.disable(voila);

A mon avis tu veux faire ça :

AlarmId voila = 0;
    voila = Alarm.timerOnce(tps, OnceOnly);

Voici le code inchangé mais indenté à la manière K&R, 4 espaces par indentation il me semble que l'IDE arduino n'en met que deux mais bon, c'est toujours plus facile à lire quand c'est bien indenté :

#include <SPI.h> //Inclure la bibliothèque SPI
#include <Ethernet.h> //Inclure la bibliothèque Ethernet

#define TIME_INTERVAL 60000

byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xAA, 0xF8 }; // Adresse MAC du shield (à modifier)


EthernetServer server(80); //Initialise le serveur Ethernet, port 80 par défaut pour HTTP

#include <TinyGPS++.h>
#include <Time.h>
#include <TimeAlarms.h>

/*
  Liste des sorties:
  -rouge en A5
  -verte en A4
  -interrupteur cap en 2
  -boutons definition du cap en 3*/

int led_mob = A5;          //val mob
char r;
int buzzer = A1;



int led = 13;                  //val minuteur
const int bouton_pin = A0;
const int on_off_pin = A2;
int on_off = 0;
boolean off = false;
int voila = 0;
int tps = 15;
int tps_5_pin = 3;
int tps_15_pin = 4;
int tps_30_pin = 5;
int output_val_haute = 6;
boolean tps_5 = false;
boolean tps_15 = false;
boolean tps_30 = false;

int minuteur;




//val cap

// A sample NMEA stream.
char *gpsStream =
        "$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n"
        "$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n"
        "$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n"
        "$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000*6C\r\n"
        "$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A*7D\r\n"
        "$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000*6F\r\n"
        "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62\r\n"
        "$GPRMC,160050.05,A,1132.989,N,04344.236,E,300.00,4.96,110213,0.0,E*5E\r\n"
        "$GPRMC,160055.12,A,1133.404,N,04344.230,E,300.00,355.32,110213,0.0,E*5B\r\n"
        "$GPRMC,160026.73,A,1131.081,N,04344.067,E,300.00,4.96,110213,0.0,E*5A\r\n"
        "$GPRMC,160103.23,A,1134.068,N,04344.174,E,300.00,355.32,110213,0.0,E*51\r\n";


// The TinyGPS++ object
TinyGPSPlus gps;
double ecart = 10;   //écart de cap
double cap = 349;   //cap à suivre
double cog;          //cap suivi
double lmtplus;        //limite haute
double lmtmoins;        //limite basse
int ledv_cap_pin = A4;             //port LED
int ledr_cap_pin = A5;
int ledj_cap_pin = A3;
const int bouton_cap_pin = 2;
const int reset_pin = 3;

int tps_mob = 30;


void setup() {
    pinMode(buzzer, OUTPUT);
    pinMode(led_mob, OUTPUT);        //LED mob


    Serial.begin(4800);              // initialisation cap
    pinMode(ledv_cap_pin, OUTPUT);
    pinMode(ledr_cap_pin, OUTPUT);
    pinMode(bouton_cap_pin, INPUT);
    digitalWrite(bouton_cap_pin, HIGH);
    pinMode(reset_pin, INPUT);
    digitalWrite(reset_pin, HIGH);


    pinMode(output_val_haute, OUTPUT);        // initialisation minuteur
    digitalWrite(output_val_haute, HIGH);
    pinMode(tps_5_pin, INPUT);
    pinMode(tps_15_pin, INPUT);
    pinMode(tps_30_pin, INPUT);
    pinMode(bouton_pin, INPUT);
    digitalWrite(bouton_pin, HIGH);

    pinMode(on_off_pin, INPUT);
    digitalWrite(on_off_pin, HIGH);

    pinMode(led, OUTPUT);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);

    setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
    temps();
    Alarm.timerOnce(tps, OnceOnly);
    AlarmId voila = Alarm.timerOnce(tps, OnceOnly);
}

void loop() {
    r = Serial.read();
    if(r != 'r') {
        Serial.write("h");
        Alarm.timerOnce(tps_mob, MOB);
    }
    r = 0;

    if (gps.encode(*gpsStream++))
        displayInfo();




    on_off = digitalRead(on_off_pin); //minuteur
    if(on_off == 0) {
        Alarm.disable(voila);
        off = true;
    } else if (off == true) {
        off = false;
        temps();
    }

    Alarm.delay(1000); // ne JAMAIS supprimer
    delay(500);
}







void displayInfo()
{

    lmtmoins = cap-ecart;
    lmtplus = cap+ecart;
    cog = gps.course.deg(); //affecte le COG NMEA à la variable cog
    boutons();

    //convertion 360
    if (lmtplus >= 360) {
        lmtplus = lmtplus-360;
    }
    if (lmtmoins < 0) {
        lmtmoins = lmtmoins+360;
    }

    //boucles de test
    if (lmtmoins<lmtplus && cog<lmtplus && cog>lmtmoins) {
        digitalWrite(ledj_cap_pin, HIGH);
        digitalWrite(ledr_cap_pin, LOW);
        digitalWrite(ledv_cap_pin, LOW);
    }
    else if (lmtplus<lmtmoins && cog>lmtmoins && cog>lmtplus) {
        digitalWrite(ledj_cap_pin, HIGH);
        digitalWrite(ledr_cap_pin, LOW);
        digitalWrite(ledv_cap_pin, LOW);
    } else if (lmtplus<lmtmoins && cog<lmtmoins && cog<lmtplus) {
        digitalWrite(ledj_cap_pin, HIGH);
        digitalWrite(ledr_cap_pin, LOW);
        digitalWrite(ledv_cap_pin, LOW);
    } else { // a finir
        if(cog < cap)
            digitalWrite(ledj_cap_pin, LOW);
    }
    delay(1000);
}




void boutons()
{
    int val_2 = digitalRead(bouton_cap_pin);
    int val_3 = digitalRead(reset_pin);
    if(val_2 == HIGH) {
        ecart = 5;
    } else {
        ecart = 10;
    }
    if(val_3 == LOW) {
        cap = cog = gps.course.deg();
    }
}



void OnceOnly(){
    digitalWrite(led, HIGH);

    minuteur = digitalRead(bouton_pin);
    Serial.write("m");
    while ( minuteur != 0)
    {
        minuteur = digitalRead(bouton_pin);
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(400);
    }

    temps();
    AlarmId voila = Alarm.timerOnce(tps, OnceOnly);

}


void temps()
{
    tps_5 = digitalRead(tps_5_pin);
    tps_15 = digitalRead(tps_15_pin);
    tps_30 = digitalRead(tps_30_pin);

    if (tps_5 == HIGH)
    {  tps = 5;  }
    if (tps_15 == HIGH)
    {  tps = 15;  }
    if (tps_30 == HIGH)
    {  tps = 30;  }
}

void MOB ()
{
    r = Serial.read();
    if(r == 'r')
    {   }
    else
    { while (r =! 'r')
        {
            digitalWrite(led_mob, HIGH);
            r = Serial.read();
            digitalWrite(buzzer, HIGH); // buzzer
        }
    }
}