GPS Tracker no Arduino MEGA + SIM908 via GPRS
3 participantes
Página 1 de 1
GPS Tracker no Arduino MEGA + SIM908 via GPRS
Olá pessoal.
Após vários testes com o módulo SIM908 no Arduino Mega, consegui fazer funcionar todo o projeto. O projeto completo tem um display touch para apresentar informações trocadas com o servidor.
Esta parte do projeto contempla somente a captura e envio das informações que são enviadas utilizando o método GET: carID, latitude e longitude. via GPRS.
A ligação do Arduino ao módulo SIM908 deve ser feita conforme o Admin apresentou. Uma ligação dos pinos dos jumpers que definem as seriais do módulo SIM908, para o Arduino Mega: pino 2 ao D16 e o 6 ao D17 utilizando a serial2 do Arduino Mega, deixando a serial0 para comunicação com a USB para Serial monitor.
É um apanhado de muitos vários recursos discutidos aqui no fórum e na internet afora.
Ótimos projetos pra todos.
____________________________________________________________________________________________________
#define BUF_LEN 200
int powerkey = 5;
int statuspin = 6;
int pinState = 0;
int verifica = 0;
String id = "sku33";
int vel = 0;
byte n;
String hora, lats1, lats2, lons1, lons2, velo, cood, ctrl, latitude, longitude, velocidade;
float lat1, lon1, lat2, lon2, lat, lon;
byte num_of_bytes;
char comm_buf[BUF_LEN];
char bufferString[10];
bool enviandoDados = false;
String inputString = "";
int firstCharacter;
bool conectado = false;
String apn = "tim.com.br";
String user = "tim";
String pass = "tim";
void setup()
{
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
Serial.begin(9600);
Serial2.begin(9600);
}
void loop()
{
pinState = digitalRead(statuspin);
if (pinState == LOW) {
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
if (Serial.available())
{
Serial2.write(Serial.read());
}
else if (Serial2.available())
{
Serial.write(Serial2.read());
}
if (verifica == 0) {
Serial2.println("AT+CGPSPWR=0");
delay(1000);
Serial2.println("AT+CGPSPWR=1");
delay(1000);
Serial2.println("AT+CGPSRST=0");
delay(1000);
verifica = 1;
Serial2.flush();
}
latitude = "";
longitude = "";
velocidade = "";
ctrl = "";
limpa_buffer();
Serial2.flush();
delay(500);
Serial2.println("AT+CGPSINF=32");
delay(4000);
leSerial();
memset(bufferString, '\0', 10);
latitude = dtostrf(lat, 6, 4, bufferString);
memset(bufferString, '\0', 10);
longitude = dtostrf(lon, 6, 4, bufferString);
if (ctrl == "S") {
Serial.println("A partir daqui sao enviados os dados pelo GPRS");
enviandoDados = true;
enviadados();
delay(3000);
}
}
void limpa_buffer()
{
memset(comm_buf, '\0', BUF_LEN);
}
void enviadados()
{
Serial2.flush();
delay(500);
Serial.println("Verifica Conexao");
Serial2.println("AT+CIFSR");
delay(200);
Serial.print("Lendo retorno de CIFSR: ");
leSerial2("AT+CIFSR");
http://Serial.println(inputString);
firstCharacter = inputString.indexOf('E');
if (inputString.startsWith("ERROR", firstCharacter)) {
Serial.println("Comando AT+CSTT");
Serial2.println("AT+CSTT=\"" + apn + "\",\"" + user + "\",\"" + pass + "\"");
leSerial2("AT+CSTT");
delay(2000);
Serial2.println("AT+CIICR");//conexao com o GPRS
delay(2000); //espera resultado na serial
leSerial2("AT+CIICR");
limpa_buffer();
Serial2.println("AT+CIFSR");//Pegar IP local
delay(2000); //espera resultado na serial
leSerial2("AT+CIFSR");
limpa_buffer();
Serial2.println("AT+CDNSCFG?");//Configuracao do dominio do servidor
delay(2000); //espera resultado na serial
leSerial2("AT+CDNSCFG?");
limpa_buffer();
conectado = true;
} else {
Serial.println("Modulo conectado");
Serial2.println("AT+CIPSTART=\"tcp\",\"dominio.com.br\",\"9080\""); //inicia conexao TCP
delay(4000); //espera resultado na serial
leSerial2("AT+CIPSTART=");
limpa_buffer();
Serial2.println("AT+CIPSEND");//inicia envio de dados
delay(4000);
leSerial2("AT+CIPSEND");
limpa_buffer();
Serial.print("User a ser enviado: ");
Serial.println(id);
Serial.print("Latitude a ser enviada: ");
Serial.println(latitude);
Serial.print("Longitude a ser enviada: ");
Serial.println(longitude);
Serial2.println("GET http://dominio.com.br/mnsshield/position?carId=" + id + "&latitude=" + latitude + "&longitude=" + longitude + "\"");
delay(3000);
leSerial2("GET ");
Serial2.write(0x0D); // ctrl+m CR - Carriage Return
delay(1000);
Serial2.write(0xaA); // ctrl+j LF - Line Feed
delay(1000);
Serial2.write(0x1A); // ctrl+z End of Message
delay(1000);
leSerial2("Hexas");
delay(1000);
Serial2.flush();
enviandoDados = false;
leSerial2("Final");
}
}
void leSerial2(String nome)
{
Serial.print("Nome do comando : ");
Serial.println(nome);
num_of_bytes = Serial2.available(); //Pega quantidade de bytes que estao na serial
delay(500);
Serial.print("Numero de bytes no metodo leSerial2: ");
Serial.println(num_of_bytes);
while (Serial2.available() > 0) //Espera ate que serial possua bytes
{
for (n = 0; n < 200; n++)
{
comm_buf[n] = Serial2.read();
}
}
Serial.println("");
Serial.println("Inicio conteudo da leSerial2: ");
for (int i = 0; i < num_of_bytes; i++) {
Serial.print(comm_buf[i]);
}
delay(500);
Serial.println("");
Serial.println("Final conteudo da leSerial2: ");
}
void leSerial()
{
num_of_bytes = Serial2.available(); //Pega quantidade de bytes que estao na serial
Serial.println("");
Serial.print("Numero de bytes na serial: ");
Serial.println(num_of_bytes);
while (Serial2.available() > 0) //Espera atà que serial possua bytes
{
for (n = 0; n < num_of_bytes; n++)
{
comm_buf[n] = Serial2.read();
}
}
if (n == 63) {
//Se o n for menor que 63 descarta pacote
cood = comm_buf;
ctrl = cood.substring(30, 31);
hora = cood.substring(6, 11);
lats1 = cood.substring(18, 20);
lats2 = cood.substring(20, 29);
lons1 = cood.substring(32, 34);
lons2 = cood.substring(34, 43);
velo = cood.substring(46, 48);
vel = velo.toFloat();
lat1 = lats1.toFloat();
lat2 = lats2.toFloat();
lon1 = lons1.toFloat();
lon2 = lons2.toFloat();
lat = (lat1 + (lat2 / 60)) * -1;
lon = (lon1 + (lon2 / 60)) * -1;
latitude = String(lat);
longitude = String(lon);
velocidade = String(velo);
Serial.print("Coordenada: ");
Serial.print(cood);
Serial.print("\n\n");
Serial.print("Ctrl: ");
Serial.print(ctrl);
Serial.print(" <> Hora: ");
Serial.print(converterSegundoHora(hora.toInt()));
Serial.print(" <> lat: ");
Serial.print(lat, ;
Serial.print(",");
Serial.print(" <> lon: ");
Serial.print(lon, ;
Serial.print(" <> vel: ");
Serial.print(vel);
Serial.print("\n");
}
leSerial2("Metodo leSerial");
Serial2.flush(); //limpa buffer de entrada da serial
limpa_buffer();
}
void ShowSerialData()
{
while (Serial2.available() != 0)
Serial.write(Serial2.read());
}
String converterSegundoHora(long seconds)
{
int days, hours, minutes;
days = seconds / 60 / 60 / 24;
hours = (seconds / 60 / 60) % 24;
minutes = (seconds / 60) % 60;
seconds = seconds % 60;
return String(hours);
}
Após vários testes com o módulo SIM908 no Arduino Mega, consegui fazer funcionar todo o projeto. O projeto completo tem um display touch para apresentar informações trocadas com o servidor.
Esta parte do projeto contempla somente a captura e envio das informações que são enviadas utilizando o método GET: carID, latitude e longitude. via GPRS.
A ligação do Arduino ao módulo SIM908 deve ser feita conforme o Admin apresentou. Uma ligação dos pinos dos jumpers que definem as seriais do módulo SIM908, para o Arduino Mega: pino 2 ao D16 e o 6 ao D17 utilizando a serial2 do Arduino Mega, deixando a serial0 para comunicação com a USB para Serial monitor.
É um apanhado de muitos vários recursos discutidos aqui no fórum e na internet afora.
Ótimos projetos pra todos.
____________________________________________________________________________________________________
#define BUF_LEN 200
int powerkey = 5;
int statuspin = 6;
int pinState = 0;
int verifica = 0;
String id = "sku33";
int vel = 0;
byte n;
String hora, lats1, lats2, lons1, lons2, velo, cood, ctrl, latitude, longitude, velocidade;
float lat1, lon1, lat2, lon2, lat, lon;
byte num_of_bytes;
char comm_buf[BUF_LEN];
char bufferString[10];
bool enviandoDados = false;
String inputString = "";
int firstCharacter;
bool conectado = false;
String apn = "tim.com.br";
String user = "tim";
String pass = "tim";
void setup()
{
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
Serial.begin(9600);
Serial2.begin(9600);
}
void loop()
{
pinState = digitalRead(statuspin);
if (pinState == LOW) {
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
if (Serial.available())
{
Serial2.write(Serial.read());
}
else if (Serial2.available())
{
Serial.write(Serial2.read());
}
if (verifica == 0) {
Serial2.println("AT+CGPSPWR=0");
delay(1000);
Serial2.println("AT+CGPSPWR=1");
delay(1000);
Serial2.println("AT+CGPSRST=0");
delay(1000);
verifica = 1;
Serial2.flush();
}
latitude = "";
longitude = "";
velocidade = "";
ctrl = "";
limpa_buffer();
Serial2.flush();
delay(500);
Serial2.println("AT+CGPSINF=32");
delay(4000);
leSerial();
memset(bufferString, '\0', 10);
latitude = dtostrf(lat, 6, 4, bufferString);
memset(bufferString, '\0', 10);
longitude = dtostrf(lon, 6, 4, bufferString);
if (ctrl == "S") {
Serial.println("A partir daqui sao enviados os dados pelo GPRS");
enviandoDados = true;
enviadados();
delay(3000);
}
}
void limpa_buffer()
{
memset(comm_buf, '\0', BUF_LEN);
}
void enviadados()
{
Serial2.flush();
delay(500);
Serial.println("Verifica Conexao");
Serial2.println("AT+CIFSR");
delay(200);
Serial.print("Lendo retorno de CIFSR: ");
leSerial2("AT+CIFSR");
http://Serial.println(inputString);
firstCharacter = inputString.indexOf('E');
if (inputString.startsWith("ERROR", firstCharacter)) {
Serial.println("Comando AT+CSTT");
Serial2.println("AT+CSTT=\"" + apn + "\",\"" + user + "\",\"" + pass + "\"");
leSerial2("AT+CSTT");
delay(2000);
Serial2.println("AT+CIICR");//conexao com o GPRS
delay(2000); //espera resultado na serial
leSerial2("AT+CIICR");
limpa_buffer();
Serial2.println("AT+CIFSR");//Pegar IP local
delay(2000); //espera resultado na serial
leSerial2("AT+CIFSR");
limpa_buffer();
Serial2.println("AT+CDNSCFG?");//Configuracao do dominio do servidor
delay(2000); //espera resultado na serial
leSerial2("AT+CDNSCFG?");
limpa_buffer();
conectado = true;
} else {
Serial.println("Modulo conectado");
Serial2.println("AT+CIPSTART=\"tcp\",\"dominio.com.br\",\"9080\""); //inicia conexao TCP
delay(4000); //espera resultado na serial
leSerial2("AT+CIPSTART=");
limpa_buffer();
Serial2.println("AT+CIPSEND");//inicia envio de dados
delay(4000);
leSerial2("AT+CIPSEND");
limpa_buffer();
Serial.print("User a ser enviado: ");
Serial.println(id);
Serial.print("Latitude a ser enviada: ");
Serial.println(latitude);
Serial.print("Longitude a ser enviada: ");
Serial.println(longitude);
Serial2.println("GET http://dominio.com.br/mnsshield/position?carId=" + id + "&latitude=" + latitude + "&longitude=" + longitude + "\"");
delay(3000);
leSerial2("GET ");
Serial2.write(0x0D); // ctrl+m CR - Carriage Return
delay(1000);
Serial2.write(0xaA); // ctrl+j LF - Line Feed
delay(1000);
Serial2.write(0x1A); // ctrl+z End of Message
delay(1000);
leSerial2("Hexas");
delay(1000);
Serial2.flush();
enviandoDados = false;
leSerial2("Final");
}
}
void leSerial2(String nome)
{
Serial.print("Nome do comando : ");
Serial.println(nome);
num_of_bytes = Serial2.available(); //Pega quantidade de bytes que estao na serial
delay(500);
Serial.print("Numero de bytes no metodo leSerial2: ");
Serial.println(num_of_bytes);
while (Serial2.available() > 0) //Espera ate que serial possua bytes
{
for (n = 0; n < 200; n++)
{
comm_buf[n] = Serial2.read();
}
}
Serial.println("");
Serial.println("Inicio conteudo da leSerial2: ");
for (int i = 0; i < num_of_bytes; i++) {
Serial.print(comm_buf[i]);
}
delay(500);
Serial.println("");
Serial.println("Final conteudo da leSerial2: ");
}
void leSerial()
{
num_of_bytes = Serial2.available(); //Pega quantidade de bytes que estao na serial
Serial.println("");
Serial.print("Numero de bytes na serial: ");
Serial.println(num_of_bytes);
while (Serial2.available() > 0) //Espera atà que serial possua bytes
{
for (n = 0; n < num_of_bytes; n++)
{
comm_buf[n] = Serial2.read();
}
}
if (n == 63) {
//Se o n for menor que 63 descarta pacote
cood = comm_buf;
ctrl = cood.substring(30, 31);
hora = cood.substring(6, 11);
lats1 = cood.substring(18, 20);
lats2 = cood.substring(20, 29);
lons1 = cood.substring(32, 34);
lons2 = cood.substring(34, 43);
velo = cood.substring(46, 48);
vel = velo.toFloat();
lat1 = lats1.toFloat();
lat2 = lats2.toFloat();
lon1 = lons1.toFloat();
lon2 = lons2.toFloat();
lat = (lat1 + (lat2 / 60)) * -1;
lon = (lon1 + (lon2 / 60)) * -1;
latitude = String(lat);
longitude = String(lon);
velocidade = String(velo);
Serial.print("Coordenada: ");
Serial.print(cood);
Serial.print("\n\n");
Serial.print("Ctrl: ");
Serial.print(ctrl);
Serial.print(" <> Hora: ");
Serial.print(converterSegundoHora(hora.toInt()));
Serial.print(" <> lat: ");
Serial.print(lat, ;
Serial.print(",");
Serial.print(" <> lon: ");
Serial.print(lon, ;
Serial.print(" <> vel: ");
Serial.print(vel);
Serial.print("\n");
}
leSerial2("Metodo leSerial");
Serial2.flush(); //limpa buffer de entrada da serial
limpa_buffer();
}
void ShowSerialData()
{
while (Serial2.available() != 0)
Serial.write(Serial2.read());
}
String converterSegundoHora(long seconds)
{
int days, hours, minutes;
days = seconds / 60 / 60 / 24;
hours = (seconds / 60 / 60) % 24;
minutes = (seconds / 60) % 60;
seconds = seconds % 60;
return String(hours);
}
Evandro Barroso Gaio- Mensagens : 7
Data de inscrição : 23/06/2015
Idade : 61
Conectar GPRS
Boa noite, muito bom seu projeto, estou fazendo um semelhante com o Arduino Uno, tenho uma duvidas, com qual operadora você conseguiu enviar os dados para o server?
Obrigado
Obrigado
son.trs@gmail.com- Mensagens : 2
Data de inscrição : 03/11/2015
Tópicos semelhantes
» Sim908 + Arduino Mega
» sim908+ Arduino Mega 2560
» SIM908 e arduino UNO rastreador veicular
» SIM908 GPS GSM GPRS
» Sim900 Shield
» sim908+ Arduino Mega 2560
» SIM908 e arduino UNO rastreador veicular
» SIM908 GPS GSM GPRS
» Sim900 Shield
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|