SIM808 et aduino mega

bonjour,

j'ai réalisé un petit programme sur arduino nano qui communique avec le modem SIM808.
tout fonctionnait a merveille... sauf que la mémoire était devenue trop juste..
du coup j'ai investi dans un arduino mega 2560.

j'ai replacé pin à pin les branchements... et la ... un probleme bizarrre....

voici le code que j'utilise et qui apparemment ne fonctionne pas de l'uno vers le mega

#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial GPRS(9, 10);

String textMessage;

String data[5];
#define DEBUG true
String state, timegps, latitude, longitude;

void setup() {
  Serial.begin(9600);
    GPRS.begin(9600);
 
  initmodem();

 GPRS.println("AT+CMGS=\"+33700000000\"");
      delay(500);
      GPRS.print("Message.\r");
      GPRS.write( 0x1a );
  
}
void loop() {
 
if (GPRS.available() > 0) {
  Serial.println("GPRS available");
    textMessage = GPRS.readString();
    delay(10);
  }
     if (textMessage.indexOf("Message") >= 0)      {
   
      initmodem();
       GPRS.println("AT+CMGS=\"+33700000000\"");
      delay(500);
      GPRS.print("Message.\r");
      GPRS.write( 0x1a );
    }
}


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

dans la partie setup comme vous pouvez le constater.. j'envoie un message .... ca...ca fonctionne parfaitement ! le message part et je le recois sur mon telephone.

par contre dans le loop..

if (GPRS.available() > 0) {
Serial.println("GPRS available");
textMessage = GPRS.readString();
delay(10);
}
le gprs n'est jamais available !????

auriez vous une idée ??
merci d'avance.
excellente journée

vous avez une MEGA donc ne pas utiliser SoftwareSerial, prenez un vrai port Série matériel (Serial1 ou Serial2 u Serial3) à la place.

sinon votre code posté est incomplet. Où est la fonction sendData() ?

Que doit recevoir le GPRS ? le modem communique-t-il une réponse aux commandes (mode écho ?)
comment est-il alimenté ?

bonjour,
oui effectivement le code est incomplet car le problème est bien cerné, le test gprs available n'est jamais validé, donc c'est comme si le modem n'envoyait rien, alors que les branchements fonctionnement puisqu'il est capable d'envoyer un sms.. je ne vois qu'un probleme de serial.software

je vais essayer de comprendre la communication des ports série du mega... mais mes connaissances sont très limitées....

j'ai tenté de modifier .... en fait j'ai remplacé le gprs serial par Serial3
j'ai donc utilisé les pin 14 et 15 de mon mega, et j'ai branché TX avec RX et inverserment..

j'obtient maintenant l'affichage (sur mon moniteur de port serie) des commandes AT qui devaient aller au modem..
dingue... et pour couronner le tout, le sms qui s'envoyait... ne s'envoie plus !?!?!

#include <SoftwareSerial.h>
#include <EEPROM.h>


String textMessage;

String data[5];
#define DEBUG true
String state, timegps, latitude, longitude;

void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);

  initmodem();
  Serial3.println("AT+CMGS=\"+33786000000\"");
  delay(500);
  Serial3.print("Message.\r");
  Serial3.write( 0x1a );

}
void loop() {

  if (Serial3.available() > 0) {
    Serial.println("Serial3 available");
    textMessage = Serial3.readString();
    delay(10);
  }

  if (textMessage.indexOf("Message") >= 0)      {

    initmodem();
    Serial3.println("AT+CMGS=\"++33786000000\"");
    delay(500);
    Serial3.print("Message recu .\r");
    Serial3.write( 0x1a );
  }
}

