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