Отправка данных GPS через модуль WiFi

Я пытаюсь отправить данные GPS с помощью GPS-модуля neo-6m через WiFi с помощью модуля esp8266. У меня оба модуля работают по отдельности, но когда я пытаюсь использовать оба модуля, WiFi работает, но не отправляет данные из GPS.

Я вызываю GPS и сохраняю широту, долготу, дату и время в отдельные переменные, а затем пытаюсь отправить эти переменные с помощью WiFi на сервер Arduino Uno, но они просто отображаются как 0.

#include <TinyGPS++.h>
#include "WiFiEsp.h"

// Эмулируем Serial1 на контактах 6/7, если они отсутствуют
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // прием, передача
#endif

char ssid[] = "UPC9080883";            // SSID вашей сети (имя)
char pass[] = "OYKXVYND";        // ваш сетевой пароль
int status = WL_IDLE_STATUS;

int ledStatus = LOW;

WiFiEspServer server(80);

// используем кольцевой буфер для увеличения скорости и уменьшения выделения памяти
RingBuffer buf(8);

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// Объект TinyGPS++
TinyGPSPlus gps;

// Последовательное соединение с устройством GPS
SoftwareSerial Serial2(RXPin, TXPin);

double  latitude, longitude;
int days, months, years, hr, mins, secs;
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);  // инициализируем цифровой вывод LED_BUILTIN как выход.
  Serial.begin(115200);   // инициализируем серийный номер для отладки
  Serial1.begin(9600);    // инициализируем серийный номер для модуля ESP
  WiFi.init(&Serial1);    // инициализируем модуль ESP

  // проверяем наличие щита
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // не продолжать
    while (true);
  }

  // попытка подключения к сети Wi-Fi
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2
    status = WiFi.begin(ssid, pass);
  }

  Serial.println("You're connected to the network");
  printWifiStatus();

  // запускаем веб-сервер на порту 80
  server.begin();
}


void loop()
{
  Serial1.end();
  Serial2.begin(GPSBaud);
  GPS();
  Serial2.end();
  Serial1.begin(9600);
  WiFiEspClient client = server.available();  // прослушивание входящих клиентов
  if (client) {                               // если у вас есть клиент,
    Serial.println("New client");             // вывести сообщение из последовательного порта
    buf.init();                               // инициализируем кольцевой буфер
    while (client.connected()) {              // цикл, пока клиент подключен
      if (client.available()) {               // если есть байты для чтения от клиента,
        char c = client.read();               // прочитать байт, затем
        buf.push(c);                          // помещаем его в кольцевой буфер

        // вывод потока на последовательный монитор замедлится
        // получение данных от ESP, заполняющих последовательный буфер
        //Серийный.запись(с);

        // вы получили два символа новой строки подряд
        // это конец HTTP-запроса, поэтому отправьте ответ
        if (buf.endsWith("\r\n\r\n"))
        {
          sendHttpResponse(client);
          break;
        }
      }
    }

    // закрываем соединение
    client.stop();
    Serial.println("Client disconnected");
  }
}
void GPS() {
  while (Serial2.available() > 0) {
    gps.encode(Serial2.read());
    if (gps.location.isUpdated()) {
      // Широта в градусах (двойная)
      latitude = (gps.location.lat(), 6);
      // Долгота в градусах (двойная)
      longitude = (gps.location.lng(), 6);

      // День (1-31) (u8)
      days = (gps.date.day());
      // Месяц (1-12) (u8)
      months = (gps.date.month());
      // Год (2000+) (до 16 лет)
      years = (gps.date.year());

      // Час (0-23) (u8)
      hr = (gps.time.hour());
      // Минута (0-59) (u8)
      mins = (gps.time.minute());
      // Секунда (0-59) (u8)
      secs = (gps.time.second());
      Serial.println(longitude);
      Serial.println(latitude);
      Serial.println(days);
      Serial.println(months);
      Serial.println(years);
      Serial.println(hr);
      Serial.println(mins);
      Serial.println(secs);

    }
  }
}

void sendHttpResponse(WiFiEspClient client)
{
  // Заголовки HTTP всегда начинаются с кода ответа (например, HTTP/1.1 200 OK)
  // и тип контента, чтобы клиент знал, что придет, затем пустая строка:
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println();

  // содержимое ответа HTTP следует за заголовком:
  client.println("<br>");
  client.println("<br>");
  client.print("Latitude= ");
  client.print(latitude);
  client.print(" Longitude = ");
  client.println(longitude);
  client.println("<br>");
  client.print("Date: ");
  client.print(days);
  client.print("/");
  client.print(months);
  client.print("/");
  client.print(years);
  client.println("<br>");
  client.print("Time: ");
  client.print(hr);
  client.print(":");
  client.print(mins);
  client.print(":");
  client.print(secs);
  // Ответ HTTP заканчивается еще одной пустой строкой:
  client.println();
}

void printWifiStatus()
{
  // вывести SSID сети, к которой вы подключены
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашего WiFi-экрана
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // печатать куда идти в браузере
  Serial.println();
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
  Serial.println();
}

, 👍0

Обсуждение

ты читал ответ?, @Juraj


1 ответ


1

SoftwareSerial не может прослушивать два экземпляра. Существует функция .listen() для переключения между экземплярами SoftwareSerial.

Прошивка esp8266 AT не ждет, пока вы прослушаете экземпляр SoftwareSerial. Если есть соединение с сервером, он отправляет +IPD и данные. Если экземпляр SoftwareSerial не слушает, информация о клиентском соединении теряется.

Вы должны постоянно прослушивать esp8266, поэтому вы не можете использовать два экземпляра SoftwareSerial.

Вы можете использовать вывод RX Uno для получения данных от модуля GPS через аппаратный последовательный порт.

,