Alarme complète pour voiture avec GPS

bonjour,

je viens de terminer mon alarme pour camion via arduino MEGA et module SIM 808

les fonctions de base :
activer alarme via un bip radio > je reçois un sms qui m'informe que l'alarme est mise par le bip
pareille pour désactiver l'alarme.

je peux également mettre et couper l'alarme a distance via un sms

Je reçois des sms et des appels de l'alarme si celle ci est déclenchée

et cerise sur le gateau j'arrive à recevoir les coordonnées gps !

Toute cela fonctionne bien ! MAIS ! j'utilise un string pour mes coordonnées GPS et malédiction du String .. il me shoot un boolean au passage... évidemment j'ai identifié le problème et je le remets via le programme .. mais c'est moche... même si cela fonctionne, j'aimerai beaucoup m'affranchir d'utiliser le STRING... le truc c'est que j'ai déjà lu et j'avoue ne pas comprendre grand chose aux tableaux de char... bref ... si quelqu'un pourrait m'éclairer ...

merci beaucoup d'avance :

voici le bout de code qui me fait la misère :

La fonction que  j'appelle dans le programme principal

    sendTabData("AT+CGNSINF", 1000, DEBUG);
   

void sendTabData(String command , const int timeout , boolean debug) {

  GPRS.println(command);
  long int time = millis();
  while (time > (millis() - timeout)) {
  
textMessage = GPRS.readString();    ///   AAAAAARG ! LE STRING qui tue
     

textMessage.remove(0, 58);  // je retaille le string pour n'avoir que les coordonnées GPS
 taille = textMessage.length();
textMessage.remove(18, taille);  

    textMessage.toCharArray(recept, 19);
    recept[19]=char(26);

GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no); // contient mon numéro de telephone
      GPRS.println("\"");
      delay(300);
      GPRS.print("http://maps.google.com/maps?q=loc:");
      GPRS.print(recept);
      delay(200);
      GPRS.println((char)26);
      delay(1000);
      GPRS.flush();

HEEEELP :wink: merci d'avance

j'utilise un string pour mes coordonnées GPS et malédiction du String .. il me shoot un boolean au passage

faudrait voir tout le code... la classe String en elle même n'écrasera pas d'autres données. c'est que vous avez un débordement mémoire quelque part plutôt...

Si vous voulez écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet. il y a une fonction asynchrone que vous pouvez mettre à la place de votre GPRS.readString();

PS: il faudrait remplacer

  long int time = millis();
  while (time > (millis() - timeout)) {

par

unsigned long t0 = millis();
  while (millis() - t0 < timeout) {

mais ce n'est pas suffisant, vous devriez pouvoir sortir quand vous avez reçu la bonne réponse. J'ai un tuto sur la gestion des commandes sur port série si ça vous intéresse

Mon programme fait plus de 9000 caracteres, je l'envoie en morceaux !

voici l'init et le setup

#include <SoftwareSerial.h>
#include <EEPROM.h>
#define GPRS Serial3
// ALARME AUTO COMPLETE REV 3   26 novembre 13h00
const int onoff = 12; // signal de l'interupteur
const int porte = 2; // signal de porte
const int relay1 = 10;
const int relay2 = 11;
const int poweron = 7;  // pour envoyer impulsion de 3s de démarrage du modem
#define RED 22
#define GREEN 24
#define BLUE 26
String textMessage;
char phone_no[] = "+33780808001";
char recept[19];
#define DEBUG true
bool radio;
bool gsm;
bool iradio;
bool alarme;
int compteuralarme = 0;
int analogPin = A0;
int valpin = 0;
bool porteouverte;
bool twin;
int taille;
bool bipneutralise;
int count;
int timeralarme = 0;
bool bipsonore;
void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(onoff, INPUT);
  pinMode(porte, INPUT);
  pinMode(poweron, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);
  digitalWrite(poweron, LOW);
  delay(1000);
  digitalWrite(poweron, HIGH);
  delay(3000);
  digitalWrite(poweron, LOW);
  valpin = analogRead(analogPin);  // Lecture du port modem pour connaitre son etat connecté ou pas
  do {
    digitalWrite(poweron, LOW);
    delay(1000);
    digitalWrite(poweron, HIGH);
    delay(3000);
    digitalWrite(poweron, LOW);
    delay(3000);
    valpin = analogRead(analogPin);
    orange();
  }
  while (valpin < 400);
  GPRS.begin(9600);
  eteint();
  initmodem();
  phone_no[0] = '+';
  for (int i = 0; i < 11; i++)
  {
    phone_no[i + 1] = EEPROM.read(i);
  }
  Serial.println(phone_no);
  bipneutralise = false; // le bip n'est pas neutralisé
  alarme = false; // l'alarme ne sonne pas
  gsm = false; // la commande gsm est sur off
  bipsonore = false;
  compteuralarme = 0;
  count = 0;
  timeralarme = 0;

  porteouverte = digitalRead(porte);
  if (porteouverte) {
    vert();
    radio = false;
  }
  if (!porteouverte) {
    rouge();
    radio = true;
  }

  initmodem();
  GPRS.print("AT+CMGS=\"");
  GPRS.print(phone_no);
  GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
  delay(500);
  GPRS.print("Alarme GSM/GPS/SMS \r");
  GPRS.print("V2.0 du 9 avril 2021  \r");
  GPRS.print("===========================\r");
    GPRS.write( 0x1a );
  delay(1000);
}

Premiere partie du loop

void loop() {
  porteouverte = digitalRead(porte);
  if ((porteouverte) && (!radio) && (!gsm)) {  // Porte ouverte, pas de radio, pas de gsm = Del bleu
    bleu();
  }

  if ((!porteouverte) && (!radio) && (!gsm)) { // Porte fermee, pas de radio, pas de gsm = Del verte
    vert();
  }

  if ((radio) && (porteouverte)) { // Porte ouverte & radio = déclenchement alarme
    alarme = true;

  }
  if ((gsm) && (porteouverte)) { // Porte ouverte & gsm = déclenchement alarme
    alarme = true;

  }
  if (alarme) {                 // Alarme = relais 1 en position basse et DEL blanche
    digitalWrite (relay1, LOW);
    blanc();
    if (twin) {
      digitalWrite(relay2, LOW);
    }
    blanc();
    if (!bipneutralise) {  //             Le bip n'est pas neutralisé, on lit le port on/off
      iradio = digitalRead(onoff);

      if (iradio) {          //         si le port est 1 on augmente le compteur
        count++;
      }
      if (!iradio) {         // si le port est à 0 on reset le compteur
        count = 0;
      }
    }

    if (count == 300) {
      alarme = false;
      bipoff();         // bip off met à 0  la radio et le gsm !
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Alarme DESACTIVEE par BIP.\r");
      GPRS.write( 0x1a );
      // delay(1000);
      GPRS.flush();

    }
  }
  if ((alarme) && (compteuralarme < 2600)) {    // incremente le compteur
    compteuralarme ++;
    delay(10);
  }

  if ((alarme) && (compteuralarme == 1 )) {    // envoie un sms
    blanc();
    initmodem();
    smssonne();
  }

  if ((alarme) && (compteuralarme == 500 )) {   // envoie un sms
    blanc();
    initmodem();
    smssonne();
  }


  if ((alarme) && (compteuralarme == 1000 )) {   // envoie un sms
    blanc();
    initmodem();
    smssonne();
  }

  if ((alarme) && (compteuralarme == 1500 )) {   // envoie un sms
    initmodem();
    smssonne();
  }
  if ((alarme) && (compteuralarme == 2000 )) {   // envoie un sms
    initmodem();
    smssonne();
  }
  if ((alarme) && (compteuralarme == 2250 )) {  // envoie un appel
    initmodem();
    GPRS.print("ATD");
    GPRS.print(phone_no);
    GPRS.println(";"); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(20000);
    GPRS.println("ATH");
    GPRS.flush();
    initmodem();
    GPRS.print("ATD");
    GPRS.print(phone_no);
    GPRS.println(";"); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(20000);
    GPRS.println("ATH");
    GPRS.flush();
    initmodem();
    GPRS.print("ATD");
    GPRS.print(phone_no);
    GPRS.println(";"); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(20000);
    GPRS.println("ATH");
    GPRS.flush();
    initmodem();
    GPRS.print("ATD");
    GPRS.print(phone_no);
    GPRS.println(";"); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(20000);
    GPRS.println("ATH");
    GPRS.flush();
  }
  if ((alarme) && (compteuralarme == 2400 )) {   // envoie un sms
    initmodem();
    smssonne();
  }
  if ((alarme) && (compteuralarme == 2500 )) {  // envoie un appel
    initmodem();
    GPRS.print("ATD");
    GPRS.print(phone_no);
    GPRS.println(";"); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(20000);
    GPRS.println("ATH");
    GPRS.flush();
   
    compteuralarme = 1;
    timeralarme++;
  }
  if (timeralarme == 10) {  // Si timeralarme = 10 ; on neutralise alarme et on envoie un sms d'information
    alarme = false;
    radio = false;
    gsm = false;
    timeralarme = 0;
    compteuralarme = 0;
    bipneutralise = false;
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Neutralisaion Alarme. intervention trop longue.\r");
    GPRS.write( 0x1a );
    delay(1000);
  }

Deuxieme partie du loop

  if (!bipneutralise) {  //             Le bip n'est pas neutralisé, on lit le port on/off
    iradio = digitalRead(onoff);

    if (iradio) {          //         si le port est 1 on augmente le compteur
      count++;
    }
    if (!iradio) {         // si le port est à 0 on reset le compteur
      count = 0;
    }
  }

  if (count == 3000) {  // si le compteur est à 10
    radio = !radio; // on inverse le bool radio

    if (gsm) {
      gsm = false;
      radio = false;
    }



    if ((!radio) && (!bipneutralise))   {  // le radio = false, sms d'information que l'alarme est desactivée par bip
      // bip off met à 0  la radio et le gsm !
      bipoff();
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Alarme DESACTIVEE par BIP.\r");
      GPRS.write( 0x1a );
      //  delay(1000);
      GPRS.flush();

    }
    if ((radio) && (!porteouverte) && (!bipneutralise))     { // si radio et porte ouverte, SMS d'info
      bipon();
      gsm = false; // coupure de l alarme gsm par le bip
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Alarme ACTIVEE par BIP.\r");
      GPRS.write( 0x1a );
      delay(1000);
      GPRS.flush();

    }
    if ((radio) && (porteouverte) && (!bipneutralise))    { // si radio et porte ouverte, SMS impossible
      bipbug();
      radio = false;
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Impossible ! porte ouverte.\r");
      GPRS.write( 0x1a );
      delay(1000);
      GPRS.flush();
    }
  }

  if (count == 3200) { //  evite d'envoyer count trop loin et empeche de reboucler sur le test = 10
    count = 3190;
  }
  /-a partir d'ici c'est la lecture des messages SMS

  if (GPRS.available() > 0) {
    textMessage = GPRS.readString();
    delay(10);
  }

  if (textMessage.indexOf("Change") >= 0)      {
    taille = textMessage.length();
       textMessage = textMessage.substring(58, taille);
    textMessage.toCharArray(phone_no, 13);
    for (int i = 0; i < 11; i++)
    {
      EEPROM.write(i, phone_no[i]);
    }
    phone_no[0] = '+';
    for (int i = 0; i < 11; i++)
    {
      phone_no[i + 1] = EEPROM.read(i);
    }
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("REPROGRAMMATION EEPROM TERMINEE");
    GPRS.write( 0x1a );
    textMessage = " ";
  }
 
  if (textMessage.indexOf("Reset") >= 0)      {

    bipneutralise = false; // le bip n'est pas neutralisé
    alarme = false; // l'alarme ne sonne pas
    gsm = false; // la commande gsm est sur off
    bipsonore = false;
    compteuralarme = 0;
    count = 0;
    timeralarme = 0;

    porteouverte = digitalRead(porte);
    if (porteouverte) {
      vert();
      radio = false;
    }
    if (!porteouverte) {
      rouge();
      radio = true;
    }
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Remise a 0 OK !\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Alarme on") >= 0) {
    if (!porteouverte) {
      gsm = true;
      radio = false;
      bipon();
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Alarme ACTIVEE par GSM.\r");
      GPRS.write( 0x1a );
      delay(1000);
      GPRS.flush();

    }
    if (porteouverte) {
      bipbug();
      gsm = false;
      initmodem();
      GPRS.print("AT+CMGS=\"");
      GPRS.print(phone_no);
      GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
      delay(500);
      GPRS.print("Impossible ! porte ouverte.\r");
      GPRS.write( 0x1a );
      delay(1000);
      GPRS.flush();

    }
    textMessage = " ";
  }
  if (textMessage.indexOf("Alarme off") >= 0) {
    bipoff();
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Alarme DESACTIVEE par GSM.\r");
    GPRS.write( 0x1a );
    //delay(1000);
    GPRS.flush();

    textMessage = " ";
  }

  if (textMessage.indexOf("Bip on") >= 0) {
    initmodem();
    bipsonore = false;
    //bipneutralise = true;
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Signal sonore ACTIF.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Bip off") >= 0) {
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Signal sonore INACTIF.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    bipsonore = true;
    textMessage = " ";
  }

  if (textMessage.indexOf("Radio off") >= 0) {
    bipneutralise = true;
    radio = false;
    iradio = false;
    count = 0;
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Bip radio inactif.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Double on") >= 0) {
    twin = true;
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Klaxon + Alarme.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Double off") >= 0) {
    twin = false;
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Alarme.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Radio on") >= 0) {
    bipneutralise = false;
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    GPRS.print("Bip radio actif.\r");
    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }
 
  if (textMessage.indexOf("Check") >= 0) {
    initmodem();
    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
    delay(500);
    if (radio) {
      GPRS.print("Statut Alarme : ACTIVE par BIP\r");
    }
    if (gsm) {
      GPRS.print("Statut Alarme : ACTIVE par GSM\r");
    }

    if ((!radio) && (!gsm)) {
      GPRS.print("Statut Alarme : DESACTIVEE\r");
    }
    GPRS.print(" \r");

    if (bipneutralise) {
      GPRS.print("Statut BIP radio : INACTIF\r");
    }
    if (!bipneutralise) {
      GPRS.print("Statut BIP radio : ACTIF\r");
    }

    if (bipsonore) {
      GPRS.print("Statut Signal sonore : INACTIF\r");
    }
    if (!bipsonore) {
      GPRS.print("Statut Signal sonore : ACTIF\r");
    }
    if (twin) {
      GPRS.print("Mode Alarme : Sirene + Klaxon\r");
    }
    if (!twin) {
      GPRS.print("Mode Alarme : Sirene\r");
    }

    if (porteouverte) {
      GPRS.print("Statut Portes : OPEN\r");
    }
    if (!porteouverte) {
      GPRS.print("Statut Portes : CLOSE\r");
    }

    if (alarme) {
      GPRS.print("==================\r");
      GPRS.print("=  Alarme Sonne  =\r");
      GPRS.print("==================\r");
    }

    GPRS.write( 0x1a );
    delay(1000);
    GPRS.flush();
    textMessage = " ";
  }

  if (textMessage.indexOf("Gps") >= 0) {
    sendTabData("AT+CGNSINF", 1000, DEBUG);
    textMessage = " ";
  }
}

Les void

void sendTabData(String command , const int timeout , boolean debug) {
  
  GPRS.println(command);
  long int time = millis();
  int i = 0;
  while (time > (millis() - timeout)) {

    textMessage = GPRS.readString();
    textMessage.remove(0, 58);
    taille = textMessage.length();
    textMessage.remove(18, taille);

    textMessage.toCharArray(recept, 19);
    recept[19] = char(26);

    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\"");
    delay(300);
    GPRS.print("http://maps.google.com/maps?q=loc:");
    GPRS.print(recept);
    delay(200);
    GPRS.println((char)26);
    delay(200);
    GPRS.println();
    delay(1000);
    GPRS.flush();

    bipneutralise = false; // le bip n'est pas neutralisé
    alarme = false; // l'alarme ne sonne pas
    gsm = false; // la commande gsm est sur off
    bipsonore = false;
    compteuralarme = 0;
    count = 0;
    timeralarme = 0;
    rouge();

    porteouverte = digitalRead(porte);
    if (porteouverte) {
      vert();
      radio = false;
    }
    if (!porteouverte) {
      rouge();
      radio = true;
    }
  }
}

String sendData (String command , const int timeout , boolean debug) {
  String response = "";
  GPRS.println(command);
  long int time = millis();
  int i = 0;

  while ( time > (millis() - timeout)) {
    while (GPRS.available()) {
      char c = GPRS.read();
      response += c;
    }
  }
  if (debug) {
    Serial.print(response);
  }
  return response;
}

void bipbug() {
  digitalWrite(relay1, HIGH);
  radio = false;
  gsm = false;
  digitalWrite(relay2, LOW);
  delay(30);
  digitalWrite(relay2, HIGH);
  delay(200);
  digitalWrite(relay2, LOW);
  delay(30);
  digitalWrite(relay2, HIGH);
  delay(200);
  digitalWrite(relay2, LOW);
  delay(30);
  digitalWrite(relay2, HIGH);
  delay(200);
  digitalWrite(relay2, LOW);
  delay(30);
  digitalWrite(relay2, HIGH);
  delay(200);
  jaune();
}

void bipon() {
  rouge();
  if (!bipsonore) {
    digitalWrite(relay2, LOW);
    delay(25);
    digitalWrite(relay2, HIGH);
    delay(200);
    digitalWrite(relay2, LOW);
    delay(25);
    digitalWrite(relay2, HIGH);
    delay(200);
  }
}
void bipoff() {
  alarme = false;
  radio = false;
  gsm = false;
  timeralarme = 0;
  compteuralarme = 0;
  vert();
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);
  if (!bipsonore) {
    digitalWrite(relay2, LOW);
    delay(25);
    digitalWrite(relay2, HIGH);
    delay(200);
  }
}
void initmodem() {
  GPRS.print("AT+CMGF=1\r\n");
  delay(1000);
  GPRS.print("AT+CNMI=2,2,0,0,0\r\n");
  delay(1000);
  GPRS.print("AT+CMGF=1\r");
  delay(400);
  sendData("AT+CGNSPWR=1", 1000, DEBUG);
  delay(50);
  sendData("AT+CGNSSEQ=RMC", 1000, DEBUG);
  delay(150);
}
void smssonne() {
  GPRS.print("AT+CMGS=\"");
  GPRS.print(phone_no);
  GPRS.println("\""); // GPRS.println("AT+CMGS=\"+33780808001\"");
  delay(500);
  GPRS.print("Alarme SONNE.\r");
  GPRS.write( 0x1a );
  delay(1000);
  compteuralarme ++;
}

