Rastrino source code

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Rastrino source code

Mensagem  Admin em Qua 9 Out - 10:34

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



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();
  }
avatar
Admin
Admin

Mensagens : 560
Data de inscrição : 07/04/2009
Idade : 37
Localização : Franca

Ver perfil do usuário http://projetoarduino.forum-livre.com

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum