Как сохранить значения GPS в EEPROM Arduino?

У меня есть две успешно работающие индивидуальные программы, 1.Программа извлечения координат GPS. 2.Программа сохранения и чтения EEPROM. Теперь все, что мне нужно сделать, это объединить их оба. Каждый раз, когда обновляется местоположение GPS, я хочу сохранять эти данные о широте в памяти EEPROM, заменяя ранее сохраненные данные, но, полагаю, моя программа не может их сохранить, она просто показывает пустые места при чтении EEPROM. Пожалуйста, помогите мне, ребята. Вот мой код.

#include <SoftwareSerial.h> 
#include <TinyGPS++.h>
#define RXPin 8
#define TXPin 9
#define GPSBaud 9600
#define ConsoleBaud 9600

// Последовательное подключение к устройству GPS
SoftwareSerial ss(RXPin, TXPin);

// Объект TinyGPS++
TinyGPSPlus gps;
#include <EEPROM.h>
int address = 0; 
int read_value = 0; 
char data;
void setup()
{
  Serial.begin(ConsoleBaud);
  ss.begin(GPSBaud);
  Serial.println("Previous value stored :");
  for(address = 0; address < 25; address ++)        // прочитать всю память EEPROM
  {  
    read_value = EEPROM.read(address);
    Serial.write(read_value);
  }
  Serial.println("\n");

}

void loop()
{

  while (ss.available() > 0)
    gps.encode(ss.read());

  if (gps.location.isUpdated() || gps.altitude.isUpdated())
  {
    Serial.print("Location: "); 
    Serial.print(gps.location.lat(), 6);
    Serial.print(",");
    Serial.print(gps.location.lng(), 6);
    Serial.println("\n");

    data=(gps.location.lat(), 6);

    for(address = 0; address < 25;  )
    {
      EEPROM.write(address, data); 
      address ++;
    }
  }
}

, 👍1


2 ответа


1

Вы можете попробовать использовать sprintf. Сначала определите буфер:

char data[25];

Затем используйте sprintf для печати в буфер:

sprintf(data, "Location: %.3f,%.3f\n", gps.location.lat(), gps.location.lon());

%.3f выводит число с плавающей точкой с 3 десятичными знаками. Подробности см. в справочнике printf.

Затем запишите буфер в EEPROM:

for(address = 0; address < 25; address++ )
{
  EEPROM.write(address, data);
}
,

2

Рассматривайте TinyGPS++ вместо TinyGPS только в том случае, если вы работаете на процессоре Due или , который может использовать преимущества более высокой точности 64-битной «двойной» плавающей точки.

char data; должны быть double data;. В противном случае вы тратите ресурсы впустую.

data=(gps.location.lat(), 6); — это не то, как вы это делаете. Вам нужно указать точность только при записи в Serial, например Serial.print(gps.location.lat(), 6);. Сделайте так: data = gps.location.lat();.

адрес ++; должен быть адрес = адрес <=512-sizeof(адрес) ? (адрес + sizeof(данные)): 0 ;

address <=512-sizeof(address) гарантирует, что последнее значение, записанное в EEPROM, будет записано полностью.

В качестве альтернативы я бы порекомендовал это, чтобы сохранить структуру данных непосредственно в EEPROM, и то, что упоминает @jfpoilpret.

,