void vert() {
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, LOW);
}
void jaune() {
  digitalWrite(BLUE, HIGH);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, LOW);
}
void rouge() {
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, HIGH);
}
void blanc() {
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, HIGH);
}
void bleu() {
  digitalWrite(BLUE, HIGH);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
}
void eteint() {
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
}
void orange() {
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, HIGH);
}

Je suis désolé de ne pas vous présenter un meilleur code mais ... je ne sais pas vraiment coder ! .. Self Made Man !! donc ca doit vous paraitre bien basique et linéaire.... ..

merci d'avance de votre aide

Prochaine mise à jour.. en cas d'alarme mettre en route un envoie régulier des positions GPS et activation d'une balise WIFI.. bah oui j'ai vu la pub de coyote..ils localisent votre véhicule meme dans un sous-sol.. bah... avec la derniere position du véhicule et une balise wifi.. moi aussi je vais la retrouver :wink: !!

reste à trouver le module wifi :wink:

Je suis désolé de ne pas vous présenter un meilleur code mais ... je ne sais pas vraiment coder ! .. Self Made Man !! donc ca doit vous paraitre bien basique et linéaire.... ..

il ne faut pas vous excuser ! vous avez réussi à faire quelque chose de fonctionnel, donc bravo. C'est en forgeant qu'on devient forgeron. continuez ainsi !!

