Rastrino source code
Página 1 de 1
Rastrino source code
Software em desenvolvimento para o rastrino que pode ser encontrado aqui nesse link por enquanto ele apenas envia sms com as coordenadas espero que vcs possam contribuir, nada impede que esse código também possa ser usado no sim908 shield.
Esse tópico é focado em desenvolvimento e melhorias perguntas sobre funcionamento ou outra coisa que não sejam contribuição sobre o software serão sumariamente excluídas.
Para enviar o código para o rastrino vc precisa apertar o reset toda vez que aparacer uploading na IDE isso não se aplica ao shield sim908
nova versão
Agora é possível receber um sms com as coordenadas em diferentes celulares apenas mandando $9999999999 #1234
Receber SMS com #bat
Receber SMS com Hora do dispositivo #time
Ligar e desligar reles nos pinos D8 e D9 com #r1on #r1of e #r2on #r2of
Fazer ciume na namorada com #Oi meu amor
Resetar o GPS com #reset
Esse tópico é focado em desenvolvimento e melhorias perguntas sobre funcionamento ou outra coisa que não sejam contribuição sobre o software serão sumariamente excluídas.
Para enviar o código para o rastrino vc precisa apertar o reset toda vez que aparacer uploading na IDE isso não se aplica ao shield sim908
nova versão
Agora é possível receber um sms com as coordenadas em diferentes celulares apenas mandando $9999999999 #1234
Receber SMS com #bat
Receber SMS com Hora do dispositivo #time
Ligar e desligar reles nos pinos D8 e D9 com #r1on #r1of e #r2on #r2of
Fazer ciume na namorada com #Oi meu amor
Resetar o GPS com #reset
- Código:
/*
Criado Por Tiago Marangoni
Favor manter esse cabeçalho
www.projetoarduino.com.br
Data 24/10/2013
*/
#include <SoftwareSerial.h>
#include <Wire.h> //I2C library
SoftwareSerial mySerial(2, 3); //RX, TX
const int powerkey = 5;
const int statuspin = 6;
const int vDetect = 4;
const int led = 13;
const int rele1 = 8; //Só para caso se vc for usar o rele shield
const int rele2 = 9;
int firstClosingBracket;
int vState=0;
int pinState=0;
int count = 0;
int emergencia = false;
int sms = 0;
String inputString = ""; // a string to hold incoming data
String readEeprom = "";
char inChar;
char str_long[16];
char str_lat[16];
float int_lat_hour = 00.0000;
float int_long_hour = 00.0000;
/////////////////////////////////////////////////////////////////////////////////////////////
//Configurações
/////////////////////////////////////////////////////////////////////////////////////////////
//String apn = "claro.com.br";
//String user = "claro";
//String pass = "claro";
String phone = "992401849";
void setup() {
// initialize serial:
Serial.begin(9600);
mySerial.begin(9600);
pinMode(powerkey, OUTPUT);
pinMode(statuspin, INPUT);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
inputString.reserve(200);
readEeprom.reserve(20);
phone.reserve(11);
////////////////////////////////////////////////////////////////////////////////////////////
//Aqui é um pequeno exemplo de como eu gravo na eeprom
//char somedata[] = "1234567890"; // data to write
Wire.begin(); // initialise the connection
//i2c_eeprom_write_page(0x50, 0, (byte *)somedata, sizeof(somedata)); // write to EEPROM
//delay(10); //add a small delay
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
// Tira o Eco e torna o SMS legivel
////////////////////////////////////////////////////////////////////////////////////////////
Serial.println("Inicializando o Modulo");
mySerial.println("ATE0");
delay(1000);
mySerial.println("AT+CMGF=1");
delay(1000);
mySerial.println("AT&W0");
delay(1000);
mySerial.println("AT+CGPSRST=1");
}
void loop() {
/*
vState = digitalRead(vDetect);
if(vState==HIGH){
//Função que liga o modulo
pinState = digitalRead(statuspin);
if(pinState==HIGH){
Serial.println("Bora economizar bateria");
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
}
*/
if(vState==HIGH || emergencia == true){
Serial.println("Ops o Carro Ligou");
}
//Função que liga o modulo
pinState = digitalRead(statuspin);
if(pinState==LOW){
digitalWrite(powerkey, HIGH); // set the LED on
delay(2000);
digitalWrite(powerkey, LOW);
}
/////////////////////////////////////////////////////////////////
// Verifica se está conectado
////////////////////////////////////////////////////////////////
/*
mySerial.flush();
delay(500);
Serial.println("Verifica Conexão");
mySerial.println("AT+CIFSR");
delay(200);
leserial();
http://Serial.println(inputString);
firstClosingBracket = inputString.indexOf('E');
if (inputString.startsWith("ERROR",firstClosingBracket)){
Serial.println("Conectando");
mySerial.println("AT+CSTT=\"" +apn+ "\",\"" +user+ "\",\"" +pass+ "\"");
delay(4000);
mySerial.println("AT+CIICR");
delay(10000);
mySerial.println("AT+CIFSR");
delay(4000);
mySerial.println("AT+CDNSCFG?");
delay(2000);
mySerial.println("AT+CDNSORIP=1");
leserial();
// Serial.println(inputString);
}
*/
/////////////////////////////////////////////////////////////////
// Verifica se o GPS está ligado
////////////////////////////////////////////////////////////////
Serial.println("Verifica GPS");
mySerial.println("AT+CGPSPWR?");
delay(200);
leserial();
http://Serial.println(inputString);
firstClosingBracket = inputString.indexOf(':');
if (inputString.startsWith("0",firstClosingBracket+2)){
Serial.println("Ligando GPS");
mySerial.println("AT+CGPSPWR=1");
delay(2000);
mySerial.println("AT+CGPSRST=0");
}
/////////////////////////////////////////////////////////////////
/// Adquiri e trata o codigo NMEA
////////////////////////////////////////////////////////////////
Serial.println("Codigo NMEA");{
mySerial.println("AT+CGPSINF=0");
delay(200);
leserial();
http://Serial.println(inputString);
///////// Separa latitude e longitude
char buffer[250] = "";
char *p_char;
char *p_char1;
inputString.toCharArray(buffer, 250);
//longitude
p_char = strchr((char *)(buffer),',');
p_char1 = p_char+1; //we are on the first char of longitude
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
*p_char = 0;
}
strcpy(str_long, (char *)(p_char1));
// latitude
p_char++;
p_char1 = strchr((char *)(p_char), ',');
if (p_char1 != NULL) {
*p_char1 = 0;
}
strcpy(str_lat, (char *)(p_char));
//Aqui eu transformo string em interger
char str_long_pos[5] = "";
str_long_pos[0] = str_long[0];
str_long_pos[1] = str_long[1];
str_long_pos[2] = str_long[2];
int_long_hour = atof(str_long_pos);
str_long_pos[0] = str_long[3];
str_long_pos[1] = str_long[4];
str_long_pos[2] = str_long[5];
str_long_pos[3] = str_long[6];
float int_long_min = 00.0000;
int_long_min = atof(str_long_pos);
int_long_min = int_long_min / -60; // dividir por 60 é importante para ter a coordenada pronta para o google maps
int_long_hour = int_long_hour + int_long_min;
//Mesma coisa para latitude
char str_lat_pos[5] = "";
str_lat_pos[0] = str_lat[0];
str_lat_pos[1] = str_lat[1];
str_lat_pos[2] = str_lat[2];
int_lat_hour = atof(str_lat_pos);
str_lat_pos[0] = str_lat[3];
str_lat_pos[1] = str_lat[4];
str_lat_pos[2] = str_lat[5];
str_lat_pos[3] = str_lat[6];
float int_lat_min = 00.0000;
int_lat_min = atof(str_lat_pos);
int_lat_min = int_lat_min / -60;
int_lat_hour = int_lat_hour + int_lat_min;
//mostra como ficou
Serial.println(int_long_hour,4); // esse quatro ai seta o numero de casas decimais
Serial.println(int_lat_hour,4);
delay(3000);
}
//////////////////////// FIM ///////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//Função que envia dados para o site
//////////////////////////////////////////////////////////////////////
/*
Serial.println("Enviando coordenadas");
mySerial.println("AT+CIPSTART=\"tcp\",\"realtracker.com.br\",\"80\"");//inicia conexão TCP
delay(4000);
mySerial.println("AT+CIPSEND");
delay(1000);
mySerial.print("GET http://www.realtracker.com.br/inserir.php?id=201<=");
mySerial.print(str_lat);
mySerial.print("&lg=");
mySerial.print(str_long);
mySerial.print("&s=0");
mySerial.write(10); //Equivalente a ctrl+j
mySerial.write(26); //CTRL+z
delay(4000);
mySerial.println("AT+CIPCLOSE");
delay(4000);
leserial();
*/
///////////////////////////////////////////////////////////////
//Função Le SMS
//////////////////////////////////////////////////////////////
Serial.println(phone);
Serial.println("Lendo SMS");
int leitura = true;
if(leitura == true){
sms++;
mySerial.println("AT+CMGR=1");
delay(200);
leserial();
//Formato da menssagem tem que ser obrigatoriamente numero do celular $123456789#1234
firstClosingBracket = inputString.indexOf('#');
//////// Envia SMS caso encontre a senha #1234
if (inputString.startsWith("#1234",firstClosingBracket)){
digitalWrite(led, HIGH);
//Setando numero
firstClosingBracket = inputString.indexOf('$');
phone = inputString.substring(firstClosingBracket+1,firstClosingBracket+10); //caso vc não tenha 9 digitos tem que ajustar aq
Serial.println(phone);
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
/*
mySerial.print("Longitude: ");
mySerial.println(str_long);
mySerial.print("Latitude: ");
mySerial.println(str_lat);
*/
mySerial.print("http://maps.google.com/?q=");
mySerial.print(int_lat_hour,4);
mySerial.print(",");
mySerial.println(int_long_hour,4);
mySerial.write(26);
delay(4000);
digitalWrite(led, LOW);
delay(2000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(1000);
mySerial.flush();
}
if (inputString.startsWith("#on",firstClosingBracket)){
digitalWrite(led, HIGH);
emergencia = true; //Com isso eu posso deixar o rastrino ligado mesmo que o carro desligue ele pela chave on
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.print("Modo de Emergencia ");
mySerial.print("O rastrino vai ficar sempre ligado agora");
mySerial.println("Isso vai promover um desgate da bateria do carro");
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
if (inputString.startsWith("#off",firstClosingBracket)){
digitalWrite(led, HIGH);
emergencia = false; //Com isso eu posso deixar o rastrino ligado mesmo que o carro desligue ele pela chave on
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.print("Modo de Emergencia ");
mySerial.println("O rastrino vai ser desligado");
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
if (inputString.startsWith("#Oi meu amor",firstClosingBracket)){
digitalWrite(led, HIGH);
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.println("Oi gato vamos sair hoje de novo :p");
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
if (inputString.startsWith("#reset",firstClosingBracket)){
digitalWrite(led, HIGH);
Serial.println("Resetando GPS");
mySerial.println("AT+CGPSRST=0");
delay(2000);
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.println("Resetei o GPS");
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
//Comando que recebe sms #r1on e liga reles
if (inputString.startsWith("#r1on",firstClosingBracket)){
digitalWrite(rele1, HIGH);
Serial.println("Rele1 ON");
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(1000);
mySerial.flush();
}
if (inputString.startsWith("#r1of",firstClosingBracket)){
digitalWrite(rele1, LOW);
Serial.println("Rele1 OFF");
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(1000);
mySerial.flush();
}
if (inputString.startsWith("#r2on",firstClosingBracket)){
digitalWrite(rele2, HIGH);
Serial.println("Rele2 ON");
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(1000);
mySerial.flush();
}
if (inputString.startsWith("#r2of",firstClosingBracket)){
digitalWrite(rele2, LOW);
Serial.println("Rele2 OFF");
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(1000);
mySerial.flush();
}
//Verifica Bateria
if (inputString.startsWith("#bat",firstClosingBracket)){
Serial.println("Verificando Bateria");
mySerial.println("AT+CBC");
delay(200);
leserial();
digitalWrite(led, HIGH);
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.println(inputString);
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
//Verifica Hora e retorna em um SMS
//Para acertar o relogio vc pode usar o comando AT+CCLTS=1
if (inputString.startsWith("#time",firstClosingBracket)){ //Mandar um sms com o conteudo #time
Serial.println("Obtendo Hora");
mySerial.flush();
delay(1000);
mySerial.println("AT+CCLK?");
delay(200);
leserial();
digitalWrite(led, HIGH);
Serial.println("Enviando SMS");
mySerial.print("AT+CMGS=\"");
mySerial.print(phone);
mySerial.println("\""); // Setting for the SMS Message center number,
delay(2000);
mySerial.println(inputString);
delay(1000);
mySerial.write(26);
delay(6000);
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
digitalWrite(led, LOW);
mySerial.flush();
}
if (sms >= 5){ //Garante que o Slot 1 vai sempre estar vago
Serial.println("Deletando SMS no Slot 1");
mySerial.println("AT+CMGD=1"); //Apaga menssagem do slot 1
delay(2000);
mySerial.flush();
sms = 0;
}
leitura == false;
delay(3000);
}
////////////////////////// FIM//////////////////////////////////////////
/////////////////////////////////////////////////////////
///Função que recolhe os dados eeprom
/////////////////////////////////////////////////////////
Serial.println("Dados da eeprom");
int addr=0; //first address
char b;
for (int i=0; i <= 10; i++){
b = i2c_eeprom_read_byte(0x50, addr); //access an address from the memory
readEeprom += b;
addr++; //increase address
delay(10);
}
Serial.println(readEeprom);
readEeprom = "";
}//Fim do loop
//////////////////////////////////////////////////////////////////////////////////
//Função que le a softSerial
//- Deve ser chamada toda vez que é dado um comando no sim908
/////////////////////////////////////////////////////////////////////////////////
void leserial(){
inputString = "";
while (mySerial.available()>0){
inChar = mySerial.read(); //read Serial
inputString += inChar; //prints the character just read
//delay(1);
}
Serial.println(inputString); //coloquei isso pra toda vez que chamar a leitura da softserial ele me entrega no terminal oq ele leu
}
///////////////////////////////////////////////////////////////////////////////////
//Função que permite gravar strings na memoria i2c
///////////////////////////////////////////////////////////////////////////////////
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
int rdata = data;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(rdata);
Wire.endTransmission();
}
// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddresspage >> 8)); // MSB
Wire.write((int)(eeaddresspage & 0xFF)); // LSB
byte c;
for ( c = 0; c < length; c++)
Wire.write(data[c]);
Wire.endTransmission();
}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,length);
int c = 0;
for ( c = 0; c < length; c++ )
if (Wire.available()) buffer[c] = Wire.read();
}
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|