GPS\GSM маячок с отправкой координат в виде SMS по запросу

GPS\GSM маячок отправляющий SMS сообщение с координатами местоположения и скорости движения по запросу. подробнее в видео.

Пока только код

Схема подключения:

позже

В проекте использованы железки:

GPS приемник GY-NEO6MV2
GSM модем NEOWAY M590, и для его питания DC-DC преобразователь.
Arduino leonardo и протошилд.

Код:

библиотека TinyGPS++.h 

#include <TinyGPS++.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
 

#define TELLNUMBER "70001112233"                       // номен телефона для команды
#define SMSNUMBER "AT+CMGS=\"+70001112233\""           // номер на который будем отправлять SMS

#define LED 13

boolean GSMSMSflag = 0;           // команда на отправку SMS

TinyGPSPlus gps; 

SoftwareSerial gsm(9, 8);         // программный UART для GSM модема
//SoftwareSerial ss(3, 4);         // программный UART для GPS приемника
#define ss Serial1                // аппаратный UART в леонардо для GPS приемника
 
 

void setup()
{
  delay(1000);
  Serial.begin(9600);         
  ss.begin(9600);                // скорость GPS
  gsm.begin(9600);               // скорость GSM M590
  
  delay(100);
  Serial.println("start");
  pinMode(LED, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
pinMode(A0, INPUT_PULLUP); 

  
  GSMSMSflag = EEPROM.read(0);    //  достаем флаг 
  
Serial.println("modem"); 
            // нужно дождатся включения модема и соединения с сетью
  delay(2000);    
//  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                   // выключаем эхо  
  
  while(1){                              // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
   }
    
     gsm.println("AT+CMGF=1");            //настройки для SMS
     delay(100);
     gsm.println("AT+CSCS=\"GSM\"");   
           
Serial.println("Modem OK"); 
     digitalWrite(LED, LOW);               // блымаем светодиодом
     delay(1500);  
     digitalWrite(LED, HIGH);
     delay(250); 
     digitalWrite(LED, LOW);  

}


void loop(){

  if (GSMSMSflag == 0){                     // если флаг ожидания команды от модема
  // ищим RING   
    if(gsm.find("RING")){                    // если нашли RING
      gsm.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (gsm.find(TELLNUMBER)){            // ищим номер телефона, если нашли
         GSMSMSflag = 1;                     // меняем режим  
         EEPROM.write(0, GSMSMSflag);        // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        gsm.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        gsm.println("ATH0");                 // сбрасываем вызов 

         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
  }
    //////////// GPS
  
  if (GSMSMSflag == 1){                               //  если сменился режим
    do{          
      do{                                             //  в цикле забераем данные от GPS
         while (ss.available() > 0) gps.encode(ss.read());
            displayInfo();    // !!! это тут только для проверки                      
      }while (!gps.location.isUpdated() && gps.location.age() > 1500);   
    }while (!gps.location.isValid());                  //  циклЫ крутим пока не убедимся что получили свежие данные  

Serial.println("SMS!");  
      GSMsendSMS();                           // отправляем SMS
      GSMSMSflag = 0;                         // меняем режим  
      EEPROM.write(0, GSMSMSflag);            // пишим его в еепром
      
  }
//  
  

  
//if(!digitalRead(A0)) GSMSMSflag = 1;         // если нажали кнопку, для отладки
   
}
//////
      ///                                   // отправляет SMS
void GSMsendSMS(){ 
      delay(100);
      
      gsm.println(SMSNUMBER);               // отправляем команду на отправку смс
      delay(100);
      gsm.print(gps.location.lat(), 6);     // передаем координаты
      gsm.print(",");
      gsm.print(gps.location.lng(), 6); 

      gsm.print(" S:");                     // передаем скорость движения
      gsm.print(gps.speed.kmph());

      gsm.print(" T:");                     // передаем время с GPS
      if (gps.time.hour() < 10) gsm.print("0");
      gsm.print(gps.time.hour());
      gsm.print(":");
      if (gps.time.minute() < 10) gsm.print(F("0"));
      gsm.print(gps.time.minute());
      
      gsm.print((char)26);                  // символ завершающий передачу
Serial.println("ok");
     
}


 
/// отправляет в сериал инфу с GPS приемника, оставлено для проверки и отладки
void displayInfo(){
  
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  } 
 
  Serial.print(F(" "));
  if (gps.speed.isValid())  {
    Serial.print(gps.speed.kmph());
  }
  
  Serial.println();
}