Contrôler un feu rouge avec un module SIM 900

Bonjour,
Voici mon premier poste sur le forum parce que là je suis vraiment au fond du trou et je n'arrive pas à avancer !
J'ai un projet avec une ville pour contrôler un feu rouge à distance (1.5 km environ) pour une course de caisse à savon (Lien pour ceux qui connaissent pas). Donc j'ai deux boitiers, un pour controler le feu via des boutons et un branché sur le feu.
Lorsque l'utilisateur appui sur le bouton START, le message part, le feu passe au vert avec des relais, et on reçoit un message pour bien confirmer que le feu s'est allumé. Une fois que la voiture passe la ligne d'arrivée, on appuie sur le bouton arrivée, puis le temps au chronomètre s'affiche sur 4 afficheurs 7 segments mais pour cette partie tout fonctionne. Puis un bouton reset pour une nouvelle course (feu rouge + chrono à 0).
Voilà mon pseudo - code:

  • Appui sur START
  • On prend le temps avec la fonction millis
  • On affiche 0000 sur l'afficheur
  • Attente du message retour du feu
  • On prend un nouveau temps avec millis (comme ça on connait le temps que met un sms à faire un aller retour)
  • on allume un led pour confirmer que le feu s'est bien allumé
  • Si on appui sur le bouton arrivée, on affiche le temps final

Dans mon boitier commande :

  • Arduino Mega
  • Module SIM900
  • Afficheurs
  • 3 boutons
  • led de vérifications

Dans mon boitier feu :

  • Arduino Mega
  • Module SIM900
  • 4 relais pour contrôler le feu

Donc tout fonctionne quand on appui sur le bouton start, le message part bien mais je n'arrive pas à recevoir le message retour... j'ai tout essayé mais je ne trouve pas...

Voici le programme du boitier de commande :

//MODULE GSM________________________________________________________________

#include <SoftwareSerial.h> 
char inchar;                      // caractère arrivant par SMS 
SoftwareSerial SIM900(10, 11);      // ouverture du port série (Rx, Tx)
int verif;

//afficheur__________________________________________________________________

int digit1 = 43; //PWM Display pin 1
int digit2 = 41; //PWM Display pin 2
int digit3 = 39; //PWM Display pin 6
int digit4 = 37; //PWM Display pin 8

int segA = A1; //Display pin 14
int segB = 25; //Display pin 16
int segC = 31; //Display pin 13
int segD = 42; //Display pin 3
int segE = A0; //Display pin 5
int segF = 33; //Display pin 11
int segG = 27; //Display pin 15

int point = 38; //Display pin 7

#define DISPLAY_BRIGHTNESS  500
  
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW

//BOUTONS____________________________________________________________________

const int ARRIV_BP = 6; 
const int RESET_BP = 7; 
const int START_BP = 8; 

int E_START = 0;  
int E_RESET = 0; 
int E_ARRIV = 0;    

//TEMPS______________________________________________________________________

float t1;
float t2;
int t3;
float latence;

//indicateur feu_____________________________________________________________

int led_verif = 52;

void setup() {
  
  //afficheur__________________________________________________________________

  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);

  pinMode(digit1, OUTPUT);
  pinMode(digit2, OUTPUT);
  pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT);

  pinMode(point, OUTPUT);
  pinMode(13, OUTPUT);

  //MODULE GSM________________________________________________________________
  
  Serial.begin(19200);                  //port série sur 19200 bauds
  SIM900power();                        //allumage du module
  SIM900.begin(19200);
  for(int launch = 0 ; launch < 9999 ; launch++)
  {
    displayNumber(launch);
    delayMicroseconds(5);   
  }
  SIM900.print("AT+CMGF=1\r");          //allumage du mode sms
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r");  //vide la mémoire tampon sms
  delay(100);

  //BOUTONS____________________________________________________________________
  
  pinMode(START_BP, INPUT);
  pinMode(RESET_BP, INPUT);  
  pinMode(ARRIV_BP, INPUT);

  //indicateur feu_____________________________________________________________

  pinMode(led_verif, OUTPUT);
  digitalWrite(led_verif, LOW);

}

