Serial2 ESP32 не отвечает (NEO 6M GPS) - PullRequest
0 голосов
/ 26 февраля 2020

Я работаю над проектом автономного автомобиля, и у меня есть GPS-модуль NEO 6M, я использую ESp32 в качестве платы, модуль прекрасно работает с Arduino и Nodemcu. но не с ESP32, причина в том, что он не поддерживает программный серийный номер, поэтому я получил помощь от https://www.youtube.com/watch?v=GwShqW39jlE&feature=emb_title

Я добавил аппаратный серийный номер, но тем не менее, нет никакого вывода, я предоставил код ниже

#include<HardwareSerial.h>//No extra libray installed
#define RXD2 16
#define TXD2 17

HardwareSerial gps_serial(2);

void setup() {
  Serial.begin(115200);
  Serial.printf("LETS START");
 gps_serial.begin(115200, SERIAL_8N1, RXD2, TXD2);
}

void loop() {
  while (gps_serial.available()) {
   Serial.print(char(gps_serial.read()));  // read from gps, write to serial debug port
  Serial.print("I am here");
  }
}

Выход на последовательном мониторе: LETS START Другой код, который работал на других платах, также представлен ниже, отредактированный для работы в ESP32

#include <WiFi.h>
//#include <WiFiClient.h>
#include <WiFiServer.h>

#include <TinyGPS++.h> // library for GPS module
//#include <SoftwareSerial.h>
//#include <ESP8266WiFi.h>
TinyGPSPlus gps;  // The TinyGPS++ object
//SoftwareSerial ss(4, 5); // The serial connection to the GPS device
HardwareSerial Serial2(2);


const char* ssid = "***********"; //ssid of your wifi
const char* password = "***********"; //password of your wifi
float latitude , longitude;
int year , month , date, hour , minute , second;
String date_str , time_str , lat_str , lng_str;
int pm;
WiFiServer server(80);

void setup()
{  Serial2.begin(115200);
  Serial.begin(115200);
  //ss.begin(9600);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password); //connecting to wifi
  while (WiFi.status() != WL_CONNECTED)// while wifi not connected
  {
    delay(500);
    Serial.print("."); //print "...."
  }
  Serial.println("");
  Serial.println("WiFi connected");
  server.begin();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());  // Print the IP address
}


void loop()
{
  while (Serial2.available() > 0) //while data is available
    if (gps.encode(Serial2.read())) //read gps data
    {
      if (gps.location.isValid()) //check whether gps location is valid
      {
        latitude = gps.location.lat();
        lat_str = String(latitude , 6); // latitude location is stored in a string
        longitude = gps.location.lng();
        lng_str = String(longitude , 6); //longitude location is stored in a string
      }
      if (gps.date.isValid()) //check whether gps date is valid
      {
        date_str = "";
        date = gps.date.day();
        month = gps.date.month();
        year = gps.date.year();
        if (date < 10)
          date_str = '0';
        date_str += String(date);// values of date,month and year are stored in a string
        date_str += " / ";

        if (month < 10)
          date_str += '0';
        date_str += String(month); // values of date,month and year are stored in a string
        date_str += " / ";
        if (year < 10)
          date_str += '0';
        date_str += String(year); // values of date,month and year are stored in a string
      }
      if (gps.time.isValid())  //check whether gps time is valid
      {
        time_str = "";
        hour = gps.time.hour();
        minute = gps.time.minute();
        second = gps.time.second();
        minute = (minute + 30); // converting to IST
        if (minute > 59)
        {
          minute = minute - 60;
          hour = hour + 1;
        }
        hour = (hour + 5) ;
        if (hour > 23)
          hour = hour - 24;   // converting to IST
        if (hour >= 12)  // checking whether AM or PM
          pm = 1;
        else
          pm = 0;
        hour = hour % 12;
        if (hour < 10)
          time_str = '0';
        time_str += String(hour); //values of hour,minute and time are stored in a string
        time_str += " : ";
        if (minute < 10)
          time_str += '0';
        time_str += String(minute); //values of hour,minute and time are stored in a string
        time_str += " : ";
        if (second < 10)
          time_str += '0';
        time_str += String(second); //values of hour,minute and time are stored in a string
        if (pm == 1)
          time_str += " PM ";
        else
          time_str += " AM ";
      }
    }

 WiFiClient client = server.available(); // Check if a client has connected
  if (!client)
  {
    return;
  }
  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>";
  s += "a:link {background-color: YELLOW;text-decoration: none;}";
  s += "table, th, td </style> </head> <body> <h1  style=";
  s += "font-size:300%;";
  s += " ALIGN=CENTER> GPS DATA</h1>";
  s += "<p ALIGN=CENTER style=""font-size:150%;""";
  s += "> <b>Location Details</b></p> <table ALIGN=CENTER style=";
  s += "width:50%";
  s += "> <tr> <th>Latitude</th>";
  s += "<td ALIGN=CENTER >";
  s += lat_str;
  s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >";
  s += lng_str;
  s += "</td> </tr> <tr>  <th>Date</th> <td ALIGN=CENTER >";
  s += date_str;
  s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >";
  s += time_str;
  s += "</td>  </tr> </table> ";

  s += "</body> </html>";

  client.print(s); // all the values are send to the webpage
  delay(100);
}

Я получаю IP-адрес на последовательном мониторе, когда я запускаю его, но когда я получаю доступ к этому адресу, поля пустые. Так что я понимаю, что последовательная связь с модулем GPS не работает. Я попробовал много других решений на net, но не использовал вообще.

Я использую ESP32 DevKit V1, версия с 30 выводами

1 Ответ

0 голосов
/ 27 февраля 2020

Не зная, какой именно модуль ESP32 вы используете точно, есть два ограничителя показа

Для GPS-модуля NEO-6M требуется 5 В, выводы ESP32 выдают максимум 3,6 В - обычно 3,3 В
Некоторые модули ESP32 блокируют определенные контакты, чтобы использовать их для SD-карты, камеры, ЖК-дисплея или других функций на борту. Итак, посмотрите таблицу ваших вариантов платы esp32.

Код должен быть в порядке, если HWSerial2 существует. Если вы используете версию ESP32 ниже 1.03, вам нужно определить HWSerial,
ESP32 1.04, в этом больше нет необходимости

#define RXD2 16
#define TXD2 17
...
HardwareSerial Serial2(2);

...
Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);

и 5 В питание подается на модуль GSM.

Редактировать 2: Кредит hcheung, спрашивающий самую основную c вещь
Решение состояло в том, что OP имел RX к RX и TX к TX вместо контакта RX ESP на прием по GPS и наоборот. Итак, проблема решена

...