Простой GPS трекер на Arduino.

Данный GPS трекер позволяет получать координаты через  sms по звонку с мастер номера, который можно поменять послав sms команду вида cfn79000000000.

IMG_20170209_050521

 

m590 подключен к аппаратному uart
ublox к  soft serial rx-pin4 tx-pin3
для работы с ublox использована библиотека  TinyGPS-13.

Светодиод подключен к pin9 и показывает состояние трекера:
мигает — поиск GSM сети
не горит — сеть найдена поиск спутников
горит — спутники найдены , готов к работе.

На Android можно использовать бесплатное приложение GPS to SMS
перехватывающее координаты из sms и позывающее точку на карте.

 

#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
float LAT = 0;
float LON = 0;
int ch = 0;
String val = "";
String TELMODE = "";// переменная мастер номера
#define gsm Serial
#define LED 9
TinyGPS gps;
SoftwareSerial ss(4, 3);// RX, TX  soft serial for gps




void setup() {
  delay(1000);
  gsm.begin(9600);
  ss.begin(9600);
  pinMode(LED, OUTPUT);

  // нужно дождатся включения модема и соединения с сетью
  delay(2000);

  readepp();


  //gsm.println(TELMODE);

  gsm.println("ATE0");                         // выключаем эхо
  
    while(1){                                // ждем подключение модема к сети
          gsm.println("AT+COPS?");
          if (gsm.find("+COPS: 0")) break;
                                           // мигаем светодиодом
             delay(100);
             digitalWrite(LED, HIGH);
             delay(100);
             digitalWrite(LED, LOW);

          }

  gsm.println("AT+CMGF=1");
  delay(100);
  gsm.println("AT+CSCS=\"GSM\"");
  delay(100);
  gsm.println("AT+CLIP=1");          // включаем аон
  delay(100);
  gsm.println("AT+CNMI=1,2,2,1,0");//режим вывода принятых sms в терминал
  delay(100);
  gsm.println("AT+CMGD=1,4 ");


}


void loop() {

  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  
  for (unsigned long start = millis(); millis() - start < 2000;)   {     while (ss.available())     {       char c = ss.read();       if (gps.encode(c))          newData = true;     }   }   if (newData)   {     float flat, flon;     unsigned long age;     gps.f_get_position(&flat, &flon, &age);     LAT = flat;     LON = flon;     if (LAT > 0) {
      digitalWrite(LED, HIGH);
    }
    if (LAT == 0) {
      digitalWrite(LED, LOW);
    }
  }



  if (gsm.available()) {                  //есть данные от GSM модуля
    
    delay(200);

    while (gsm.available()) {         //сохраняем входную строку в переменную val

      ch = gsm.read();

      val += char(ch);

      delay(10);
    }

    // если нашли звонок с нужного номера отправляем на него координаты
    if (val.indexOf("RING") > -1) {

      if (val.indexOf(TELMODE) > -1 ) {


        

        gsm.println("AT+CMGS=\"+" + TELMODE + "\""); // даем команду на отправку смс
        delay(100);

        gsm.print(LAT, 6);                    // отправляем координаты
        gsm.print(", ");
        gsm.print(LON, 6);
        gsm.print((char)26);               // символ завершающий передачу
        val = "";
      }
    }

    if (val.indexOf("cfn") > -1) {   // если пришла смс команда для смены мастер номера

      byte pn = val.indexOf("cfn");   
      val = val.substring(pn+3,pn+14); // считываем телефон 

      byte n1 =  val.charAt(0);       // разбиваем телефон на цифры и переводим в байты
      byte n2 =  val.charAt(1);
      byte n3 =  val.charAt(2);
      byte n4 =  val.charAt(3);
      byte n5 =  val.charAt(4);
      byte n6 =  val.charAt(5);
      byte n7 =  val.charAt(6);
      byte n8 =  val.charAt(7);
      byte n9 =  val.charAt(8);
      byte n10 =  val.charAt(9);
      byte n11 =  val.charAt(10);

      EEPROM.write(1, n1);         // запись в eeprom 
      EEPROM.write(2, n2);
      EEPROM.write(3, n3);
      EEPROM.write(4, n4);
      EEPROM.write(5, n5);
      EEPROM.write(6, n6);
      EEPROM.write(7, n7);
      EEPROM.write(8, n8);
      EEPROM.write(9, n9);
      EEPROM.write(10, n10);
      EEPROM.write(11, n11);

      readepp();
      
      gsm.println("AT+CMGS=\"+" + TELMODE + "\""); // даем команду на отправку смс
      delay(100);
      gsm.print("change to:");
      delay(100);
      gsm.println(TELMODE);
      gsm.println(pn);
      delay(100);
      gsm.print((char)26);               // символ завершающий передачу
      
      val = "";
    }

    else {
      val = "";                     // если пришло что то другое очищаем строку
    }

  }
}

// чтение eeprom
void readepp()
{
  char str[12];
  for (byte i = 0; i < 11; i++) {
    str[i] = EEPROM.read(i + 1);
  }
  str[11] = 0;
  TELMODE = (str);
  
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>