GPS e antifurto auto

Ciao a tutti, cercavo di realizzare un piccolo antifurto per l’auto utilizzando arduino UNO, una shield gps e il modulo gsm Siemens tc35. in pratica vorrei che, parcheggiata l’auto, una volta che “la shield gps” rileva le coordinate, espresse nella forma LAT = 17.458945 LON = 67.156755, le invii tramite sms al mio cellulare; fatto ciò continuerà a ricevere le coordinate (che saranno differenti per alcuni millesimi o ancora di meno e quando queste assumeranno valori esterni ad un certo range, ossia quando la macchina avrà iniziato a muoversi, inizi ad inviare sms con la nuova posizione ogni 30 secondi. Cioè che non riesco a fare nello sketch è memorizzare le primissime coordinate in una nuova variabile e poi confrontare tutte le successive posizioni con questo valore. nella realizzazione dello sketch ho però un problema: Vi mostro cosa ho scritto, tralasciando (commentando) la parte di invio dell’sms che per il momento non mi interessa. :

#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial ss(6,7);

void setup(){
  Serial.begin(9600);
  // gsm.begin(9600);
  ss.begin(9600);
  delay(3000);
  Serial.println("Send GPS coordinates to smartphone");
  Serial.println(" ");
}

void loop() {
  bool newData = false;  
  unsigned long chars;
  unsigned short sentences, failed;
  float flat, flon, a, b;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); 
      if (gps.encode(c)) 
        newData = true;
    }
  }

  if (newData)
  {
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.println(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
    Serial.println("a=");
    Serial.println(a);
    Serial.println("b=");
    Serial.println(b);
    
  }
  
  gps.stats(&chars, &sentences, &failed);
  if (sentences == 2){
//    Serial.println("AT");
//    delay(100);
//    Serial.print("AT+CMGF=1\r");
//    delay(100);
//    Serial.println("AT+CMGS=\"+3937*******5\"");
//    delay(100);
    Serial.print("LT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" ");
    Serial.print("LN=");
    Serial.println(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    delay(100);
    Serial.println((char)26);
    delay(5000); 
    a = flat;
    b = flon;
    Serial.print("a= ");
    Serial.println(a,6); 
    Serial.print("b= ");
    Serial.println(b,6); 
    }
  

  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
    
//  if (flat > a+0.001 || flat < a-0.001){
//     Serial.println("AT");
//    delay(100);
//    Serial.print("AT+CMGF=1\r");
//    delay(100);
//    Serial.println("AT+CMGS=\"+3937*******5\"");
//    delay(100);
//    Serial.print("LT=");
//    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
//    Serial.print(" ");
//    Serial.print("LN=");
//    Serial.println(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
//    delay(100);
//    Serial.println((char)26);
//    delay(90000); 
        
//}
}

una volta che la variabile sentences è uguale a 2 il gps è connesso e rileva la posizione; conservo quindi questi valori di “flat” e “flon” (rispettivamente latitudine e longitudine) nelle variabili “a” e “b” rispettivamente:

a = flat;
b = flon;

stampo sul monitor seriale questi valori e fin qui tutto ok. Appena vengono letti i nuovi valori di “flat” e “flon”, ossia le nuove coordinate, “a” e “b” assumono nuovamente valori 0.000000 perdendo definitivamente i valori assunti precedentemente. Questo perchè, credo, la dichiarazione all’inizio del loop

float flat, flon, a, b;

azzera nuovamente “a” e “b”. avete suggerimenti su come posso correggere questo errore? Grazie mille :slight_smile:

Documentati cosa sono variabili locali e globali. http://arduino.cc/en/Reference/Scope

Ciao Uwe

Che sbadato a non pensarci! Risolto con un semplice "static". Grazie mille per la dritta ;)

Oppure le porti fuori dal loop, mettendole all'inizio dello sketch, così facendo le vedi ovunque e rendi il loop stesso più "leggero". ;)