如何使ESP32将GPS数据记录到SD并显示OLED显示屏

时间:2018-11-11 19:07:01

标签: gps sd-card uart i2c esp32

我正在使用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);
  }
}

我的错误:我使用了ESP32的RX和TX引脚。不要那样做! 它将在串行监视器上输出所有GPS数据(稍作编辑以隐藏我的位置,:-) 串行监视器上只能有MY打印。

  

$ 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 :(得分:0)

我认为无法在允许的时间内读取需要读取数据的设备一次。您可以使用此功能(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);
}

您只能打开一次文件。

我希望这可以为您提供帮助。

答案 1 :(得分:0)

使用芯片的RX和TX引脚进行结果转换是一个大错误。将GPS RX和TX切换到其他未使用的引脚,以及-BAM! -一切正常。