———
votre bug est là: char recept[19];puis

    textMessage.toCharArray(recept, 19);
    recept[19] = char(26);

==> les indices vont de 0 à 18 donc quand vous écrivez le 'escape' dans recept[19] vous écrasez la variable qui est en mémoire juste après (si le compilo a conservé l'ordre c'est bool radio; qui va morfler)
==> donc déclarezchar recept[21];et pour être sûr que la chaîne soit bien formée avec un caractère nul à la fin, faites

    textMessage.toCharArray(recept, 19);
    recept[19] = char(26);
    recept[20] = '\0';

(sinon vous pouvez envoyer directement la sous chaîne et ensuite le escape sans avoir à fabriquer recept[])

La fonction sendData() qui retourne une String (pas bien :slight_smile: ) est fonctionnelle mais en pratique vous en faites rien de la réponse et vous ne l'appelez jamais avec une String... donc ne vous ennuyez pas avec la String et remplacez la fonction par

void sendData (const char* command , const unsigned long timeout , boolean debug) {
  // on envoie la commande
  GPRS.println(command);
  // on écoute la réponse pendant timeout ms
  unsigned long t0 = millis();
  while (millis() - t0 < timeout) {
    if (GPRS.available()) {
      uint8_t r = GPRS.read();
      if (debug) Serial.write(r);
    }
  }
}

