SIM800L + NEO6M(GPS) Arduino Mega

Bonjour à tous,

Je viens vers vous afin d'avoir votre aide après une longue période de recherche et de test.

Je suis en train de faire un système de surveillance à distance pour un appareil qui effectue des mesures.

Le but principale est de pouvoir redémarrer à distance avec des relais et des SMS, pouvoir regarder si il est toujours alimenté en 220v et si mon appareil se déplace grâce au GPS (en cas de vol)

pour la partie SMS, surveillance du 220v, et relais, j'ai réussi à tout faire fonctionner.

Je viens vers vous car je n'arrive pas à faire fonctionner mon module SIM800L et NEO6M (GPS) en même temps, j'arrive à les faire fonctionner séparément.

Je vous joins mon code, si vous avez le temps de regarder =)

J'utilise ici un arduino mega ainsi que ses ports séries en hard, j'ai essayé en avec la lib SoftwareSerial sans plus du succès.

Le code fonctionne bien jusqu’à ConnectionGPS(),

l'arduino mega n'arrive pas à lire le serial 3.

Si je test le code tout seul (ConnectionGPS()) sans rien d'autre cela fonctionne sauf si je laisse les lignes en com l'arduino n'arrive pas à lire le serial 3 également.

//-------bibliothèque-----------//


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <String.h>
#include <TinyGPS++.h> // alim GPS en 3.3v arduinoTX => RX GPS / arduinoRX => TX GPS



//------Pin connection----------//

LiquidCrystal_I2C lcd(0x27, 20, 4); // adress serial du LCD



//-------variable-------//

//---variable SIM800L---//
String textMessage;
String SerialConnReso;
String SerialQR;
int QR;
int SCR = 0;
int SGPS = 0;




//---variable GPS---//
char data;
TinyGPSPlus gps;


//-----------------SOUS_PROGRAMME------------------//

void ModeSMSon()
{
  Serial1.println("AT+CMGF=1"); // mode txt on
  Serial1.print("AT+CNMI=2,2,0,0,0\r");    //mode de reception de sms en direct

}
//**************************************************************************************************************************************************
void ConnectionReseau() {

  while (SCR == 0)
  {
    lcd.backlight();       //allume le rétro éclairage
    lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
    lcd.print("Test connection GSM");
    Serial.println("Test connection GSM");
    delay(3000);
    Serial1.println("AT+COPS?");          // demande de connection reseau

    if (Serial1.available() > 0 )
    {
      SerialConnReso = Serial1.readString();
      if (SerialConnReso.indexOf("+COPS: 0,0") >= 0)
      {
        lcd.backlight();       //allume le rétro éclairage
        lcd.setCursor(0, 1);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Connection GSM OK");
        Serial.println("Connection GSM OK");
        delay(2000);
        lcd.clear();            // efface le texte sur le LCD
        SCR = 1;

      }
      else
      {
        lcd.backlight();       //allume le rétro éclairage
        lcd.setCursor(1, 1);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Connection GSM OUT");
        Serial.println("Connection GSM OUT");
        delay(500);
        lcd.setCursor(0, 2);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Attente connection");
        Serial.println("Attente connection");
        delay(1000);
        lcd.clear();            // efface le texte sur le LCD
        SCR = 0;
      }
    }

  }
}

//*******************************************************************************************************************************************************************************

void ConnectionGPS()
{

  if (Serial3.available() && SGPS == 0)
  {
    /*   lcd.backlight();       //allume le rétro éclairage
      Serial.println("Test connection GPS");
      lcd.setCursor(0,0);     //choix de la ligne et du pixel de début de la phrase                  En comm car si je l'active l'arduino n'arrive plus à lire le serial 3
      lcd.print("Test connection GPS");
      delay(2000);
    */
    data = Serial3.read();
    Serial3.print(data);
    gps.encode(data);

    if (gps.location.isUpdated() > 0)
    {
      Serial.println(gps.location.lat(), 6);
      Serial.println(gps.location.lng(), 6);
      SGPS = 1;
    }
    if (gps.location.isUpdated() < 0)
    {
      lcd.backlight();       //allume le rétro éclairage
      lcd.setCursor(1, 1);    //choix de la ligne et du pixel de début de la phrase
      lcd.print("Connection GPS OUT");
      Serial.println("Connection GPS OUT");
      delay(500);
      lcd.setCursor(0, 2);    //choix de la ligne et du pixel de début de la phrase
      lcd.print("Attente connection");
      Serial.println("Attente connection");
      delay(1000);
      lcd.clear();            // efface le texte sur le LCD
      SGPS = 0;
    }
  }

}

