salvare posizione con una pressione
salve a tutti, sto facenfo un aggeggio che mi indica la distanza da da un punto precedentemente memorizzato.
lo schetc che ho fatto funziona , legge e scrive correttamente la eeprom, ma mi trovo in difficolta a trovare il modo per poter memorizzare la posizione attuale.
in tutto vorrei , se si puo' fare avere un max di 30\40 posizioni , arrivati alla fine si ferma di memorizzare.
poi per cancellarli n nel caso premo un altro tasto e cancello tutto.
l'unica difficolta' e' nel riuscire a memorizzare aumentando la posizione della sctruct a ogni pressione
ringrazio in anticipo a coloro mi possano dare una dritta
lo schetc che ho fatto funziona , legge e scrive correttamente la eeprom, ma mi trovo in difficolta a trovare il modo per poter memorizzare la posizione attuale.
in tutto vorrei , se si puo' fare avere un max di 30\40 posizioni , arrivati alla fine si ferma di memorizzare.
poi per cancellarli n nel caso premo un altro tasto e cancello tutto.
l'unica difficolta' e' nel riuscire a memorizzare aumentando la posizione della sctruct a ogni pressione
ringrazio in anticipo a coloro mi possano dare una dritta
- Codice: Seleziona tutto
#include <EEPROM.h>
float distanceToDest[10];
float courseToDest[10];
byte a = 22;
int posto=0;
float piu_vicino=999923.54;
struct LatLon
{
float Lat;
float Lon;
};
LatLon LatLonList[] =
{
{38.210169, -75.689734},
{38.210169, -75.689734}, // United Arab Emirates
{44.383860, 9.2838777}, // mio44
{41.153332, 20.168331}, // Albania
{41.153332, 20.168331}, // Armenia
{43.153332, 24.168331}, // Armenia
};
const int LatLonCount = sizeof LatLonList / sizeof LatLonList[0];
byte Index = 0;
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
// For stats that happen every 5 seconds
unsigned long last = 0UL;
int ledPin = 13;
void writeCoords(){
int address = 0;
for (int i = 0; i < LatLonCount; i++){
EEPROM.put(address, LatLonList[i].Lat);
address += sizeof(LatLonList[i].Lat);
EEPROM.put(address, LatLonList[i].Lon);
address += sizeof(LatLonList[i].Lon);
}
}
void readCoords(){
int address = 0;
for (int i = 0; i < LatLonCount; i++){
EEPROM.get(address, LatLonList[i].Lat);
address += sizeof(LatLonList[i].Lat);
EEPROM.get(address, LatLonList[i].Lon);
address += sizeof(LatLonList[i].Lon);
}
}
void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
pinMode(ledPin, OUTPUT);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
//EEPROM.get(0, Index);
//if (Index >= LatLonCount)
// Index = 0;
}
void loop(){
if (digitalRead(7)==LOW) {
writeCoords();
Serial.print("scrivi");
}
if (digitalRead(8)==LOW) {
readCoords();
Serial.print("leggi");
}
float currentLat, currentLon;
// Dispatch incoming characters
while (ss.available() > 0)
gps.encode(ss.read());
if (gps.location.isUpdated() && millis() - last > 5000)
{
last = millis();
currentLat = gps.location.lat();
currentLon = gps.location.lng();
Serial.print(F(" Lat="));
Serial.print(currentLat, 6);
Serial.print(F(" Long= "));
Serial.println(currentLon, 6);
Serial.print(F(" course="));
Serial.println(gps.course.deg());
if (gps.location.isValid())
{
Serial.println("Fix is valid.");
Serial.println(LatLonCount);
}
else
{
Serial.println("Fix is not yet valid.");
return;
}
for (int x = 0; x <LatLonCount; x++) {
distanceToDest[x] =
TinyGPSPlus::distanceBetween(
currentLat,
currentLon,
LatLonList[x].Lat,
LatLonList[x].Lon);
courseToDest[x] =
TinyGPSPlus::courseTo(
currentLat,
currentLon,
LatLonList[x].Lat,
LatLonList[x].Lon);
Serial.print(F("Distance:"));
Serial.print(x); Serial.print(" km ");
Serial.print(distanceToDest[x] / 1000, 4); // *Prints distance to destination
Serial.print(" direzione : ");
Serial.print(courseToDest[x]);
Serial.println(F(" degrees"));
Serial.print(F("direzione cardinale ["));
Serial.print(TinyGPSPlus::cardinal(courseToDest[x]));
Serial.println(F("]"));
if (distanceToDest[x] < piu_vicino) {//creo valore
posto=x; // point
piu_vicino = distanceToDest[x]; //+ vicino
}
if (distanceToDest[x] / 1000 < 6.0500) { //
a = x; // imposto soglia limite distanza
}
}
Serial.print(piu_vicino/1000,3);
Serial.print(F(" km piu' vicino ")); Serial.println(posto);
if (a < 7) {
Serial.print("We have arrived.");
Serial.println(a);
digitalWrite(ledPin, HIGH);
Index++;
delay(1500);
if (Index >= LatLonCount)
Index = 0; // Start over when we run out of destinations
// EEPROM.put(0, Index);
a = 8;
}
else
{
digitalWrite(ledPin, LOW);
a = 8;
delay(1500);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data. Check wiring."));
}