Помогите новичку

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

Здраствуйте 

Я новичек в программировании и мне нужно собрать GPS трекер на Arduino mega .комплектующие Ардуино ,GSM модуль А6, GPS модуль НЕО6МV2. В интернете нашел скетч переписал под себя вроде правильно, но при загрузке GSM модуоль не  выполняет свои функции. Вот скетч:

// GPS/GSM трекер.
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
 
 
String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "+77076817895";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.
String dat2 = "no data";//Текст строки отпровляеться если GPS координат ещё нет.
String dat;//Строка содержит GPS координаты.
String complete = "Changed nomber complete!";//Текст строки отпровляеться при смене Разрешенного номера.
char data;//Содержит символ полученый от сим модуля.
byte char_A = 40;
boolean gps = true;
int gps_on = A0;
void setup()
{
  pinMode(gps_on, OUTPUT);
 
  analogWrite(gps_on, 255);//
  delay(800);              //
  analogWrite(gps_on, 0);  //Включение сим модуля.
  delay(5000);            //
 
  Serial2.begin(115200);
  Serial1.begin(9600);
 
  for(byte i=0; i<13; i++)  //Чтение Разрешённого номера из EEPROM
    {
      data = EEPROM.read(i);
      nomber_Phone += data;
    }
  delay(1000);
  Serial2.println("AT");//Устанавливаем связь с сим модулем, для соглосования скорости передачи.
  delay(2000);
  Serial2.println("AT+CMGD");//Удаляем всё SMS которые могут содержаться на сим карте.
}
 
void loop()
{
  if(Serial2.available()>0)
  {
    read_GSM();
  }
  read_GPS();
}
//Функция данных полученых от сим модуля.
void read_GSM()
{
  currStr = "";
  while(Serial2.available()>0)
  {
    data = Serial2.read();
    delay(100);
    if ('\r' == data)
    {
      if(!currStr.compareTo("RING"))//Если текущая строка RING, значит едёт входящий звонок.
      {
        ring_GSM();   
      }
      else
      {
        if (currStr.startsWith("+CMT")) //Или если строка начинаеться c +CMT, значит пришло SMS
        {
          read_Message();
          Serial2.println("AT+CMGD");//Удоляем всё SMS чтоб не накапливать их.
        }
      }
      currStr = "";
    }
    else if ('\n' != data)
    {
      currStr += data;
    }
  } 
}
 
