Как сохранить значения 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 ++;
}
}
}
@pra, 👍1
2 ответа
Вы можете попробовать использовать 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);
}
Рассматривайте 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.
- Neo 6m выводит что-то, что я как нуб не могу понять
- GPS-модуль uBlox Neo 6M не отвечает
- Измерение расстояния с помощью GPS, запрограммированного на Arduino
- TinyGPS не дает долготу, широту и другие данные
- последовательная передача данных на GPS-экране duinopeak
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Как увеличить срок службы EEPROM?
- Использование EEPROM в цикле ()