GSM маячок

Тема в разделе "Посоветуйте детальки", создана пользователем dwk26111974, 27 апр 2016.

  1. dwk26111974

    dwk26111974 Гик

    http://forum.amperka.ru/threads/Мотосигнализация.6787/
    Уважаемые форумчане доброго дня! Собрал по указанной ссылке GSM маячок.Определяет координаты с точностью до 5 м, НО обнаружил неприятную особенность:
    Когда собранный девайс на время отключаешь от питания, а затем снова включаешь,то он стервец зависает..те на команду отправки координат не реагирует...помогает только кнопка ресет на дуне...хотя когда висит, смс модуль звонки принимает, на ГПС светодиод мигает...Подскажите в чем может быть проблема...может в скетч добавить программную перезагрузку...жалко почти готовый девайс в стол убирать..
    Скетч привожу:

    #include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial
    #include <string.h>
    #include <TinyGPS.h> // Подключаем библиотеку для GPS

    SoftwareSerial GSM(2,3); // Модуль GSM с именем GSM на пинах 2 - RX, 3 - TX Ардуино

    byte buffer[128]; // Размер буфера для данных. Обратите внимание на размер! Необходимо править библиотеку SoftwareSerial.h
    int count=0; // Счетчик для буфера данных

    SoftwareSerial GPS(4,5); // Модуль GPS с именем GPS на пинах 4 - RX, 5 - TX Ардуино
    TinyGPS gps;

    unsigned long fix_age;
    long lat, lon;
    float LAT, LON; // Какие данные GPS будем вычислять
    void gpsdump(TinyGPS &gps);
    bool feedgps();
    void getGPS();

    /*void SIM900power() // Функция программного включения GSM модуля
    {
    digitalWrite(9, HIGH); // На 9 пине программное включение GSM
    delay(1000);
    Sim900_Inti();
    }*/

    void setup()
    {
    GSM.begin(19200); // Скорость работы модуля GSM
    GPS.begin(9600); // Скорость работы модуля GPS
    Serial.begin(9600); // Скорость работы последовательного порта Было 19200!!!!!!!!!! неправильно
    delay(500);
    Sim900_Inti();
    }

    void loop()
    {
    GSM.listen();
    if (GSM.available())
    {
    while(GSM.available())
    {
    buffer[count++]=GSM.read();
    if(count == 64)break;
    }
    Serial.write(buffer,count);
    Cmd_Read_Act(); // вызываем функцию проверки пароля
    clearBufferArray(); // вызываем функцию очистки буфера
    count = 0;
    }

    if (Serial.available())
    GSM.println(Serial.read());

    }
    void clearBufferArray() // функция очистки буфера
    {

    for (int i=0; i<count;i++)
    { buffer=NULL;}

    }

    void Sim900_Inti(void)
    {
    GSM.println("AT+CLIP=1"); // Включаем АОН
    Serial.println("AOH Ready");
    delay(500);
    GSM.println("AT+CMGF=1"); // Устанавливаем модуль GSM в режим СМС
    Serial.println("SMS Mode Ready");
    delay(500);
    GSM.println("AT+CNMI=2,2");
    Serial.println("AT+CNMI=2,2");
    delay(500);
    GSM.println("AT+CSCS=\"GSM\""); // Режим кодировки текста
    delay(300);
    GSM.println("AT+CSCS=\"GSM\"\r"); //добавил ДВК
    delay(300);
    Serial.println("GSM Text Mode Ready");
    delay(500);
    }

    void Cmd_Read_Act(void) // Функция проверки пароля
    {
    char buffer2[64];
    for (int i=0; i<count;i++)
    { buffer2=char(buffer);}
    if (strstr(buffer2,"dwk")) // Сравниваем пароль в программе с паролем в СМС !!!!!!!!!!!!!!!!!!!!!!!!!!!
    {

    Serial.println("Password Authenticated.");
    Serial.println("Sending reply SMS. ");
    SendTextMessage(); // Если пароль совпал, вызываем функцию отправки СМС

    }

    }

    void SendTextMessage() // Функция отправки СМС
    {
    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CSCS=\"GSM\"\r"); //добавил ДВК
    delay(300);
    GSM.println("AT+CMGS=\"+79524430622\"");// Разрешенный номер!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    delay(100);
    GSM.println("Calculates position!");// Содержание первой СМС
    delay(100);
    GSM.println((char)26);
    delay(100);
    GSM.println();
    delay(5000);
    int counter=0;
    GPS.listen();
    for (;;)

    {
    long lat, lon;
    unsigned long fix_age, time, date, speed, course;
    unsigned long chars;
    unsigned short sentences, failed_checksum;
    long Latitude, Longitude;
    // retrieves /- lat/long in 100000ths of a degree
    gps.get_position(&lat, &lon, &fix_age);

    getGPS();
    Serial.print("Latitude : ");
    Serial.print(LAT/1000000,7);
    Serial.print(" :: Longitude : ");
    Serial.println(LON/1000000,7);

    /*if (LAT == 0 && LON == 0)

    {
    continue;
    }
    counter ;
    if (counter<30)
    {
    continue;
    }
    */

    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CSCS=\"GSM\"\r"); //добавил ДВК
    delay(300);
    GSM.println("AT+CMGS=\"+79524430622\"");// Разрешенный номер !!!!!!!!!!!!!!!!!!!!!!!!!!!
    delay(100);
    GSM.print("maps.google.com/maps?q="); // Ссылка на карты Google
    //GSM.print("Latitude : ");
    GSM.print(LAT/1000000,7);
    GSM.print("+");
    //GSM.print(" :: Longitude : ");
    GSM.println(LON/1000000,7);//the content of the message
    delay(100);
    GSM.println((char)26);//the ASCII code of the ctrl z is 26
    delay(5000);
    GSM.println();
    counter=0;
    break;
    }

    }

    void getGPS()
    {
    bool newdata = false;
    unsigned long start = millis();
    while (millis() - start < 1000)
    {
    if (feedgps ())
    {
    newdata = true;
    }
    }
    if (newdata)
    {
    gpsdump(gps);
    }

    }

    bool feedgps()
    {
    while (GPS.available())
    {
    if (gps.encode(GPS.read()))
    return true;
    }return 0;

    }

    void gpsdump(TinyGPS &gps)
    {
    gps.get_position(&lat, &lon);
    LAT = lat;
    LON = lon;
    {
    feedgps();
    }

    }
     
  2. dwk26111974

    dwk26111974 Гик

    Проблему решил.
     
  3. Nadim

    Nadim Нуб

    Если решили проблему - можно описать как?
     
  4. dwk26111974

    dwk26111974 Гик

    На макете использовал УНО, заменил на Нано заработало без проблем.
     
  5. Alex_KAN

    Alex_KAN Нуб

    ;) обычно, что на Нане не идет - на Уне летает (ИМХО)