Код застревает в ожидании вывода 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");
}
@iHertz, 👍0
Обсуждение3 ответа
У вас есть 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.
Я согласен с приведенным выше ответом, используйте доступные последовательные порты и сделайте что-нибудь в своей настройке, чтобы проверить sim808, пока вы не получите какой-либо отзыв. цикл while в настройке, которая проверяла только отправку «AT» в модуль (я не использовал tinyGPS, я использовал только Serial и отправлял ему AT-команды)
Здесь примечания к приложению с AT-командами для стороны GPS SIM808
Этот подход даст вам лучшее представление о том, что происходит и где вы ошибаетесь
Проблема решена, он не работал, когда я использовал GPS и GPRS на SIM808, я переключился на модуль NeoGPS 6m, а GPRS с SIM800/808 работал. Спасибо.
- Как отправить групповое сообщение нескольким получателям с помощью GSM900 и Arduino Mega2560?
- Можно ли использовать GSM и Data Logger Shield одновременно на одном Arduino?
- Использование аналогового входа для чтения кнопки
- Преобразование строки в массив символов
- AT+CSTT выдает ошибку
- Моделирование Arduino Mega 2560 с GSM модулем с использованием Proteus
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Arduino GSM Shield GSM_READY никогда не готов
что вы сделали, чтобы отладить проблему? .... какие части работали? .... какие детали вышли из строя?, @jsotola
совет: замените блок
if (currentDay <10)
только двумя строкамиif (currentDay <10) Serial.print("0");
иSerial.print(currentDay);
...... сделайте аналогично для других блоковif
, @jsotola