void sendTabData(String command , const int timeout , boolean debug) {
  data[1] = "";
  data[2] = "";
  data[3] = "";
  data[4] = "";
  Serial3.println(command);
  long int time = millis();
  int i = 0;
  while ((time + timeout) > millis()) {
    while (Serial3.available()) {
      char c = Serial3.read();
      if (c != ',') {
        data[i] += c;
        delay(100);
      } else {
        i++;
      }
      if (i == 5) {
        delay(100);
        goto exitL;
      }
    }
} exitL:
  if (debug) {
    state = data[1];
    timegps = data[2];
    latitude = data[3];
    longitude = data[4];
  }
}
String sendData (String command , const int timeout , boolean debug) {
  String response = "";
  Serial3.println(command);
  long int time = millis();
  int i = 0;

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


void initmodem() {
  Serial3.print("AT+CMGF=1\r\n");
  delay(1000);
  Serial3.print("AT+CNMI=2,2,0,0,0\r\n");
  delay(1000);
  Serial3.print("AT+CMGF=1\r");
  delay(400);
  sendData("AT+CGNSPWR=1", 1000, DEBUG);
  delay(50);
  sendData("AT+CGNSSEQ=RMC", 1000, DEBUG);
  delay(150);
}

je nage complement avec ce mega....
désolé mais merci d'avance pour votre patience

Avez vous un shield qui s'emboîte sur l'Arduino ou un module à part ?

Pour la partie Série ce n'est pas compliqué à comprendre, l'Arduino UNO n'a qu'un seul port série (port USB reliées aux pins 0 et 1), vous discutez sur ce port en utilisant Serial (en faisant Serial.print() par exemple)

Comme ce port série est utilisé pour parler avec votre ordinateur, vous ne pouviez pas connecter le port série de votre SIM808 sur Serial et donc comme il n'y a pas d'autre port série matériel sur la UNO, vous avez dû "simuler" un port série sur les pins 9 et 10 en faisant

#include <SoftwareSerial.h>
SoftwareSerial GPRS(9, 10);

L'arduino Mega est mieux doté que votre Arduino Uno, il a 4 ports série. Le "même" Serial que sur votre UNO qui est sur le port USB reliées aux pins 0 et 1 mais 3 autres aussi:

Serial1: 19(Rx), 18(Tx)
Serial2: 17(Rx), 16(Tx)
Serial3: 15(Rx), 14(Tx)

donc au lieu de faire un port série virtuel, la recommandation est de prendre un des ports matériels qui est beaucoup plus robuste et efficace. Il suffit de remplacer la définition de votre variable GPRS (les 2 lignes copiées plus haut) par

#define GPRS Serial1

le Début de votre code devient donc

#include <EEPROM.h>
#define GPRS Serial1

String textMessage;
...

A noter que ces ports communiquent en 5V, comme sur la UNO. la SIM808 attend du 3.3V. avez vous une adaptation de tension ?

Nos messages se sont croisés

j'obtient maintenant l'affichage (sur mon moniteur de port serie) des commandes AT qui devaient aller au modem..
dingue...

c'est sans doute l'écho qui est activé. le modem répète les commandes.

ensuite avec des délais et des readString ce n'est pas top pour gérer le port série... Vous pouvez jeter un oeil à mon petit tuto sur le sujet de la gestion du port série en écoute

votre usage de la classe String peut conduire à des soucis mémoire

votre gestion du temps n'est pas idéale on évite de faire  while ((time + timeout) > millis()) {et on travaille par soustraction pour éviter des soucis de débordements(millis() - time >= timeout)

ensuite les goto ne sont pas tellement bien vus en C++...

Ohhhh.. merci de votre gentillesse d'avoir corrigé mon listing...

ah bah non.. j'ai rien prévu pour faire chuter la tension... heureusement que vous me le dites... déjà qu'il parle pas beaucoup.. alors si en plus il a chaud... lol je ne suis pas rendu... une simple résistance de série devrait suffir non ?

vous pouvez faire un pont diviseur avec 2 résistances en effet pour adapter la tension, ce qui compte c'est surtout dans le sens Tx(arduino) ---> Rx(SIM808) car vous ne voulez pas balancer 5V

en réception, recevoir 3.3V sera OK et sera (sans doute) vu comme un HIGH.

décrivez comment tout est connecté et alimenté

re,
ok pour le pont diviseur.. ca doit etre jouable avec mes connaissances.

l'arduino mega est alimenté pour l'instant en usb mais au final sera alimenté par une alimentation stabilisé 12V 32 amperes soit largement suffisant pour l'alimentation.

j'ai mis une masse commune entre l'arduino et le modem. par contre effectivement je n'ai pas regulé la tension d'alimentation.

je continue de chercher un peu et je viendrai vous faire part de mes avancees.

merci encore pour tout.

Excellente journée

32A c'est gigantesque pour un arduino (mais qui peut le plus...). Vous avez un gros truc à côté à alimenter ?

le GSM a besoin d'une alimentation séparée, stabilisée capable de fournir 2A en pic. il ne faut pas passer par la pin 5V de l'arduino.