void loop() {
  
  do {E_START = digitalRead(START_BP);} while(E_START == 0);
    Serial.println("5");
    t1 = millis();
    displayNumber(0000);
    envoi_sms();
    mode_sms();
    verif = 1;
    while(verif==1)
    {
    if(SIM900.available() >0)
    {
    digitalWrite(led_verif, HIGH);
    inchar = SIM900.read();  
    verif = 0;
    }
    }
    if (inchar == 79){
      digitalWrite(led_verif, LOW);
      latence = (t2-t1)/200;
      displayNumber(latence);
      do {
      E_ARRIV = digitalRead(ARRIV_BP);
      displayNumber((millis()- t1)/100 + latence);
      } while(E_ARRIV == 0);
      t2 = millis();
      t3 = (t2-t1)/100+latence;
      }
    do {
    E_RESET = digitalRead(RESET_BP);
    displayNumber(t3);
    } while(E_RESET == 0);
      

}

void envoi_sms()
{
 
SIM900.print("AT+CMGF=1\r"); 
delay(100);
SIM900.println("AT+CMGS=\"+33661169689\""); 
delay(100);
SIM900.println("S"); 
delay(100);
SIM900.println((char)26);
delay(100);
SIM900.println();
delay(5000); 

}

void mode_sms()
{
  
SIM900.print("AT+CMGF=1\r"); 
delay(100);
SIM900.print("AT+CNMI=2,2,0,0,0\r");
delay(1000);

}

void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(7000);
  
}

Voici le programme du feu :

//MODULE GSM________________________________________________________________

#include <SoftwareSerial.h> 
char inchar;                      // caractère arrivant par SMS 
SoftwareSerial SIM900(10, 11);      // ouverture du port série (Rx, Tx)
int verif;

//relais________________________________________________________________

#define R_rouge 4    //rouge
#define R_jaune 3    //orange
#define R_vert 2    //vert

void setup() {
  
  //RELAIS_____________________________________________________________________

  pinMode(R_rouge, OUTPUT);
  pinMode(R_jaune, OUTPUT);
  pinMode(R_vert, OUTPUT);
  digitalWrite(R_rouge, LOW);
  delay(500);
  digitalWrite(R_rouge, HIGH);
  digitalWrite(R_jaune, LOW);
  delay(500);
  digitalWrite(R_jaune, HIGH);
  digitalWrite(R_vert, LOW);
  delay(500);
  digitalWrite(R_vert, HIGH);

  //MODULE GSM________________________________________________________________
  
  Serial.begin(19200);                  //port série sur 19200 bauds
  SIM900power();                        //allumage du module
  SIM900.begin(19200);
  delay(15000);                 //donne le temps au module de se loguer
  SIM900.print("AT+CMGF=1\r");          //allumage du mode sms
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r");  //vide la mémoire tampon sms
  delay(100);
  
}

void loop() {
  verif = 1;
    while(verif==1)
    {
    if(SIM900.available() >0)
    {
    inchar = SIM900.read();  
    verif = 0;
    }
    envoi_sms();
    if (inchar == 83){
      digitalWrite(R_rouge, LOW);
      delay(5000);
      digitalWrite(R_rouge, HIGH);
      digitalWrite(R_jaune, LOW);
      delay(1500);
      digitalWrite(R_jaune, HIGH);
      digitalWrite(R_vert, LOW);
      delay(5000);
      digitalWrite(R_vert, HIGH);
      delay(10000);
    }
    
    digitalWrite(R_rouge, HIGH);
    digitalWrite(R_jaune, HIGH);
    digitalWrite(R_vert, HIGH);
  
    }

}

void envoi_sms()
{
 
SIM900.print("AT+CMGF=1\r"); 
delay(100);
SIM900.println("AT+CMGS=\"+33786443943\""); 
delay(100);
SIM900.println("O"); 
delay(100);
SIM900.println((char)26);
delay(100);
SIM900.println();
delay(5000); 
}

void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(7000);
}

Si vous m'aidez à trouver une solution je vous ferai un GROS GROS bisous parce que là j'avance pas et je sature un peu :o

