Esecuzione IF anomala

ciao
sto testando uno sketch, ma mi sembra di avere un IF eseguito quando non dovrebbe

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPSPlus object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

TinyGPSCustom lat(gps, "GPGLL", 1); // $GPXXX sentence, ith element

unsigned long previousMillis;        // Utilizzata per memorizzare il tempo del ciclo precedente
unsigned long currentMillis;
long interval;     // Tempo in millisecondi utilizzato per fare lampeggiare il led
int pinLed;      // Pin LED
int stateLed;    // Stato del LED (LOW/HIGH)

float lat_1, lat_2, lat_max;
float lat_prev;
float lat_avg, lat_avgold;
float lat_value;
int sample_dim, i, j, k;//contatori
char stringa_GPS;

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

 

  Serial.println(F("UsingCustomFields.ino"));
  Serial.println(F("Demonstrating how to extract any NMEA field using TinyGPSCustom"));
  Serial.print(F("Testing TinyGPSPlus library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();

  lat_1 = 5437.06800;
  lat_2 = 5437.06500;
  lat_max = 0.0;
  lat_value = 0.0;
  sample_dim = 5;
  i = 0;
  stringa_GPS = "";

  unsigned long previousMillis = 0;       // Utilizzata per memorizzare il tempo del ciclo precedente
  unsigned long currentMillis = 0;
  const long interval = 60000; // Tempo in millisecondi utilizzato per fare lampeggiare il led
  int pinLed    = 8;      // Pin LED
  int stateLed  = LOW;    // Stato del LED (LOW/HIGH)

  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("GPS");
}

void loop()
{
  while (ss.available() > 0)
  {
    gps.encode(ss.read());
  }
  //Serial.println(stringa_GPS);

  //fa la sommattoria di valori
  if (lat.isUpdated())// Every time anything is updated, print everything.
  {
    i++;
    lat_value += (atof(lat.value())) * 10000.0;

    Serial.print("i = ");
    Serial.print(i);

    Serial.print(" LAT = ");
    Serial.println(lat.value());

    Serial.print("atof(lat.value()) = ");
    Serial.println(atof(lat.value()),6);    
  }

  //esegue la media di n letture
  if (i == sample_dim)
  {
    i = 0;

    Serial.print("sommatoria lat_value*10000 = ");
    Serial.println(lat_value, 6);

    Serial.print("sommatoria lat_value/10000 = ");
    Serial.println(lat_value / 10000.0, 6);

    lat_avg = (lat_value / 10000.0) / 5.0; //float(sample_dim);

    Serial.print("lat_avg = ");
    Serial.println(lat_avg, 6);

    Serial.print("abs(lat_avgold - lat_avg) = ");
    Serial.println(abs(lat_avgold - lat_avg), 6);

    currentMillis = millis();

    Serial.print("currentMillis = ");
    Serial.println(currentMillis);

    if (abs(lat_avgold - lat_avg) <= .0009) //verifa macchina in movimento
    {
      if (currentMillis - previousMillis >= interval)
      {
        Serial.print("currentMillis - previousMillis = ");
        Serial.println(currentMillis - previousMillis);
        
        previousMillis = currentMillis;

        Serial.print("previousMillis = ");
        Serial.println(previousMillis);

        Serial.println("macchina ferma");
        Serial.println();
        
        /* if (stateLed == LOW)
          {
           stateLed = HIGH;
          }
          else
          {
           stateLed = LOW;
          }

          digitalWrite(pinLed, stateLed);*/        
      }
    }
    else
    {
      Serial.println("macchina in movimento");
      Serial.println();
      lat_avgold = lat_avg;
    }

    // for ( j = 0; j <= 6; j++)//calcola il settore di partenza
    //  {
    if (lat_avg > lat_1 && lat_avg < lat_2)
    {
      Serial.println("sono nel settore X");
      Serial.println();
      lat_value = 0.0;
    }
    else
    {
      Serial.println("sono nel settore X-1 o X+1");
      Serial.println();
      lat_value = 0.0;
    }
    //}
  }
}

questa è la parte incriminata

if (currentMillis - previousMillis >= interval)
      {
        Serial.print("currentMillis - previousMillis = ");
        Serial.println(currentMillis - previousMillis);
        
        previousMillis = currentMillis;

        Serial.print("previousMillis = ");
        Serial.println(previousMillis);

        Serial.println("macchina ferma");
        Serial.println();         
      }

questo un estratto dell output

i = 1 LAT = 5437.04665
atof(lat.value()) = 5437.046386
i = 2 LAT = 5437.04690
atof(lat.value()) = 5437.046875
i = 3 LAT = 5437.04689
atof(lat.value()) = 5437.046875
i = 4 LAT = 5437.04736
atof(lat.value()) = 5437.046875
i = 5 LAT = 5437.04759
atof(lat.value()) = 5437.047851
sommatoria lat_value*10000 = 271852352.000000
sommatoria lat_value/10000 = 27185.234375
lat_avg = 5437.046875
abs(lat_avgold - lat_avg) = 0.000488
currentMillis = 11494
currentMillis - previousMillis = 11494
previousMillis = 11494
macchina ferma

in pratica IF incriminato sopra viene eseguito anche se

currentMillis - previousMillis = 11494

è minore di INTERVAL = 60000

riuscite a vedere quello che non vedo io?
Grazie
Stefano

Questa riga dichiara una nuova variabile visibile solo nel setup().

Anche queste 2 varibili vengono dichiarate una seconda volta.

@fratt grazie
Capito
Domani sera provo

Queste dichiarazioni sono locali è cessano di esistere quando la funzione setup() termina.
Mentre nello spazio dello variabili globali hai le stesse variabili, se vuoi inizializzare queste variabili
nel setup non devi dichiararle ma usarle assegnandovi i valori.

Non è mai piaciuta previousMillis = currentMillis;
Preferisco ```previousMillis = millis(); questo perché in currentMillis potrebbe esserci una valore troppo vecchio.

Ciao.

@Maurotec grazie
stasera provo

in effetti

Grazie
fatto le modifiche suggerite dalle osservazioni
adesso lavora correttamente

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.