PS: vous pouvez virer #include <SoftwareSerial.h>puisque vous êtes sans doute sur une Arduino Mega et que vous n'utilisez pas SoftwareSerial

PS bis: l'autre fonction sendTabData doit aussi être un peu modifiée

void sendTabData(const char* command , const unsigned long timeout , boolean debug) {

  GPRS.println(command);
  unsigned long t0 = millis();
  while (millis() - t0 < timeout) {
...

(et en pratique le timeOut ne sert à rien car vous en avez un intégré dans readString et vous n'utilisez pas le booléen debug. Donc la fonction pourrait ressembler à cela:

void sendTabData(const char* command, const unsigned long timeout, boolean debug) {

  GPRS.println(command);
  unsigned long t0 = millis();
  while (millis() - t0 < timeout) {
    if (GPRS.available()) break;
  }
  if (GPRS.available()) {
    textMessage = GPRS.readString();
    textMessage.remove(0, 58);
    taille = textMessage.length();
    textMessage.remove(18, taille);

    textMessage.toCharArray(recept, 19);
    recept[19] = char(26);
    recept[20] = '\0';

    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\"");
    delay(300);
    GPRS.print("http://maps.google.com/maps?q=loc:");
    GPRS.print(recept);
    delay(200);
    GPRS.println((char)26); // FAUT-IL VRAIMENT ENVOYER 2 FOIS ESCAPE ??
    delay(200);
    GPRS.println();
    delay(1000);
    GPRS.flush();
  } else {
    if (debug) Serial.println(F("timeout..."));
  }
  bipneutralise = false; // le bip n'est pas neutralisé
  alarme = false; // l'alarme ne sonne pas
  gsm = false; // la commande gsm est sur off
  bipsonore = false;
  compteuralarme = 0;
  count = 0;
  timeralarme = 0;
  rouge();

  porteouverte = digitalRead(porte);
  if (porteouverte) {
    vert();
    radio = false;
  } else {
    rouge();
    radio = true;
  }
}

Un grand merci ! tout fonctionne à present... c'est vraiment que du bonheur !!!

pour répondre à votre question :

GPRS.println((char)26); // FAUT-IL VRAIMENT ENVOYER 2 FOIS ESCAPE ??

La réponse est oui... ca m'a bien fait galérer ce truc aussi.. mais sans cet echap.. le sms ne s'envoie pas !
je l'avais intégré directement dans recept.. mais non... c'est celui la qu'il veut !! :slight_smile:

en tout cas merci beaucoup pour votre aide! je continue de la développer ! j'attaque mes recherches sur le module WIFI.
comme ca .. même volée dans un hangar.. je peux la localiser via le wifi :wink:

merci encore pour tout je repasserai vous donner des nouvelles de l'évolution.

cool bizarre ce double escape. (c'est pas escape d'ailleurs, c'est CTRL+Z)
peut-être le veut il sur une ligne à part. essayez avec ce code

void sendTabData(const char* command, const unsigned long timeout, boolean debug) {
  GPRS.println(command);
  unsigned long t0 = millis();
  while (millis() - t0 < timeout) {
    if (GPRS.available()) break;
  }
  if (GPRS.available()) {
    textMessage = GPRS.readString();
    textMessage.remove(0, 58);
    taille = textMessage.length();
    textMessage.remove(18, taille);

    GPRS.print("AT+CMGS=\"");
    GPRS.print(phone_no);
    GPRS.println("\"");
    delay(300);
    GPRS.print("http://maps.google.com/maps?q=loc:");
    GPRS.println(textMessage);
    GPRS.flush();
    delay(200);
    GPRS.println((char)26);
    GPRS.flush();
    delay(200);
  } else {
    if (debug) Serial.println(F("timeout..."));
  }
  bipneutralise = false; // le bip n'est pas neutralisé
  alarme = false; // l'alarme ne sonne pas
  gsm = false; // la commande gsm est sur off
  bipsonore = false;
  compteuralarme = 0;
  count = 0;
  timeralarme = 0;
  rouge();

  porteouverte = digitalRead(porte);
  if (porteouverte) {
    vert();
    radio = false;
  } else {
    rouge();
    radio = true;
  }
}

même volée dans un hangar.. je peux la localiser via le wifi

hum... faudrait qu'il y ait du WiFi...
je ne suis pas sûr de ce que vous voulez faire

non en fait, c'est l'inverse :slight_smile:
je veux que mon iveco envoie un signal wifi (comme toutes les box) par exemple iveco_Wifi.
Ainsi même sans signal gps (mais partir du dernier "valide" ) par exemple véhicule rentré dans un garage ou le signal GPS ne passe plus, j'enverrai un signal wifi qui sera certes de faible portée mais suffisant pour être reçu et localisé ..

Ok je vois.

Un esp peut faire un wifi mais ça n’ira pas bien loin

Pas envie de lire les 9000 lignes, donc voici la question: quel est le principe de détection du vol?
Est-ce par exemple, si le GPS envoie des coordonnées différentes de celles qui ont été mémorisées lors de l'allumage de l'alarme? Si oui, il faut prévoir une petite marge d'erreur.

bonjour,
Non, en fait le vol est constaté simplement par l'ouverture d'une porte.
Il y a la possibilité d' interroger sur la position du véhicule si besoin. par exemple si le véhicule a été emporté sans effractions.. ou pire....si vous avez garé votre véhicule et que vous ne savez plus exactement où il est (perso c'est généralement mon cas !!).

j'espère que ce n'est pas ton vrai numéro de portable qui est dans le code posté !

bonjour, non non ;).

j'en ai profité pour optimiser le programme et maintenant j'ai une fonction TRACEUR qui envoie un sms avec la position toutes les minutes.
la balise wifi comme l'a dit J.M.L. . c'est vraiment de très courte portée.... Déçu ;(

je vais maintenant tenter de récupérer le signal de fermeture et d'ouverture de mon camion... en fait .. ca risque d'être compliqué ! par contre, j'ai remarqué que mes clignotants s'allument différemment selon l'ouverture ou la fermeture... la.. ca sera beaucoup plus simple ! du coup je bidouille ca !

pour l'ouverture, il n'y a pas un plafonnier qui s'allume aussi ? tu pourrais vérifier plafonnier+clignotants.

ah oui c'est une piste.. pourquoi pas .. mais comment faire la distinction entre le plafonnier qui s'allume automatiquement et le plafonnier que j'actionne pour X raisons ?

La séquence des clignotants est vraiment particulière et bien définie.. ils s'allument plus longtemps que lorsqu'ils clignotent pour la direction ou les warnings...
je pense rester sur mon idée de "surveiller" mes clignotants ;).

Merci pour votre idée en tout cas.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.