Los módulos usados son;
Arduino nano V3.0
Módulo GPS de SkyLab
Módulo WaveCom GSM
La librería SoftwareSerial, TinyGPS se utilizan para comunicarse con módulos.
Cuando el dispositivo de números de teléfono registrado, devuelve la lat, lon y el enlace de GoogleMaps en un sms =)
Código fuente es:
código de < >
#include < TimerOne.h >
#include < TinyGPS.h >
#include < SoftwareSerial.h >
TinyGPS gps;
GsmSerial SoftwareSerial (2, 3);
SoftwareSerial ss(5,6);
Cadena inData = "";
Boolean inputAvailable = 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 cadena = "";
int callback_counter = 0;
int indexofMsgStr = 0;
flotador, flon, fkmph;
edad largo sin firmar;
char okunanKarakter = ' *';
Float flat_store = 0.0;
Float flon_store = 0.0;
Boolean gsmdinle = false;
void setup()
{
Delay(30000);
Serial.Begin(9600);
SS.Begin(9600);
gsmSerial.begin(9600);
Timer1.Initialize(8388480); unos 8,3 segundos
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() / / ejecuta una y otra vez
{
while(gsmSerial.Available())
{
inputAvailable = true;
okunanKarakter = (char) gsmSerial.read();
inData += okunanKarakter;
Si (okunanKarakter == ',') {}
rotura;
}
}
if(inputAvailable)
{
inputAvailable = false;
processData();
inData = "";
}
}
void printGPSDATA() {}
GPS.f_get_position (plano y flon & edad);
Si (plano > 0.0)
flat_store = plana;
Si (flon > 0.0)
flon_store = flon;
fkmph = gps.f_speed_kmph(); velocidad en km/hr
}
void TAKEGPSDATA() {}
Serial.println ("---> TAKEGPSDATA");
Boolean gps_valid = false;
SS.Listen();
Delay(1000);
para (int i = 0; i < 200; i ++)
{
if(!gps_valid)
{
mientras (ss.available())
{
char c = ss.read();
¿Si (gps.encode(c)) / / llegó una nueva frase válida?
{
printGPSDATA();
gps_valid = true;
rotura;
}
}
Delay(5);
}
}
gsmSerial.listen();
Delay(1000);
Serial.println ("<---TAKEGPSDATA");
}
void processData() {}
Serial.println(inData);
if(IsRinging())
{/ / Telefono caliyor
Serial.println ("telefon caliyor");
indexofMsgStr = inData.indexOf("05");
recievedNumber = inData.substring (indexofMsgStr, indexofMsgStr + 11);
Serial.Print ("número =");
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)
{
retorno 1;
}
otra cosa
{
return 0;
}
}
int IsAdminNumber()
{
if(ADMIN_PHONE_NUMBER_1 == recievedNumber)
{
retorno 1;
}
otro if(ADMIN_PHONE_NUMBER_2 == recievedNumber)
{
retorno 1;
}
otro if(ADMIN_PHONE_NUMBER_3 == recievedNumber)
{
retorno 1;
}
otro if(ADMIN_PHONE_NUMBER_4 == recievedNumber)
{
retorno 1;
}
return 0;
}
void callback()
{
callback_counter ++;
Si (callback_counter > = 80)
{
Serial.Print ("devolución de llamada ok!");
callback_counter = 0;
TAKEGPSDATA();
}
}
< / código >