Добрый вечер. Делаю GPS трекер с отправлением данных на свой сервер. Имеется: esp32 и Ai Thinker A9G.
Получаю GPS данные с помощью модуля и в нем же отправляю на сервер по HTTP. При просто выводе данных в порт, все отлично. Но если отправлять данные на сервер - данные становятся некорректными. Если я перестаю отправлять их на сервер (просто комментирую строку с вызовом функции, например) - данные снова возвращаются в норму (показывают верные координаты, правильное время).
Если снова включаю отправку - они опять становятся некорректными. Вместо текущих даты/времени показывают 06.01.2080 (иногда постоянно 0 часов 0 минут, иногда время начинает идти). Он показывает верные координаты, но при перемещении модуля они не меняются (такое ощущение, что он их ставит как заглушку, каким то образом запомнив их в тот момент когда данные были верными).
Такое поведение проявляется и при питании от юсб порта компьютера, и при питании от 18650 (как одной для питания есп+модуля так и отдельных для каждого)
В чем может быть проблема? Недостаток питания или что то другое?
Прилагаю код:
#include <MicroNMEA.h>
#include <ArduinoJson.h>
#include <Base64.h>
#include <SoftwareSerial.h>
char buffer[85];
MicroNMEA nmea(buffer, sizeof(buffer));
SoftwareSerial gpsSerial(19, 21);
bool startA9() {
Serial2.println("AT");
unsigned long timeout = millis() + 5000;
while (millis() < timeout) {
if (Serial2.find("OK")) {
return true;
}
}
return false;
}
void sendATs() {
Serial2.println("AT+GPS=0");
Serial.println("AT+GPS=0");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CREG?");
Serial.println("AT+CREG?");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CGATT=1");
Serial.println("AT+CGATT=1");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CGDCONT=1,\"IP\",\"internet\"");
Serial.println("AT+CGDCONT=1,\"IP\",\"internet\"");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CGACT=1,1");
Serial.println("AT+CGACT=1,1");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CMHTTPTERM");
Serial.println("AT+CMHTTPTERM");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CMHTTPINIT");
Serial.println("AT+CMHTTPINIT");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+GPS=1");
Serial.println("AT+GPS=1");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
}
void sendData(String data) {
Serial2.println("AT+CMHTTPSET=\"АДРЕС СЕРВЕРА"+data+"\"");
Serial.println("AT+CMHTTPSET=\"АДРЕС СЕРВЕРА"+data+"\"");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
Serial2.println("AT+CMHTTPGET");
Serial.println("AT+CMHTTPGET");
delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
}
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
gpsSerial.begin(9600);
while (!startA9()) {
Serial.println("GSM модуль не отвечает. Перезагрузка...");
delay(1000);
}
sendATs();
}
unsigned long previousMillis = 0;
void loop() {
while (gpsSerial.available()) {
char c = gpsSerial.read();
if (nmea.process(c)) {
unsigned long currentMillis = millis();
DynamicJsonDocument jsonDocument(256);
float latt = nmea.getLatitude();
float lng = nmea.getLongitude();
jsonDocument["latt"] = latt/1000000;
jsonDocument["lng"] = lng/1000000;
long alt;
nmea.getAltitude(alt);
jsonDocument["alt"] = alt;
jsonDocument["year"] = nmea.getYear();
jsonDocument["month"] = nmea.getMonth();
jsonDocument["day"] = nmea.getDay();
jsonDocument["hour"] = nmea.getHour();
jsonDocument["minute"] = nmea.getMinute();
jsonDocument["second"] = nmea.getSecond();
jsonDocument["course"] = nmea.getCourse();
jsonDocument["speed"] = nmea.getSpeed();
float hdop = nmea.getHDOP();
jsonDocument["HDOP"] = hdop/10;
jsonDocument["isEnd"] = true;
String jsonString;
serializeJson(jsonDocument, jsonString);
if (currentMillis - previousMillis >= 5000) {
String base64String = base64::encode(jsonString);
Serial.println(jsonString);
Serial2.println("AT+GPS=0");
Serial.println("AT+GPS=0");
// delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
sendData(base64String);
Serial2.println("AT+GPS=1");
Serial.println("AT+GPS=1");
// delay(1000);
while (Serial2.available()) {
char receivedChar = Serial2.read();
Serial.write(receivedChar);
}
Serial.println();
previousMillis = currentMillis;
}
}
}
}
По схеме подключения: есп и модуль общаются через два RX/TX: один для передачи AT команд, со второго поступают только данные о GPS.