Les modules utilisés sont ;
Arduino nano V3.0
Module GPS SkyLab
Module GSM WaveCom
La bibliothèque de SoftwareSerial, les TinyGPS sont utilisés pour communiquer avec les modules.
Quand j’ai appelé le dispositif de numéros de téléphone enregistrés, elle retourne le lat, lon et le lien googlemap dans un sms =)
Le Code source est :
< code >
#include < TimerOne.h >
#include < TinyGPS.h >
#include < SoftwareSerial.h >
TinyGPS gps ;
SoftwareSerial gsmSerial (2, 3) ;
SoftwareSerial ss(5,6) ;
Dim inData = "" ;
inputAvailable booléen = false ;
String ADMIN_PHONE_NUMBER_1 = « 05558233343 » ;
String ADMIN_PHONE_NUMBER_2 = « 05323342543 » ;
String ADMIN_PHONE_NUMBER_3 = « 05396933985 » ;
String ADMIN_PHONE_NUMBER_4 = « 05373624959 » ;
String recievedNumber = "" ;
Bora de String = "" ;
int callback_counter = 0 ;
int indexofMsgStr = 0 ;
flotteur plat, flon, fkmph ;
unsigned long âge ;
char okunanKarakter = ' *' ;
float flat_store = 0.0 ;
float flon_store = 0.0 ;
gsmdinle booléen = false ;
void setup()
{
Delay(30000) ;
Serial.Begin(9600) ;
SS.Begin(9600) ;
gsmSerial.begin(9600) ;
Timer1.Initialize(8388480) ; environ 8,3 secondes
Timer1.attachInterrupt(callback) ;
Delay(2000) ;
gsmSerial.listen() ;
Serial.println("Basla") ;
gsmSerial.println("AT+CLIP=1") ;
Delay(1000) ;
gsmSerial.println("ATE=0") ;
Delay(1000) ;
gsmSerial.listen() ;
}
void loop() / / run maintes et maintes
{
while(gsmSerial.available())
{
inputAvailable = true ;
okunanKarakter = (char) gsmSerial.read() ;
inData += okunanKarakter ;
Si (okunanKarakter == «, ») {}
rupture ;
}
}
if(inputAvailable)
{
inputAvailable = false ;
processData() ;
inData = "" ;
}
}
void printGPSDATA() {}
GPS.f_get_position (plat, flon & age) ;
Si (plat > 0.0)
flat_store = plat ;
Si (flon > 0.0)
flon_store = flon ;
fkmph = gps.f_speed_kmph() ; la vitesse en km/hr
}
void TAKEGPSDATA() {}
Serial.println ("---> TAKEGPSDATA") ;
gps_valid booléen = false ;
SS.Listen() ;
Delay(1000) ;
pour (int i = 0; i < 200; i ++)
{
if(!gps_valid)
{
tandis que (ss.available())
{
char c = ss.read() ;
Si (gps.encode(c)) / / une nouvelle phrase valide est venu ?
{
printGPSDATA() ;
gps_valid = true ;
rupture ;
}
}
Delay(5) ;
}
}
gsmSerial.listen() ;
Delay(1000) ;
Serial.println ("<---TAKEGPSDATA") ;
}
void processData() {}
Serial.println(inData) ;
if(IsRinging())
{/ / telefon caliyor
Serial.println ("telefon caliyor") ;
indexofMsgStr = inData.indexOf("05") ;
recievedNumber = inData.substring (indexofMsgStr, indexofMsgStr + 11) ;
Serial.Print ("reçu nombre =") ;
Serial.println(recievedNumber) ;
if(IsAdminNumber())
{
Serial.println ("admin ok!") ;
TAKEGPSDATA() ;
KoordinatBilgisiGonder() ;
}
}
}
void KoordinatBilgisiGonder() {}
Bora = "AT + CMGS = \" «; »
Bora += + "9" ;
Bora += recievedNumber ;
Bora += « \ » «; »
gsmSerial.println("AT+CMGF=1") ;
Delay(2000) ;
gsmSerial.println(bora) ;
Delay(1000) ;
gsmSerial.print ("ENLEM =") ;
gsmSerial.println(flat_store,6) ;
gsmSerial.print ("BOYLAM =") ;
gsmSerial.println(flon_store,6) ;
gsmSerial.print ("HIZ =") ;
gsmSerial.print(fkmph) ;
gsmSerial.println ("km/saat ») ;
gsmSerial.println ("LINK =") ;
gsmSerial.print ("http://maps.google.com/?ie=UTF8 & hq = & ll =") ;
gsmSerial.print(flat_store,6) ;
gsmSerial.print(",") ;
gsmSerial.print(flon_store,6) ;
gsmSerial.print ("& z = 20") ;
gsmSerial.write(26) ;
}
int IsRinging()
{
Si (inData.indexOf("CLIP:") > = 0)
{
Return 1 ;
}
d’autre
{
return 0 ;
}
}
int IsAdminNumber()
{
if(ADMIN_PHONE_NUMBER_1 == recievedNumber)
{
Return 1 ;
}
d’autre if(ADMIN_PHONE_NUMBER_2 == recievedNumber)
{
Return 1 ;
}
d’autre if(ADMIN_PHONE_NUMBER_3 == recievedNumber)
{
Return 1 ;
}
d’autre if(ADMIN_PHONE_NUMBER_4 == recievedNumber)
{
Return 1 ;
}
return 0 ;
}
callback() Sub
{
callback_counter ++ ;
Si (callback_counter > = 80)
{
Serial.Print ("rappel ok!") ;
callback_counter = 0 ;
TAKEGPSDATA() ;
}
}
< /code >