Код застревает в ожидании вывода GPS

В основном я пытаюсь создать устройство, которое извлекает информацию GPS с SIM808 и отправляет ее на сервер онлайн через GPRS.

Извините, я плохо разбираюсь в программировании, поэтому потратил несколько дней на отладку, но так и не смог понять, что не так.

Я разберусь с основами.

Плата: Mega2560 (знаю, что это перебор, но это то, что было у меня в руках) Датчик SIM+GPS: Модуль SIM808 TinyGPS v13 РТК: DS1307 Среда разработки Arduino 1.8.8

Что касается деталей, Я начал с библиотеки SoftwareSerial, но слышал, что она неэффективна, поэтому переключился на AltSoftSerial. Последовательная библиотека работает, так как я получаю вывод с помощью AT-команд. Проблема в том, что когда я загружаю стандартный скетч TinyGPS, иногда он работает, иногда выдает ошибку, говорящую, что модуль GPS не обнаружен.

Я пытался использовать AT-команды напрямую или другую библиотеку GPS, но не могу понять, как передавать данные в базу данных через GPRS.

но в основном я уверен, что проводка не неисправна, как и модуль GPS (надеюсь), поскольку он выдает выходные данные в ATCommands, даже модуль RTC подтвержден в рабочем состоянии. Я знаю, что URL-адрес в ATCommand является поддельным, но это для демонстрационных целей.

Перейдем к коду ниже. Если я изменю bool newData = false; для логического newData = true; код работает только один раз с неверной информацией GPS.

любая помощь будет принята с благодарностью. Спасибо

Редактировать 1: проблема решена, она не работала, когда я использовал GPS и GPRS на SIM808, я переключился на модуль NeoGPS 6m, а GPRS с SIM800/808 работал. Спасибо.

#include <AltSoftSerial.h>
#include <TinyGPS.h>

#include <Wire.h>
#include <DS1307new.h>


TinyGPS gps;

SoftwareSerial sGPS (46,48);

uint16_t startAddr = 0x0000;  //Начальный адрес для сохранения в NVRam
uint16_t lastAddr;        //Новый адрес для сохранения в NVRam
uint16_t TimeIsSet = 0xaa55;  //Помощник, время не должно быть установлено снова

int currentDay = 0;
int currentMonth = 0;
int currentYear = 0;
int currentHour = 0;
int currentMinute = 0;

float flat, flon;
float previousFLat = 0.0;
float previousFLon = 0.0;

void setup()
{


  Serial.begin(9600);
  sGPS.begin(9600);


  /*
  Control the clock.
  Clock will only be set if NV-RAM Address does not contain 0xaa.
  DS1307 should have a battery backup.
  */

  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();

    RTC.fillByYMD(2011,4,8);
    RTC.fillByHMS(22,7,0);

    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }

  /*
   Control Register for SQW pin which can be used as an interrupt.
*/
  RTC.ctrl = 0x00;                      // 0x00=отключить вывод SQW, 0x10=1Гц,
                                        // 0x11=4096 Гц, 0x12=8192 Гц, 0x13=32768 Гц
  RTC.setCTRL();
  delay(5000);
  }

  void loop()
{
    RTC.getTime();

    currentDay = RTC.day;
    currentMonth = RTC.month;
    currentYear = RTC.year;
    currentHour = RTC.hour;
    currentMinute = RTC.minute;


  bool newData = false;

  //В течение одной секунды мы анализируем данные GPS и сообщаем некоторые ключевые значения

  for (unsigned long start = millis(); millis() - start < 1000;)

  {
  while (sGPS.available())
    {
      char c = sGPS.read();
      Serial.write(c); // раскомментируйте эту строку, если вы хотите увидеть поток данных GPS
      if (gps.encode(c)) // Поступило ли новое допустимое предложение?
      newData = true;
    }

  }

  if (newData)
  {
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);

    if ((flat !=previousFLat)||(flon !=previousFLon))
    {
      previousFLat = flat;
      previousFLon = flon;
      Serial.print (previousFLat,6);
      Serial.println(previousFLon,6);
      SendSQL();
    }
  }

}  


  void SendSQL()
  {

    //Serial.println("Начать отправку");
    Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
    delay(500);
    Serial.println("AT+SAPBR=3,1,\"APN\",\"airtelgprs.com\"");
    delay(500);
    Serial.println("AT+SAPBR=1,1");
    delay(500);
    Serial.println("AT+SAPBR=2,1");
    delay(3000);
    Serial.println("AT+HTTPINIT");
    delay(500);
    Serial.println("AT+HTTPARA=\"CID\",1");
    delay(500);
    Serial.print("AT+HTTPARA=\"URL\",\"www.google.com/add_data.php?");
    Serial.print("addDay=");

      if (currentDay <10)
        {
        Serial.print("0");
        Serial.print(currentDay);
        }

      else
        {
        Serial.print(currentDay);
        }

      Serial.print("/");

      if (currentMonth < 10)
        {
          Serial.print("0");
          Serial.print(currentMonth);
        }

      else 
        {
          Serial.print(currentMonth);
        }

      Serial.print("/");
      Serial.print(currentYear);
      Serial.print("&addHour=");

      if (currentHour <10) 
        {
          Serial.print("0");
          Serial.print(currentHour);
        }

        else

        {
          Serial.print(currentHour);
        }

        Serial.print(":");

        if (currentMinute <10) 

        {
          Serial.print("0");
          Serial.print(currentMinute);
        }

        else

        {
          Serial.print (currentMinute);
        }

          Serial.print ("&addLati=");
          Serial.print(previousFLat, 6);
          Serial.print("&addLongti=");
          Serial.print(previousFLon, 6);
          Serial.println("\"");
          delay(3000);
          Serial.println("AT+HTTPACTION=0");
          delay(15000);
          Serial.println("AT+HTTPTERM");
          delay(500);
          Serial.println("AT+SAPBR=0,1");
          delay(500);
          Serial.println("Finish");
        }

