【问题标题】:How to get ESP32 to datalog GPS to an SD and show OLED display如何让 ESP32 将 GPS 数据记录到 SD 并显示 OLED 显示屏
【发布时间】:2018-11-11 19:07:00
【问题描述】:

我正在使用 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 数据(稍作编辑以隐藏我的位置,:-) 在串行监视器上应该只有我的打印。

$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

【问题讨论】:

    标签: gps sd-card uart i2c esp32


    【解决方案1】:

    我认为对于需要在允许时间内读取的数据,设备无法读取一次。你可以使用这个函数(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);
    }
    

    您应该只打开一次文件。

    我希望这可以帮助你。

    【讨论】:

      【解决方案2】:

      原来使用芯片的 RX 和 TX 引脚是个大错误。将 GPS RX 和 TX 切换到其他未使用的引脚 - BAM! - 一切正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 2022-08-02
        • 2020-09-03
        • 1970-01-01
        相关资源
        最近更新 更多