//****************************************************************************************************
void QualityGSM()

{

  Serial1.println("AT+CSQ");
  delay(300);
  if (Serial1.available() > 0)
  {
    SerialQR = Serial1.readString();
    Serial.print(SerialQR);
    delay(10);
  }

  if (SerialQR.indexOf("+CSQ: 0,0") >= 0)
  {
    QR = 0;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 1,0") >= 0 || SerialQR.indexOf("+CSQ: 2,0") >= 0 || SerialQR.indexOf("+CSQ: 3,0") >= 0)
  {
    QR = 1;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 4,0") >= 0 || SerialQR.indexOf("+CSQ: 5,0") >= 0 || SerialQR.indexOf("+CSQ: 6,0") >= 0)
  {
    QR = 2;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 7,0") >= 0 || SerialQR.indexOf("+CSQ: 8,0") >= 0 || SerialQR.indexOf("+CSQ: 9,0") >= 0)
  {
    QR = 3;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 10,0") >= 0 || SerialQR.indexOf("+CSQ: 11,0") >= 0 || SerialQR.indexOf("+CSQ: 12,0") >= 0)
  {
    QR = 4;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 13,0") >= 0 || SerialQR.indexOf("+CSQ: 14,0") >= 0 || SerialQR.indexOf("+CSQ: 15,0") >= 0)
  {
    QR = 5;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 16,0") >= 0 || SerialQR.indexOf("+CSQ: 17,0") >= 0 || SerialQR.indexOf("+CSQ: 18,0") >= 0)
  {
    QR = 6;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 19,0") >= 0 || SerialQR.indexOf("+CSQ: 20,0") >= 0 || SerialQR.indexOf("+CSQ: 21,0") >= 0)
  {
    QR = 7;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 22,0") >= 0 || SerialQR.indexOf("+CSQ: 23,0") >= 0 || SerialQR.indexOf("+CSQ: 24,0") >= 0)
  {
    QR = 8;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 25,0") >= 0 || SerialQR.indexOf("+CSQ: 26,0") >= 0 || SerialQR.indexOf("+CSQ: 27,0") >= 0)
  {
    QR = 9;
    AffichQR();
  }
  if (SerialQR.indexOf("+CSQ: 28,0") >= 0 || SerialQR.indexOf("+CSQ: 29,0") >= 0 || SerialQR.indexOf("+CSQ: 30,0") >= 0 || SerialQR.indexOf("+CSQ: 31,0") >= 0)
  {
    QR = 10;
    AffichQR();
  }

}

//******************************************************************************************************************************************************************************
void AffichQR()
{
  delay(100);
  lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
  delay(100);
  lcd.print("GSM");
  lcd.setCursor(3, 0);    //choix de la ligne et du pixel de début de la phrase
  lcd.print(QR);
  lcd.setCursor(5, 0);    //choix de la ligne et du pixel de début de la phrase
  lcd.print("/10");
}

void setup()

{

  Serial.begin(9600);
  Serial1.begin(9600);
  Serial3.begin(9600);
  lcd.init();            // initialisation de l'afficheur
  lcd.backlight();       //allume le rétro éclairage
  lcd.setCursor(4, 2);    //choix de la ligne et du pixel de début de la phrase
  lcd.print("Demarrage...");
  delay(2000);
  // while(!Serial)
  delay(100);
  ModeSMSon();              //activation du mode SMS pour le SIM800L
  lcd.clear();            // efface le texte sur le LCD
  delay(100);
  ConnectionReseau();
  delay(100);
  ConnectionGPS();
}

void loop()
{

  QualityGSM();
  if (Serial1.available() > 0)
  {
    textMessage = Serial1.readString();
    Serial.print(textMessage);
    delay(10);
  }

  if (textMessage.indexOf("test") >= 0)
  {
    lcd.backlight();       //allume le rétro éclairage
    Serial.println("SMS RECU");
    lcd.backlight();       //allume le rétro éclairage
    lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
    lcd.print("SMS RECU");
    textMessage = "";
  }
}

Je vous remercie par avance.

Es-tu sûr de cette ligne ?

Serial3.print(data);

Tu écris dans le GPS ce qu'il vient de t'envoyer.

Sinon, as-tu essayé d'intervertir la connexion GSM et GPS dans le setup :

 delay(100);
 ConnectionGPS();
 delay(100);
 ConnectionReseau();

Est-ce que ça coince au même endroit ?

Autre question : d'où te viennent les codes de ces deux fonctions ? Des exemples des bibliothèques ?

Salut,

Je te remercie d'avoir pris le temps de regarder mon code. :slight_smile:

Es-tu sûr de cette ligne ?

Serial3.print(data);

en effet, je suis allé voir la lib TinyGPS++, l'écriture est différente (je n'étais pas aller voir plus loin car l'exemple que j'avais trouvé fonctionner quand la carte était seul)

Malheureusement cela ne change pas mon problème, l'arduino mega n'arrive pas à lire le Serial3, il passe tout simplement à la suite sans prendre en compte les fonctions ConnectionGPS() et testGPS()
(les fonctions ConnectionGPS() et testGPS() fonctionnent, l'arduino arrive à lire le Serial3 au bout du 1 à 5 essais quand le code n’inclue pas la carte GSM et LCD) mais ils sont toujours branchés)
mais il est impossible de mettre la fonction testGPS() dans le setup, si je fais ça il passe à la suite sans rien faire.
type de réponse sur le moniteur :

15:19:37.091 -> Location: INVALID
15:19:37.159 -> Location: INVALID
15:19:37.227 -> Location: INVALID
15:19:37.262 -> Location: INVALID
15:19:37.843 -> Location: 50.*****,3.*****

Sinon, as-tu essayé d'intervertir la connexion GSM et GPS dans le setup :

 delay(100);

ConnectionGPS();
delay(100);
ConnectionReseau();



Est-ce que ça coince au même endroit ?

Je viens d'essayer, cela ne change rien. :frowning:

Autre question : d'où te viennent les codes de ces deux fonctions ? Des exemples des bibliothèques ?

J'ai écrit ces deux fonctions avec l’inspiration d'exemples, touvés sur le net

Je redonne mon code avec les modifications

//-------bibliothèque-----------//


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <String.h>
#include <TinyGPS++.h> // alim GPS en 3.3v arduinoTX => RX GPS / arduinoRX => TX GPS



//------Pin connection----------//

LiquidCrystal_I2C lcd(0x27, 20, 4); // adress serial du LCD



//-------variable-------//

//---variable SIM800L---//
String textMessage;
String SerialConnReso;
String SerialQR;
int QR;
int SCR = 0;
int SGPS = 0;




//---variable GPS---//
char data;
TinyGPSPlus gps;


//-----------------SOUS_PROGRAMME------------------//

void ModeSMSon()
{
  Serial1.println("AT+CMGF=1"); // mode txt on
  Serial1.print("AT+CNMI=2,2,0,0,0\r");    //mode de reception de sms en direct

}
//**************************************************************************************************************************************************
void ConnectionReseau() {

  while (SCR == 0)
  {
    lcd.backlight();       //allume le rétro éclairage
    lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
    lcd.print("Test connection GSM");
    Serial.println("Test connection GSM");
    delay(3000);
    Serial1.println("AT+COPS?");          // demande de connection reseau

    if (Serial1.available() > 0 )
    {
      SerialConnReso = Serial1.readString();
      if (SerialConnReso.indexOf("+COPS: 0,0") >= 0)
      {
        lcd.backlight();       //allume le rétro éclairage
        lcd.setCursor(0, 1);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Connection GSM OK");
        Serial.println("Connection GSM OK");
        delay(2000);
        lcd.clear();            // efface le texte sur le LCD
        SCR = 1;

      }
      else
      {
        lcd.backlight();       //allume le rétro éclairage
        lcd.setCursor(1, 1);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Connection GSM OUT");
        Serial.println("Connection GSM OUT");
        delay(500);
        lcd.setCursor(0, 2);    //choix de la ligne et du pixel de début de la phrase
        lcd.print("Attente connection");
        Serial.println("Attente connection");
        delay(1000);
        lcd.clear();            // efface le texte sur le LCD
        SCR = 0;
      }
    }

  }
}

//*******************************************************************************************************************************************************************************
  void ConnectionGPS()
  {
    Serial.print(F("Location: "));
    if (gps.location.isValid())
    {
      Serial.print(gps.location.lat(), 6);
      Serial.print(F(","));
      Serial.println(gps.location.lng(), 6);
      delay(1000);
      SGPS=1;
    }
    else
    {
      Serial.println(F("INVALID"));
      testGPS();
    }
  }

void testGPS()
{
  while (Serial3.available() > 0 && SGPS==0 )
    if (gps.encode(Serial3.read()))
      ConnectionGPS();
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while (true);
  }
}



  //****************************************************************************************************
  void QualityGSM()

  {

    Serial1.println("AT+CSQ");
    delay(300);
    if (Serial1.available() > 0)
    {
      SerialQR = Serial1.readString();
      Serial.print(SerialQR);
      delay(10);
    }

    if (SerialQR.indexOf("+CSQ: 0,0") >= 0)
    {
      QR = 0;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 1,0") >= 0 || SerialQR.indexOf("+CSQ: 2,0") >= 0 || SerialQR.indexOf("+CSQ: 3,0") >= 0)
    {
      QR = 1;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 4,0") >= 0 || SerialQR.indexOf("+CSQ: 5,0") >= 0 || SerialQR.indexOf("+CSQ: 6,0") >= 0)
    {
      QR = 2;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 7,0") >= 0 || SerialQR.indexOf("+CSQ: 8,0") >= 0 || SerialQR.indexOf("+CSQ: 9,0") >= 0)
    {
      QR = 3;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 10,0") >= 0 || SerialQR.indexOf("+CSQ: 11,0") >= 0 || SerialQR.indexOf("+CSQ: 12,0") >= 0)
    {
      QR = 4;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 13,0") >= 0 || SerialQR.indexOf("+CSQ: 14,0") >= 0 || SerialQR.indexOf("+CSQ: 15,0") >= 0)
    {
      QR = 5;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 16,0") >= 0 || SerialQR.indexOf("+CSQ: 17,0") >= 0 || SerialQR.indexOf("+CSQ: 18,0") >= 0)
    {
      QR = 6;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 19,0") >= 0 || SerialQR.indexOf("+CSQ: 20,0") >= 0 || SerialQR.indexOf("+CSQ: 21,0") >= 0)
    {
      QR = 7;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 22,0") >= 0 || SerialQR.indexOf("+CSQ: 23,0") >= 0 || SerialQR.indexOf("+CSQ: 24,0") >= 0)
    {
      QR = 8;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 25,0") >= 0 || SerialQR.indexOf("+CSQ: 26,0") >= 0 || SerialQR.indexOf("+CSQ: 27,0") >= 0)
    {
      QR = 9;
      AffichQR();
    }
    if (SerialQR.indexOf("+CSQ: 28,0") >= 0 || SerialQR.indexOf("+CSQ: 29,0") >= 0 || SerialQR.indexOf("+CSQ: 30,0") >= 0 || SerialQR.indexOf("+CSQ: 31,0") >= 0)
    {
      QR = 10;
      AffichQR();
    }

  }

  //******************************************************************************************************************************************************************************
  void AffichQR()
  {
    delay(100);
    lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
    delay(100);
    lcd.print("GSM");
    lcd.setCursor(3, 0);    //choix de la ligne et du pixel de début de la phrase
    lcd.print(QR);
    lcd.setCursor(5, 0);    //choix de la ligne et du pixel de début de la phrase
    lcd.print("/10");
  }
  void setup()

  {
    Serial.begin(9600);
    Serial1.begin(9600);
    Serial3.begin(9600);
    lcd.init();            // initialisation de l'afficheur
    lcd.backlight();       //allume le rétro éclairage
    lcd.setCursor(4, 2);    //choix de la ligne et du pixel de début de la phrase
    lcd.print("Demarrage...");
    delay(2000);
    // while(!Serial)
    delay(100);
    ModeSMSon();              //activation du mode SMS pour le SIM800L
    lcd.clear();            // efface le texte sur le LCD
    delay(100);
    ConnectionReseau();
    delay(100);
    
  }

  void loop()
  {
    testGPS();
    QualityGSM();
    if (Serial1.available() > 0)
    {
      textMessage = Serial1.readString();
      Serial.print(textMessage);
      delay(10);
    }

    if (textMessage.indexOf("test") >= 0)
    {
      lcd.backlight();       //allume le rétro éclairage
      Serial.println("SMS RECU");
      lcd.backlight();       //allume le rétro éclairage
      lcd.setCursor(0, 0);    //choix de la ligne et du pixel de début de la phrase
      lcd.print("SMS RECU");
      textMessage = "";
    }
  }

Merci par avance =)