Bonjour,
Je souhaite creer un programme qui lorsqu’on lui envoie un SMS (par exemple “g”), ça renvoie la position GPS.
J’arrive, séparément, à récupérer les positions GPS et répondre à un SMS.
Mais dès qu’il s’agit de “mélanger” les 2, plus rien ne fonctionne, et le problème n’est jamais identique…
Mon code qui ne fonctionne pas :
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs
#include "SIM900.h"
#include "sms.h"
#include "SoftwareSerial.h"
#include "TinyGPS.h"
SMSGSM sms;
TinyGPS gps;
SoftwareSerial nss(6, 9); // Yellow wire to pin 6
boolean started=false;
char smsbuffer[160];
char n[20];
float lat=0,lon=0;
char message[100];
void setup()
{
nss.begin(4800); // baud rate GP
//Serial connection.
Serial.begin(115200);
Serial.println("GSM Shield testing.");
//Start configuration of shield with baudrate.
if (gsm.begin(19200)){
Serial.println("\nstatus=READY");
started=true;
}
else Serial.println("\nstatus=IDLE");
delay(4000);
if(started)
{
delsms();
//Enable this two lines if you want to send an SMS.
if (sms.SendSMS("************", "Arduino correctement initialise !"))
Serial.println("\nSMS envoye");
}
//
}
// Get and process GPS data
void gpsdump(TinyGPS &gps, float* lat, float * lon) {
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age); // fonction prédéfinie qui récupère les données GPS
Serial.print(flat, 4); Serial.print(", "); // affiche latitude
Serial.println(flon, 4); // affiche longitude
*lat=flat;
*lon=flon;
}
// Feed data as it becomes available
bool feedgps() { // vérifie que le système est disponible
while (nss.available()) {
if (gps.encode(nss.read()))
return true;
}
return false;
}
void loop()
{
unsigned long start = millis();
char SerialInByte;
bool newdata = false;
int pos=0;
//Serial.println("Loop");
if(started){
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
Serial.println("IsSMSPresent at pos ");
Serial.println(pos);
sms.GetSMS(pos,n,smsbuffer,100);
Serial.println(n);
Serial.println(smsbuffer);
if(!strcmp(smsbuffer,"R")){
if(sms.SendSMS(n, "SMS recu par Arduino")==1) Serial.println("Message envoye");
else Serial.println("Erreur : message pas envoye.");
while (millis() - start < 5000)
{ // Update toutes les 5 secondes
if (feedgps()) // verifie que le système est disponible
newdata = true; //booleen indiquant que la donnée existe
}
if (newdata)
{ // si la donnée existe, on récupère les coordonnées et on les affiche
gpsdump(gps,&lat,&lon);
sprintf(message,"La lattitude est %d.%d, la longitude est %d.%d.",(int)lat,(int)((lat-(int)lat)*10000),(int)lon,(int)((lon-(int)lon)*10000));
}
}
else
{
if(sms.SendSMS(n, "Ce code ne correspond a rien.")==1) Serial.println("Message envoye");
else Serial.println("Erreur : message pas envoye.");
}
delsms();
}
}
};
void delsms(){
Serial.println("delsms");
for (int i=0; i<10; i++){ //do it max 10 times
int pos=sms.IsSMSPresent(SMS_ALL);
if (pos!=0){
Serial.print("\nFind SMS at the pos ");
Serial.println(pos);
if (sms.DeleteSMS(pos)==1){
Serial.print("\nDeleted SMS at the pos ");
Serial.println(pos);
}
else
{
Serial.print("\nCant del SMS at the pos ");
Serial.println(pos);
}
}
}
}
(1) Ce code affiche dans la console :
Voir PJ1.
(2) Si j’enlève ça :
while (millis() - start < 5000)
{ // Update toutes les 5 secondes
if (feedgps()) // verifie que le système est disponible
newdata = true; //booleen indiquant que la donnée existe
}
if (newdata)
{ // si la donnée existe, on récupère les coordonnées et on les affiche
gpsdump(gps,&lat,&lon);
sprintf(message,"La lattitude est %d.%d, la longitude est %d.%d.",(int)lat,(int)((lat-(int)lat)*10000),(int)lon,(int)((lon-(int)lon)*10000));
}
Le serial me dit que le SMS est envoyé mais je ne le reçois pas.
(3) Si en plus j’enlève les 2 sous programmes du GPS. Là je reçois le SMS, de plus je peux lui envoyer des SMS et il me répond.
Ce qui n’est absolument pas logique, car à ce moment là les 2 sous programmes ne sont plus appelés, car j’ai enlevé la partie (2).
Je n’y comprend rien, je n’arrive à isoler le problème.
Si vous pouviez m’éclairer pour y voir plus clair.
Merci