Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

salvare posizione con una pressione

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] salvare posizione con una pressione

Messaggioda Foto Utentedanielealfa » 5 dic 2022, 17:14

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
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."));
}
Avatar utente
Foto Utentedanielealfa
243 2 4 7
Expert
Expert
 
Messaggi: 1313
Iscritto il: 27 mag 2009, 22:51

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti