GPS/RPS : Différence entre versions
De FunLab Documentation
(Page créée avec « {{Projets |status=Idée |image=Image shield.jpg |license=CC-by-sa-3.0 |Createur=Thomas, }} Ce projet utilise un arduino uno et un shield GPS/GPRS afin de récupérer des c... ») |
|||
Ligne 1 : | Ligne 1 : | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Ce projet utilise un arduino uno et un shield GPS/GPRS afin de récupérer des coordonnées GPS et les envoyer par SMS. | Ce projet utilise un arduino uno et un shield GPS/GPRS afin de récupérer des coordonnées GPS et les envoyer par SMS. | ||
Version actuelle datée du 20 avril 2017 à 09:38
Ce projet utilise un arduino uno et un shield GPS/GPRS afin de récupérer des coordonnées GPS et les envoyer par SMS.
Update: fichiers a jour, description à venir
Lien du produit pour plus d'information : http://www.lextronic.fr/P34213-platine-shield-25ggsmgprs--gps.html (ou voir cette archive pour du code... moins à jour, forcémment!)
Reception_SMS.ino
#include <SoftwareSerial.h> //Librairie utilisée pour communiquer avec le shield GSM/GPRS
// Initialisation du module GSM/GPRS
// Initialisation du port série 7 et 8 pour communiquer avec le shield GPRS
SoftwareSerial mySerial(7, 8);
// Mémoire tampon de type string pour les messages du shield GPRS
String msg = String("");
// Est mis à 1 quand le prochain message du shield GPRS contiendra le contenu du SMS
int SmsContentFlag = 0;
//*******************************************************
// VARIABLES A MODIFIER AVEC SES DONNEES PERSOS
//*******************************************************
// Code PIN de la carte SIM qui s'insère dans le shield GSM : A remplacer !
String SIM_PIN_CODE = String( "5005" );
//**************************************************
// FONCTION PRINCIPALE SETUP D'INITIALISATION
//**************************************************
void setup()
{
Serial.begin(19200);
mySerial.begin(19200);
delay(100);
mySerial.println("ATZ");
mySerial.println("AT"); // Envoi d'une commande pour configuration du debit automatique
delay(1000);
mySerial.println("AT+IPR=19200"); // Mise en mémoire du débit
delay(1000);
mySerial.print("AT+CPIN="); // Envoi du code PIN retourne ERREUR si il est déjà présent (ce qui n'est pas grave...)
mySerial.println( SIM_PIN_CODE );
delay(1000);
mySerial.println("AT+CNMI=2,2,0,0,0");
mySerial.println("AT+CMGF=1"); // GSM en mode texte
}
//**************************************************************************************************************
//FONCTION PRINCIPALE LOOP QUI S'EXECUTE EN BOUCLE (COEUR DU PROGRAMME) ATTEND LES INFORMATIONS DU SHIELD GSM
//**************************************************************************************************************
void loop()
{
char SerialInByte;
if(Serial.available())
{
mySerial.print((unsigned char)Serial.read());
}
else if(mySerial.available())
{
char SerialInByte;
SerialInByte = (unsigned char)mySerial.read();
// Si le message se termine par un <CR> alors traiter le message
if( SerialInByte == 13 )
{
// Stocke le caractère dans le buffer de message
ProcessGprsMsg();
}
if( SerialInByte == 10 ){ }
else
{
// Stocke le caractère dans la mémoire tampon réservé au message
msg += String(SerialInByte);
}
}
}
// FONCTION QUI EXECUTE UNE COMMANDE VERS LA VERA SUR LA BASE DU CONTENU D'UN SMS
//********************************************************************************************
// FONCTION QUI DEMANDE AU SHIELD GPRS D'UTILISER LE MODE TEXT POUR LES MESSAGES
//*******************************************************************************************
void GprsTextModeSMS()
{
mySerial.println( "AT+CMGF=1" );
}
// FONCTION QUI LIT LA POSITION DU SMS
//*******************************************
void GprsReadSmsStore( String SmsStorePos )
{
mySerial.print( "AT+CMGR=" );
mySerial.println( SmsStorePos );
}
// FONCTION QUI EFFACE LE CONTENU DE LA MEMOIRE TAMPON DES MESSAGES DU GPRS SHIELD
//*********************************************************************************************
void ClearGprsMsg()
{
msg = "";
}
//***************************************************************************************
// FONCTION QUI INTERPRETE LES MESSAGES DU SHIELD GPRS ET AGIT EN CONSEQUENCE
//***************************************************************************************
void ProcessGprsMsg()
{
// Message non sollicité quand un SMS arrive
// Lecture du stockage SMS via l'UART (résultat de la requete GprsReadSmsStore)
if( msg.indexOf( "+CMT:" ) >= 0 )
{
// Le prochain message contiendra le contenu du SMS
SmsContentFlag = 1;
// Les ligne suivantes sont essentielle pour ne pas effacer le flag!
ClearGprsMsg();
return;
}
// le message +CMGR précédent indiquait que le message suivant du Shield GPRS contient le corps du SMS
if( SmsContentFlag == 1 )
{
String latitude = msg.substring(0,10);
String longitude = msg.substring(11,21);
Serial.print(100);
Serial.println(latitude);
delay(500);
Serial.print(10000);
Serial.println(longitude);
}
ClearGprsMsg();
// Toujours mettre le flag à 0
SmsContentFlag = 0;
}
Code pour récupérer les trames GPS
GPS_via_SMS.ino
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
int RXPin = 2;
int TXPin = 3;
int GPSBaud = 4800;
TinyGPSPlus gps;
SoftwareSerial gpsSerial(RXPin, TXPin);
SoftwareSerial Sara(10,11);
#define DEBUG // Mode debogage
// Initialisation
//*******************************************************************************************************
void setup()
{
// GPRS
//*******************************************************************************************************
Sara.begin(115200);
Serial.begin(115200);
gpsSerial.begin(GPSBaud);
Sara.println("verification de l'etat GPRS");
Serial.println("AT+CGATT?");
GetSara();
Sara.println("verification de la connection au reseau GPRS");
Serial.println("AT+UPSND=0,8"); // Pour afficher le numero de l'erreur
GetSara();
Sara.println("configuration par default");
Serial.println("ATZ");
GetSara();
Sara.println("affichage erreur");
Serial.println("AT+CMEE=1");
GetSara();
Sara.println("Code Pin");
Serial.println("AT+CPIN=\"5005\""); // Code PIN
GetSara();
delay(1000); // Connexion au reseau
#ifdef DEBUG
Serial.println("AT+CSQ");//état de la connection
Sara.println("Operateur");
Serial.println("AT+COPS?"); // Operateur
GetSara();
delay(2000);
//numero du centre operateur
Sara.println("envoi de la commande: AT+CSCA=\"+33770499999\"");
Serial.print("AT+CSCA=\"+33770499999\"\r");
GetSara();
delay(2000); // Connexion au reseau
Sara.println("Etat de la connexion au reseau :");
Sara.println("La connexion est etablie si +CREG: 0,1");
Serial.println("AT+CREG?"); // Connexion au reseau
GetSara();
#endif
Sara.println("Activation du mode SMS");
Serial.println("AT+CMGF=1"); // Activation du mode SMS
GetSara();
Sara.println("Envoi du numero de telephone");
Serial.println("AT+CMGS=\"+33*********\""); // Envoi du numero de telephone
GetSara();
delay(500);
Sara.println("Corps du message");
Serial.println("Debut de l'envoie SMS :)"); // Corps du message
Sara.println("CTR+Z");
Serial.write(0x1A); // CTR+Z
GetSara();
delay(500);
}
//fin du setup
// Envoie des Trames par SMS
//***************************************************************************************************
void loop()
{
while(gpsSerial.available() > 0)
if (gps.encode(gpsSerial.read()))
sms();
if (millis() > 5000 && gps.charsProcessed() < 10) //Toutes les 5 secondes passées et si aucun caractère n'arrive alors montre "Aucun GPS Detecté"
{
Serial.println(F("Aucun GPS n'est detecte"));
while(true); // instruction à répéter jusqu'a l'infini
}
delay(500);
}
//**********************************//GPS//*******************************************************
void LectureTrames()
{
if (gps.location.isValid())
{
delay(500);
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("Donnees Invalides"));
}
Serial.println();
}
// Contenu du SMS
//**************************************************************************************************
void sms()
{
//06*** devient 336***, 07*** devient 337***, 09***=>339*** +33 est l'indicatif FR...
//33********* numéro Antoine
//33********* numéro Dwayne
Serial.println("AT+CMGS=\"+33*********\""); // Envoi du numero de telephone
LectureTrames();
Serial.write(0x1A);
}
// Lecture pour le moniteur série
//***************************************************************************************************
void GetSara()
{
delay(500);
if(Sara.available())
{
Sara.print("\n");
delay(500);
while(Sara.available())
{
Sara.print((char)Sara.read()); // On vide la memoire tampon du SIM900
}
Sara.print("\n");
}
}