MERCI !

bonjour
Je n'ai pas compris comment tu espere là, faire/obtenir une origine de temps de depart fiable
en aucun cas tu n'aura connaissance des temps de transit d'un sms et donc de la datation.

si "la course" est suffisament longue en durée , un idée serait peut etre d'inclure sur le sms "retour" la datation du passage au feu vert (GPS AMHA) , et comparer/verifier à l'arrivée les temps

Bonjour,
J'y avais pensé mais avait finalement abandonné ! En fait je prends le temps sur le boitier commande lors de l'envoi du sms, dès que le second boitier reçoit ce sms il fait passer le feu au vert et il renvoi immédiatement la confirmation. Le premier boitier prend un second temps lors de la réception de ce message retour. Je comptais faire la différence entre le temps 1 et le temps 2 puis le diviser par 2 ce qui me donne le temps (approximatif) entre l'appui du bouton START et l'allumage du feu
Les courses feront environ 1 minute 30 je pense

Miniradi:
Bonjour,
J'y avais pensé mais avait finalement abandonné ! En fait je prends le temps sur le boitier commande lors de l'envoi du sms, dès que le second boitier reçoit ce sms il fait passer le feu au vert et il renvoi immédiatement la confirmation. Le premier boitier prend un second temps lors de la réception de ce message retour. Je comptais faire la différence entre le temps 1 et le temps 2 puis le diviser par 2 ce qui me donne le temps (approximatif) entre l'appui du bouton START et l'allumage du feu
Les courses feront environ 1 minute 30 je penses

dans ton optique , il n'y a jamais de garantie de temporalité, tu es tributaire de tiers non fiable
quelle precision et resolution souhaite tu pour la chronométrie finale ?

Pour la précision, à 2/3 secondes près c'est bon, c'est une course dans un petit village ^^
Et pour la résolution je regarde jusqu'aux dixièmes.

Miniradi:
Pour la précision, à 2/3 secondes près c'est bon, c'est une course dans un petit village ^^
Et pour la résolution je regarde jusqu'aux dixièmes.

a quoi bon une resolution au 1/10 pour une précision intrinsèque pouvant etre 30 fois inferieure ?
en cheap , si la durée de l'evenement est courte (durée totale de l'evenement ? )
peut etre simplement voir à transmettre par sms , les millis() du coté feu depart pour faire une pseudo resynchro coté arrivée.

Oui je suis bien d'accord, avec le temps que j'ai pour faire le projet (sachant que la course est début septembre), j'ai pas trop chercher dans ce genre de paramètres ...
L’événement ? la course ? 1 minutes 30 environ
Mon idée première était de placer deux horloges dans chacun des boitiers et de les resynchroniser à chaque allumage des boitiers

Hello,
Je ne suis pas spécialiste en la matière mais deux modules GPS ne te donneraient-ils pas une référence temporelle commune ?
Tu t'éviterais ainsi les problèmes de synchronisation...
(Sans compter sur le fait qu'annoncer que la course de caisse à savon est contrôlée par GPS, ça le fait ! :wink: )

Coyotte

Distance entre départ et arrivée? Tu peux éventuellement communiquer quelque chose de plus direct que le réseau gsm

Merci pour vos réponses !
Le problème c'est le budget un peu serré étant donné que c'est la mairie qui finance les boîtiers
Bonne idée Coyotte pour les GPS, ils sont à la même heure (heure atomique du satellite), le problème est qu'ils sont chers (35 € le module environ)
Autre problème les modules GSM sont déjà achetés et installés dans les boîtiers ...

Re,

Est-ce tu ne peux pas accéder à l'heure du réseau GPRS ?

J'ai vu des commandes AT+CCLK? qui semblent (semblent!) renvoyer l'heure du réseau.
Auquel cas, tu pourrais utiliser celle-ci comme base de temps commune....

Désolé de ne pouvoir être plus précis...

Coyotte

En effet on peut récupérer le temps réseau GSM. Ou alors prend des sim808 (plus fiable plus rapide plus petit moins cher et avec GPS).