, 👍0

Обсуждение

что вы сделали, чтобы отладить проблему? .... какие части работали? .... какие детали вышли из строя?, @jsotola

совет: замените блок if (currentDay <10) только двумя строками if (currentDay <10) Serial.print("0"); и Serial.print(currentDay); ...... сделайте аналогично для других блоков if, @jsotola


3 ответа


0

У вас есть Mega с 4 аппаратными последовательными портами. Используйте те — Serial1, Serial2, Serial 3 — для связи с GPS.

Я сделал проект с модулем SIM808 от DF Robotics. Я потратил некоторое время, просто включив часть GPS и наблюдая за тем, что получилось. Сделайте то же самое с некоторыми простыми последовательными операторами печати.

if (Serial1.available() >0){
Serial.print(Serial1.read());
}

Затем, когда вы понимаете, что выходит, вы можете посмотреть в setup() конец сообщений, указывающих на то, что у вас хорошие данные GPS, или просто отправлять AT-команды, пока не получите хороший ответ. Моему модулю потребовалось 7-8 секунд, прежде чем он заговорил, поэтому я просто ждал в setup(), пока не начал получать сообщения. Я знал, чего ожидать от вышеупомянутого тестирования, это всегда была фиксированная сумма, поэтому я взял все это, посмотрел на несколько последних, чтобы убедиться, что все соответствует ожиданиям, а затем запустил команды GPS, чтобы увидеть, есть ли у него хорошие данные от спутников, прежде чем продолжить. Я подозреваю, что библиотека TinyGPS делает то же самое, но модуль SIM808 добавил несколько дополнительных символов, или вам пришлось добавить дополнительные символы, чтобы идентифицировать команды GPS из текстовых команд, ожидаемых SIM808.

,

1

Я согласен с приведенным выше ответом, используйте доступные последовательные порты и сделайте что-нибудь в своей настройке, чтобы проверить sim808, пока вы не получите какой-либо отзыв. цикл while в настройке, которая проверяла только отправку «AT» в модуль (я не использовал tinyGPS, я использовал только Serial и отправлял ему AT-команды)

Здесь примечания к приложению с AT-командами для стороны GPS SIM808

Этот подход даст вам лучшее представление о том, что происходит и где вы ошибаетесь

,

0

Проблема решена, он не работал, когда я использовал GPS и GPRS на SIM808, я переключился на модуль NeoGPS 6m, а GPRS с SIM800/808 работал. Спасибо.

,