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
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
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
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:
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
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.
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.