Problemi con MKRGPS+MKRENV

Succede perché questo è quello che gli abbiamo chiesto di fare, questa condizione:

if (queryGps == true) {
    if (GPS.available()) {

è equivalente a:

( (queryGps == true)  && (GPS.available()) ) 
  ______true_______   &&  ______true______

Questa porzione di codice più la stampa deve trovarsi fuori dalla condizione if.

      temperature = ENV.readTemperature();
      humidity    = ENV.readHumidity();
      pressure    = ENV.readPressure();
      illuminance = ENV.readIlluminance();

Per rendere asincrona la lettura della ENV è sufficiente creare una temporizzazione di 1 secondo. Per temporizzare codice serve una variabile per temporizzatore, saveMillis è usata per il GPS. Una nuova variabile saveMillis1 temporizza la lettura della ENV.

uint32_t saveMillis1;  // dichiarata globale come per saveMillis
void loop() {
     // qui il codice precedente
     if (queryGps == true) {
         if (GPS.available()) {
             ecc...
         }
     }

    if (millis() - saveMillis1 >= 1000) {
        saveMillis1 = millis();    // salva il contatore di millis
        temperature = ENV.readTemperature();
        humidity    = ENV.readHumidity();
        pressure    = ENV.readPressure();
        illuminance = ENV.readIlluminance();
        // qui il codice per stampare i dati della ENV
        
    }
}

In questo modo interroghi il GPS continuamente fino a che non risponde che ha dati, salvi il tempo in saveMillis e con queryGps = false disabilito l'interrogazione. A questo punto entra in gioco l'else e 500ms dopo avere ricevuto i dati queryGps torna al valore inziale true abilitando nuovamente l'interrogazione.

L'altra temporizzazione di 1 secondo interroga la ENV, questa interrogazione potrebbe avvenire anche durante l'interrogazione del GPS, ma sarà una sola ogni secondo.

Ok, questo è un problema ricorrente in tutte le applicazione pratiche, il tempo di ciclo è dipendente dalla somma dei tempi di ogni compito complesso, ci sono compiti come quello del GPS che impegnano la CPU per più tempo e altri come la EVN che la impegnano per poco tempo.

Per misurare i tempi di esecuzione:

Abbreviando si dice: "prendere le metriche" che si traduce nel scrivere codice di test mirato a verificare le tempistiche e farsi una idea millisecondo più millisecondo meno.

Una introduzione alle macchine a stati finiti semplici basate su switch case:

Sostanzialmente permette di eseguire dei compiti in base al valore di una variabile detta di stato che può assumere qualunque valore in genere 0÷255.

L'uso della funzione millis() è motivo di confusione da parte del principiante, ma basta dedicargli il tempo per allenare il cervello a fare ciò che non ha mai fatto prima. Poi vengono i primi dubbi sul overflow del contatore di millis che nel caso della MKR ricordo essere a 64-bit (non ne sono sicuro), comunque anche con arduino uno il problema dell'overflow è gestibile come descritto qui:

PS: Questa è una community dove si vuole condividere il sapere. Ogni post da l'opportunità a qualcuno di esprimersi. Io dovrei ringraziare te per avermi dato l'opportunità di esprimermi, dall'altro lato tu ringrazi me per averti risolto un problema, ad ogni post dovremmo scrivere grazie grazie, ecco perché ho scritto:

Ciao.