我正在使用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
答案 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! -一切正常。