//Функция обработки входящего звонка.
void ring_GSM()
{
  boolean ring = true;
  currStr = "";
  delay(1000);
  while(ring)
  {
    data = Serial2.read();
    if (data == '"')
    {
      data = Serial2.read();
      while (data != '"')
      {
        currStr += data;
        data = Serial2.read();
      }
      if (currStr == nomber_Phone)//Если номер совподает с номером в строке "nomber_Phone"
      {
        delay(1000);
        Serial2.println("ATH");// Тогда сбрасываем звонок
        delay(3000);
         Serial2.println("ATH");// Тогда сбрасываем звонок
        delay(3000);
        Serial2.println("ATH");
      
        send_Message(&dat2);// И вызываем функци отправки SMS и передаём ей адрес строки содержащию GPS координаты.
        return;
      }
      else //Если номер не совподает
      {
        Serial2.println("ATH");// Просто сбрасываем звонок.
        delay(3000);
        Serial2.println("ATH");
        delay(3000);
        Serial2.println("ATH");
        return;
      }
    }
  }
}
//Функция отправки SMS.
void send_Message(String *message) //Функция принимает адрес строки с текстом SMS.
{
  delay(1000);
  Serial2.print("AT+CMGS=1");
  Serial2.print(nomber_Phone);
  Serial2.println('"');
  delay(1000);
  Serial2.println(*message);
  delay(1000);
  Serial2.print((char)26);
}
//Функция читает GPS координаты и преобразует в формат:
//N xx xx.xxxx - широта.
//E xx xx.xxxx - долгота.
//Time xx:xx:xx - время по гринвичу.
void read_GPS()
{
  gps = true;
  dat = "";
  while (gps)
  {
    if (Serial1.available()>0)
    {
      data = Serial1.read();
      if (data == 'L')
      {
        while (data != '\r')
        {
          dat += data;
          delay(2);
          data = Serial1.read();
        }
        gps = false;
        if (dat.indexOf('A') == char_A)
        {
          delay(5);
          dat2 = "N ";
          for(byte i=3; i<5; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ' ';
          for(byte i=5; i<13; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += "\nE ";
          for(byte i=17; i<19; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ' ';
          for(byte i=19; i<27; i++)
          {
            dat2 += dat.charAt(i);
          }
          delay(5);
          dat2 += "\nTime ";
          for(byte i=30; i<32; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ':';
          for(byte i=32; i<34; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ':';
          for(byte i=34; i<36; i++)
          {
            dat2 += dat.charAt(i);
          }
        }       
      }
    }
  }
}
//Функция чтения SMS.
void read_Message()
{
  currStr = "";
  while(Serial2.available()>0)
  {
    data = Serial2.read();
    if(data == '$')
    {
      while(data != '#')
      {
        data = Serial2.read();
        currStr += data;
      }
      if(!currStr.compareTo("balans#"))//Запрос и отправка баланса сим карты
      {
        currStr = "";
        Serial2.println("ATD*111#;");//
        delay(5000);
        while(Serial2.available()>0)
        { 
          data = Serial2.read();
          if(data == '"')
          {
            data = Serial2.read();
            while(data != 'B')
            {
              currStr += data;
              data = Serial2.read();
            }
            send_Message(&currStr);
            return;
          }
        }
      }
      else if(!currStr.compareTo("callback#"))//Звонок на разрешённый номер.
      {
        Serial2.print("ATD");
        delay(100);
        Serial2.print(nomber_Phone);
        delay(100);
        Serial2.println(";");
        return;
      }
      else if(!currStr.compareTo("ch.number#"))//Смена Разрешённого номера и сохранение его в EEPROM.
      {
        currStr = "";
        data = Serial2.read();
        if(data == '+')
        {
          for(byte i = 0; i < 13; i++)
          {
            EEPROM.write(i, data);
            currStr += data;
            data = Serial2.read();
          }
          nomber_Phone = currStr;//Сохранение нового Разрешённого номера.
          send_Message(&complete);//Отправка SMS потверждающая смену Разрешённого номера.
          return;
        }
      }
    }
  }
}
Araris
Offline
Зарегистрирован: 09.11.2012

1. Вставьте пожалуйста код, как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

2. "при загрузке GSM модуль не  выполняет свои функции." - это ни о чём, стоило бы подробнее.

3. Спасибо за содержательное название темы.

Karzhaubay
Offline
Зарегистрирован: 14.05.2017
// GPS/GSM трекер.
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>


String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
String nomber_Phone = "+77076817895";//Строка содержит номер телефона на который отправляються GPS координаты, далее Разрешенный номер.
String dat2 = "no data";//Текст строки отпровляеться если GPS координат ещё нет.
String dat;//Строка содержит GPS координаты.
String complete = "Changed nomber complete!";//Текст строки отпровляеться при смене Разрешенного номера.
char data;//Содержит символ полученый от сим модуля.
byte char_A = 40;
boolean gps = true;
int gps_on = A0;
void setup()
{
  pinMode(gps_on, OUTPUT);

  analogWrite(gps_on, 255);//
  delay(800);              //
  analogWrite(gps_on, 0);  //Включение сим модуля.
  delay(5000);            //
 
  Serial2.begin(115200);
  Serial1.begin(9600);
 
  for(byte i=0; i<13; i++)  //Чтение Разрешённого номера из EEPROM
    {
      data = EEPROM.read(i);
      nomber_Phone += data;
    }
  delay(1000);
  Serial2.println("AT");//Устанавливаем связь с сим модулем, для соглосования скорости передачи.
  delay(2000);
  Serial2.println("AT+CMGD");//Удаляем всё SMS которые могут содержаться на сим карте.
}

void loop()
{
  if(Serial2.available()>0)
  {
    read_GSM();
  }
  read_GPS();
}
//Функция данных полученых от сим модуля.
void read_GSM()
{
  currStr = "";
  while(Serial2.available()>0)
  {
    data = Serial2.read();
    delay(100);
    if ('\r' == data)
    {
      if(!currStr.compareTo("RING"))//Если текущая строка RING, значит едёт входящий звонок.
      {
        ring_GSM();   
      }
      else
      {
        if (currStr.startsWith("+CMT")) //Или если строка начинаеться c +CMT, значит пришло SMS
        {
          read_Message();
          Serial2.println("AT+CMGD");//Удоляем всё SMS чтоб не накапливать их.
        }
      }
      currStr = "";
    }
    else if ('\n' != data)
    {
      currStr += data;
    }
  } 
}

//Функция обработки входящего звонка.
void ring_GSM()
{
  boolean ring = true;
  currStr = "";
  delay(1000);
  while(ring)
  {
    data = Serial2.read();
    if (data == '"')
    {
      data = Serial2.read();
      while (data != '"')
      {
        currStr += data;
        data = Serial2.read();
      }
      if (currStr == nomber_Phone)//Если номер совподает с номером в строке "nomber_Phone"
      {
        delay(1000);
        Serial2.println("ATH");// Тогда сбрасываем звонок
        delay(3000);
         Serial2.println("ATH");// Тогда сбрасываем звонок
        delay(3000);
        Serial2.println("ATH");
      
        send_Message(&dat2);// И вызываем функци отправки SMS и передаём ей адрес строки содержащию GPS координаты.
        return;
      }
      else //Если номер не совподает
      {
        Serial2.println("ATH");// Просто сбрасываем звонок.
        delay(3000);
        Serial2.println("ATH");
        delay(3000);
        Serial2.println("ATH");
        return;
      }
    }
  }
}
//Функция отправки SMS.
void send_Message(String *message) //Функция принимает адрес строки с текстом SMS.
{
  delay(1000);
  Serial2.print("AT+CMGS=1");
  Serial2.print(nomber_Phone);
  Serial2.println('"');
  delay(1000);
  Serial2.println(*message);
  delay(1000);
  Serial2.print((char)26);
}
//Функция читает GPS координаты и преобразует в формат:
//N xx xx.xxxx - широта.
//E xx xx.xxxx - долгота.
//Time xx:xx:xx - время по гринвичу.
void read_GPS()
{
  gps = true;
  dat = "";
  while (gps)
  {
    if (Serial1.available()>0)
    {
      data = Serial1.read();
      if (data == 'L')
      {
        while (data != '\r')
        {
          dat += data;
          delay(2);
          data = Serial1.read();
        }
        gps = false;
        if (dat.indexOf('A') == char_A)
        {
          delay(5);
          dat2 = "N ";
          for(byte i=3; i<5; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ' ';
          for(byte i=5; i<13; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += "\nE ";
          for(byte i=17; i<19; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ' ';
          for(byte i=19; i<27; i++)
          {
            dat2 += dat.charAt(i);
          }
          delay(5);
          dat2 += "\nTime ";
          for(byte i=30; i<32; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ':';
          for(byte i=32; i<34; i++)
          {
            dat2 += dat.charAt(i);
          }
          dat2 += ':';
          for(byte i=34; i<36; i++)
          {
            dat2 += dat.charAt(i);
          }
        }       
      }
    }
  }
}
//Функция чтения SMS.
void read_Message()
{
  currStr = "";
  while(Serial2.available()>0)
  {
    data = Serial2.read();
    if(data == '$')
    {
      while(data != '#')
      {
        data = Serial2.read();
        currStr += data;
      }
      if(!currStr.compareTo("balans#"))//Запрос и отправка баланса сим карты
      {
        currStr = "";
        Serial2.println("ATD*111#;");//
        delay(5000);
        while(Serial2.available()>0)
        { 
          data = Serial2.read();
          if(data == '"')
          {
            data = Serial2.read();
            while(data != 'B')
            {
              currStr += data;
              data = Serial2.read();
            }
            send_Message(&currStr);
            return;
          }
        }
      }
      else if(!currStr.compareTo("callback#"))//Звонок на разрешённый номер.
      {
        Serial2.print("ATD");
        delay(100);
        Serial2.print(nomber_Phone);
        delay(100);
        Serial2.println(";");
        return;
      }
      else if(!currStr.compareTo("ch.number#"))//Смена Разрешённого номера и сохранение его в EEPROM.
      {
        currStr = "";
        data = Serial2.read();
        if(data == '+')
        {
          for(byte i = 0; i < 13; i++)
          {
            EEPROM.write(i, data);
            currStr += data;
            data = Serial2.read();
          }
          nomber_Phone = currStr;//Сохранение нового Разрешённого номера.
          send_Message(&complete);//Отправка SMS потверждающая смену Разрешённого номера.
          return;
        }
      }
    }
  }
}

 

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

ну он вроде бы должен при звонке сбрасывать и отправлять координаты по смс , но вмето этого идет просто гудок

 

Araris
Offline
Зарегистрирован: 09.11.2012

Для отладки скетча воспользуйтесь монитором порта из Arduino IDE.

Вставьте в void setup() запуск порта - Serial.begin(9600);

В интересующих местах поставьте отладочный вывод ( Serial.print() , Serial.println() ) в порт, запустите скетч, смотрите в мониторе порта, что выводится и отлаживайте.

Например, здесь :

//Функция данных полученых от сим модуля.
void read_GSM()
{
  currStr = "";
  Serial.println(" Принимаем в currStr    ");
  while(Serial2.available()>0)
  {
    data = Serial2.read();
    delay(100);
    Serial.print(data);
    if ('\r' == data)
    {
      if(!currStr.compareTo("RING"))//Если текущая строка RING, значит едёт входящий звонок.
      {
      Serial.println();
       ring_GSM();   
      }
      else
      {
        if (currStr.startsWith("+CMT")) //Или если строка начинаеться c +CMT, значит пришло SMS
        {
          read_Message();
          Serial2.println("AT+CMGD");//Удоляем всё SMS чтоб не накапливать их.
        }
      }
      currStr = "";
    }
    else if ('\n' != data)
    {
      currStr += data;
    }
  } 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Karzhaubay пишет:

Я новичек в программировании и мне нужно собрать GPS трекер на Arduino mega .комплектующие Ардуино ,GSM модуль А6, GPS модуль НЕО6МV2. В интернете нашел скетч переписал под себя вроде правильно, но ...

Для новичка Вы выбрали слишком сложную задачу. Начните с чего-нибудь попроще.

А то, у Вас получается: "я новичёк в медицине и мне нужно вырезать приятелю аппендикс, я посмотрел на ютубе как это делается, вроде все делал правильно, но ..."

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

Проблема в том что это моя курсовая работа и у меня срок в две недели. 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

1. На курсовую работу, по идее отводится 2 семестра. Откуда 2 недели - не понятно. Точнее, понятно, но это ни в коем случае не является смягчающим обстоятельством. Скорее - отягчающим.

2. Классический вопрос - Вы хотели бы чтобы Вас оперировал хирург-недоучка? А хотели бы лететь на самолете, спроектированным инженером-недоучкой? А хотели бы пользоваться программой, которая считает Ваши финансы (или обслуживает Ваш счет в банке), которая написана программистом-недоучкой?

Вот и я не хотел бы. А потому, думаю, всем будет лучше, если Вы эту курсовую не сдадите.

Вероятно, для Вас - это трагедия, зато для всех остальных - это благо.

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

да не собираюсь я в дальнейшем этим заниматься мне главное сдать

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

 А потому, думаю, всем будет лучше, если Вы эту курсовую не сдадите.

Неистово плюсую! Иди-ка послужи, долбо..б!

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Karzhaubay пишет:

да не собираюсь я в дальнейшем этим заниматься мне главное сдать

А зачем тогда сдавать?

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

сделал как ты и сказал при звонке на терминал вывел RING но сбрасывать вызов почемуто не стал

и где то прочитал  что там может  RING прийти  разбитый на части как угодно. Т.е. можно за один раз вычитать RIN, а G только в следующем цикле loop.  Это может быть проблемой?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Karzhaubay пишет:

да не собираюсь я в дальнейшем этим заниматься мне главное сдать

Если ваша фамилия не Рогозин-Роттенберг-Тимченко, вряд ли у вас имеются веские основания предвидеть поле своей будущей профессиональной деятельности. А посему, присоединяюсь к предыдущим ораторам.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Karzhaubay пишет:

Проблема в том что это моя курсовая работа и у меня срок в две недели. 

Да, действительно проблема.

А ВУЗ какой?

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

Прошу,если не хотите помогать  проходите мимо

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Прошел мимо :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. ВУЗ секретный?

Araris
Offline
Зарегистрирован: 09.11.2012

Karzhaubay пишет:

сделал как ты и сказал при звонке на терминал вывел RING но сбрасывать вызов почемуто не стал

и где то прочитал  что там может  RING прийти  разбитый на части как угодно. Т.е. можно за один раз вычитать RIN, а G только в следующем цикле loop.  Это может быть проблемой?

Ну а теперь перед if (currStr == nomber_Phone)//Если номер совподает с номером в строке "nomber_Phone"

вставьте Serial.println(currStr);

и смотрите дальше, чему на самом деле равна строка в currStr

bubastic
Offline
Зарегистрирован: 22.03.2012

проходил мимо...

я пока больше читатель форума, с радостью бы ответил, но моих навыков не хватает.
Мои то курсовые сдались 25 лет назад, но читаю веточку и скалыдвается врпечатление, что те кто не знают как помочь, попросту начинают нагибать топикстартера.
Конечно не мне новичку на этом форуме давать вам советы, но как то не по человечески это. Человек поздоровался описал проблему как мог, а тут откровенное хамство в ответ. Не хорошо это....

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

bubastic пишет:

я пока больше читатель форума, с радостью бы ответил, но моих навыков не хватает.

 А самое главное у вас нет навыков учить и тестировать сложные схемы. Если вы наверно помните время, когда учились, после долгих летних каникул ваш учитель давал вам первичное тестирование, что бы проверить вас все ли вы забыли или что то в голове осталось. И как вы отплевывались от этого тестирования , как же вы же сдали уже и это работа лишняя. А то что без знаний крепко усевшихся в голове, дальше учить бесмысленно. Вот так и программированием.  Даже если кто-то сбросит текст рабочей программы, и разумеется там может оказаться немного ошибок , или надо модернизировать , или что то еще. То как поступит это "уникум".  Вы сможете проверить грамматику в китайском тексте. Так вот и для него эта программа будет как китайская грамота. Так что грубость на форуме это и есть первичное тестирование , а не издевательство. И похоже ТС ее успешно провалил.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я бы добавил, что персонаж просто никому нахрен не нужен.

Я, с огромным удовольствием, научу новичка, хоть пайке, сварке и программированию, хоть верховой езде, байку или управлению самолетом, чему угодно, из того, чему научился сам за долгую жизнь. Но главное условие, чтобы у ученика "горели глаза", чтобы ему было интересно.

А курсовую придурку-неучу.? ...только за деньги! И не за маленькие.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

wdrakula пишет:

Я бы добавил, что персонаж просто никому нахрен не нужен.

Я, с огромным удовольствием, научу новичка, хоть пайке, сварке и программированию, хоть верховой езде, байку или управлению самолетом, чему угодно, из того, чему научился сам за долгую жизнь. Но главное условие, чтобы у ученика "горели глаза", чтобы ему было интересно.

А курсовую придурку-неучу.? ...только за деньги! И не за маленькие.

Подписываюсь под каждым словом.  Насмотрелся на недовыпускников. 

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

послушайте, программирование не моя специальность .  И я не прошу все объеснять с нуля .Мне нужно лишь помошь по исправлению ошибок моего кода для работы трекера

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

bubastic пишет:

...те кто не знают как помочь, попросту начинают нагибать топикстартера.
Конечно не мне новичку на этом форуме давать вам советы, но как то не по человечески это. Человек поздоровался описал проблему как мог, а тут откровенное хамство в ответ. Не хорошо это....

bubastic, Вы неправильно употребляете глагл "помочь". У нормальных людей помощь подразумевает, что кому-то от этого будет лучше. В данном случае пытаться сделать за неуча его работу - это вред всем.

А рассуждать, как Вы - это помочь карманнику вытащить кошелек у женщины. Тоже "помощь".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bubastic пишет:

те кто не знают как помочь

Если бы не знали! Это ещё было бы простительно! Эти твари/нелюди знают, но злостно не хотят, сделать курсовик за лодыря и дебила, который даже "не просит ему объяснить с нуля", а просит только дать готовый код!

А Вы 25 лет назад также курсовики сдавали, как этот персонаж? Ну, вот, видимо, потому сейчас и помочь ему не можете. Нет?

bubastic
Offline
Зарегистрирован: 22.03.2012

ух, ты, ух ты набросились :-)

прошу проениня за оффтоп
"Мои то курсовые сдались 25 лет назад", я написал образно более для указания того дальнего времени когда мне было столько же лет.
А не сдавал курсовую, т.к. работал на металургическом заводе и к сожалению (сейчас осознаю) "в институтах не кончал". 

проехали..., а то заклюете, как этого бедолпагу ;-)  А мне тоже помощь общественного разума нужна.

 

JasKo
Offline
Зарегистрирован: 21.11.2015

bubastic пишет:

ух, ты, ух ты набросились :-)

прошу проениня за оффтоп
"Мои то курсовые сдались 25 лет назад", я написал образно более для указания того дальнего времени когда мне было столько же лет.
А не сдавал курсовую, т.к. работал на металургическом заводе и к сожалению (сейчас осознаю) "в институтах не кончал". 

проехали..., а то заклюете, как этого бедолпагу ;-)  А мне тоже помощь общественного разума нужна.

 

Ну так потрудись, напиши хоть что то сам, а потом конкретно спрашивай, что ты хочешь исправить в своем коде или чего не понимаешь как сделать опять же в своем коде. Здесь помогают тем кто делает сам, и не требует, что бы все сделали за него.

Karzhaubay
Offline
Зарегистрирован: 14.05.2017

Спасибо всем тем кто хотел помочь.Особенно Araris. И остальным за их критику. Это придало мне мотивацию. Итак после того как я поменял код и GSM модуль,первый я сжег или что там еще хер его знает, все заработало. Координаты отправляются с помощью СМС в ввиде ссылок на карту GOOGLE maps. Думаю никому не интересно, но вот код 

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

 

#define TELLNUMBER ""                       // номен телефона для команды
#define SMSNUMBER "AT+CMGS=\"+\""           // номер на который будем отправлять SMS
#define Sait "https://maps.google.com/?hl=ru&q="  // ссылка на координату в гугл мапс 
#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);         
  Serial1.begin(9600);                // скорость GPS
  Serial2.begin(115200);               // скорость GSM А6
  
  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"));          /// ждем команды от модема  
  Serial2.println("ATE");                   // выключаем эхо  
  
  while(1){                              // ждем подключение модема к сети
        Serial2.println("AT+COPS?");
        if (Serial2.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
   }
    
     Serial2.println("AT+CMGF=1");            //настройки для SMS
     delay(100);
     Serial2.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(Serial2.find("RING")){                    // если нашли RING
     Serial2.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (Serial2.find(TELLNUMBER)){            // ищим номер телефона, если нашли
         GSMSMSflag = 1;                     // меняем режим  
         EEPROM.write(0, GSMSMSflag);        // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         Serial2.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (Serial2.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        Serial2.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        Serial2.println("ATH");                 // сбрасываем вызов 
        delay(3000);
        Serial2.println("ATH");
        delay(200);
         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
  }
    //////////// GPS
  
  if (GSMSMSflag == 1){                               //  если сменился режим
    do{          
      do{                                             //  в цикле забераем данные от GPS
         while (Serial1.available() > 0) gps.encode(Serial1.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);            // пишим его в еепром
      delay(3000);
      

  }
//  
  

  
if(!digitalRead(A0)) GSMSMSflag = 1;         // если нажали кнопку, для отладки
   
}
//////
      ///                                   // отправляет SMS
void GSMsendSMS(){ 
      delay(100);
      
      Serial2.println(SMSNUMBER);               // отправляем команду на отправку смс
      delay(100);
      Serial2.print(Sait);
      Serial2.print(gps.location.lat(), 6);     // передаем координаты
      Serial2.print(",");
      Serial2.print(gps.location.lng(), 6); 
      
      
      Serial2.print((char)26);                  // символ завершающий передачу
Serial.println("ok");
delay(10000);
    
}


 
/// отправляет в сериал инфу с 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(" "));
  
 
  Serial.print(F(" "));
  if (gps.speed.isValid())  {
    Serial.print(gps.speed.kmph());
  }
  
  Serial.println();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, наш стёб на пользу пошёл. Я рад!

Araris
Offline
Зарегистрирован: 09.11.2012

И я рад ))). А код кому-нибудь да пригодится.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Karzhaubay
Плюсанул за настойчивость. Успешной сдачи!