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
}
}
}