Как получить ESP32 для регистрации данных GPS на SD и показать OLED-дисплей - PullRequest
0 голосов
/ 11 ноября 2018

Я использую ESP32 (Wemos D1 Mini) для отслеживания GPS (RadioLink SE100), отображения его на OLED и записи на SD-карту (VMA304).Все работает хорошо, самостоятельно.Но все вместе, компиляция в порядке, загрузка работает, OLED отображает некоторые ранние сообщения, и GPS передает данные, но затем все перестает работать.Я получил последовательное сообщение: «Более 100 ошибок кадра, UART RX был отключен».Итак, я закомментировал строку Serial.begin (115200).В последовательный монитор выводятся хорошие данные GPS, но они не записываются в SD-файл.Я думаю, что корень проблемы в GPS.Если я просто отключу GPS, все остальное работает.Есть идеи?

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h> //  OLED - text
#include <Adafruit_GFX.h>     //  OLED - graphics
#include <ESP8266WiFi.h>      //  WeMos D1 Mini ESP32
#include <SD.h>               //  SD Card (VMA304)
#include "TinyGPS++.h"        //  RadioLink SE100
#include "SoftwareSerial.h"

SoftwareSerial GPSmodule(0,2);  // DON'T USE TX and RX pins!!
TinyGPSPlus gps;                 // GPS object for the NMEA data

#define OLED_ADDR   0x3C   // OLED display TWI address
Adafruit_SSD1306    display(-1); 

#define  CS_pin  D8        //  SD card - needs to be output
File     myFile;

void setup() {
  // Serial.begin( 115200 );
  // start OLED display
  display.begin( SSD1306_SWITCHCAPVCC, OLED_ADDR );
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.clearDisplay();
  display.setCursor(20,10);
  display.print("GPS data to");
  display.setCursor(20,30);
  display.print("OLED display");
  display.setCursor(20,50);
  display.print("& SD Card");
  display.display();
  //  start GPS
  GPSmodule.begin( 9600 );  // start the GPS
  Serial.println( "GPS Start" );
  //  start SD card
  pinMode( CS_pin, OUTPUT );    //  for SD card
  if( !SD.begin( CS_pin )) {
    Serial.println( "SD card initialization failed!" );
    return;
  }
  Serial.println( "SD card initialized." );  
}

void loop() {
  while(GPSmodule.available()) {  // While characters come from the GPS
    gps.encode(GPSmodule.read()); // Feed serial NMEA data into library one char at a time
  }
  if( gps.location.isUpdated() ) {  //  constantly get packages of NMEA data
    //  Write the latest info from the GPS data to the SD card
    display.clearDisplay();
    display.setCursor(20,10);
    display.print( "Wemos.txt" );
    display.display();
    myFile = SD.open( "Wemos.txt", FILE_WRITE );
    // write stuff in it
    if( myFile ) {
      display.clearDisplay();
      display.setCursor(20,30);
      display.print( "GPS data" );
      display.display();
      myFile.println("Satellite Count:");
      myFile.println(gps.satellites.value());
      myFile.println("Latitude:");
      myFile.println(gps.location.lat(), 6);
      myFile.println("Longitude:");
      myFile.println(gps.location.lng(), 6);
      myFile.println("Speed MPH:");
      myFile.println(gps.speed.mph());
      myFile.println("Altitude Feet:");
      myFile.println(gps.altitude.feet());
      myFile.println("");
      display.setCursor(20,30);
      display.print( "file done" );
      display.display();
    }
    myFile.close();
    delay(100);
  }
}

МОЯ ОШИБКА: Я использовал контакты RX и TX на ESP32.Не делай этого!Он выведет все данные GPS на последовательный монитор (слегка отредактированный, чтобы скрыть мое местоположение :-) На последовательном мониторе должны быть только МОИ отпечатки.

$ GLGSV, 3,1,10, 66,42,088,24,68,62,000,48,68,24,298,, 86,01,018, * 6E $ GLGSV, 3,2,10,86,44,046,41,88,46,129,40,88,10,181 ,,82,24,248,36 * 6E $ GLGSV, 3,4,10,84,44,294,18,84,06,446, * 61 $ GNGLL, 4246,18869, N, 08409.46219, W, 196640,00, A, A * 61 $ GNRMC, 196641,00, A, 4246.18880, N, 08409.46228, W, 0.146,, 111118 ,,, A * 8A $ GNVTG ,, T ,, M, 0.146, N, 0.268, K, A * 41 $ GNGGA, 196642.00,4246.18880, N,08409,46228, W, 1,12,0,84,246,6, M, -44,9, M ,, * 82 $ GNGSA, A, 4,10,20,42,24,14,21,16,12,26 ,,,,1,64,0,84,1,29 * 18 $ GNGSA, A, 4,68,88,86,66,84,82 ,,,,,,, 1,64,0,84,1,29 * 1B $ GPGSV, 5,1,18,08,06,289, 10,86,332,40,11,02,428, 12,11,106,19 * 88 $ GPGSV, 5,2,18,14,40,266,28,16,14,080,24,18,14,421,18,20,80,118,46 * 88 $ GPGSV, 5,3,18,21,26,184,21,24,41,068,16,26,06,139,22,28,04,261,09 * 86 $ GPGSV, 5,4,18,41,00,206, 42,49,268,41,46,24,248, 48,20,240,28 * 81 $ GPGSV, 5,6,18,61,46,214, * 4A

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Оказывается, использование выводов RX и TX чипа - большая ошибка. Переключил GPS RX и TX на другие неиспользуемые контакты и - БАМ! - все работает.

0 голосов
/ 12 ноября 2018

Я думаю, что устройство не может быть прочитано один раз для данных, которые должны быть прочитаны в течение разрешенного времени.Вы можете использовать эту функцию (smartdelay (100)), чтобы изменить «delay (100)»

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (GPSmodule.available())
      gps.encode(GPSmodule.read());
  } while (millis() - start < ms);
}

Вам следует открывать файлы только один раз.

Надеюсь, это поможет вам.

...