Go Down

Topic: dubbio su else if (Read 920 times) previous topic - next topic

gpb01

#30
Apr 20, 2018, 10:18 am Last Edit: Apr 20, 2018, 10:18 am by gpb01
Scusa ... potersti descrivere IN ITALIANO (quindi NON in codice 'C') esattamente le condizioni che vuoi verificare e cosa significano?

Una cosa del tipo "Se il valore di p_slm è maggiore di p_rif allora devo ..., altrimenti se ... quindi devo valutare ..."
... così vediamo di capire QUALI sono le varie condizioni e COME la cosa si può realizzare al meglio.

Guglielmo
Search is Your friend ... or I am Your enemy !

droidprova

Guglielmo allora tutto gira attorno all'uguaglianza del valore della pressione atmosferica che legge lo strumento (p_slm) ed una variabile (p_rif) di riferimento.

Analizzando ogni 3 ore l'andamento della p_slm rispetto alla p_rif entro un certo margine, possiamo stabilire cosa accadrà nelle prossime 12/12/48 h.

I riferimenti scientifici sono più o meno questi:

Un calo di 1-2 hPa in 3 ore di solito precorre un peggioramento che si manifesta  grosso modo entro le prossime 24-48 ore. Una diminuzione di pressione superiore a 2-3 hPa in 3 ore è in genere sintomo inequivocabile che le condizioni del tempo tendono a peggiorare entro le prossime 12-24 ore. Ma un calo superiore a  5-6 hPa in 3 ore sta a indicare un peggioramento già in atto o imminente e per di più vi è da ritenere che il vento e i fenomeni del tempo potranno essere alquanto violenti.

che ho tradotto in:

Code: [Select]
if (p_slm < p_rif) {                                      // condizioni tempo in peggioramento. Se la pressione riferimento è minore di quella dello strumento

      if ((p_rif - p_slm >= 1) && (p_rif - p_slm <= 2)) {
        Serial.println("prev1"); // partly cloudy/rain's cloudy
        p_rif = p_slm;

      }
      if ((p_rif - p_slm > 2) && (p_rif - p_slm <= 4)) {
        Serial.println("prev2"); //rain light
        p_rif = p_slm;

      }
      if ((p_rif - p_slm >= 5) && (h > 70)) {
        Serial.println("prev3"); // thunderstorms
        p_rif = p_slm;

      }
    }


Nelle Serial.print() inserisco poi una stringa che in base alla condizione verificata, stampa via BT una stringa che l'app riceve e poi attiva l'icona del meteo opportuna.

Ora il modello di previsione deve essere diviso in 3 macro blocchi:

- se la p_slm è minore della p_rif significa che  il tempo è in peggioramento, quindi entro nella condizione e ne verifico nello specifico l'andamento per determinarne meglio gli sviluppi. In questo contesto in un caso utilizzo anche il valore di umidità che lo strumento relativo legge per affinare la previsione;

- se la p_slm è maggiore della p_rif significa che il tempo è in miglioramento, quindi entro nella condizione e ne verifico nello specifico l'andamento per determinarne meglio gli sviluppi. Anche in questo contesto utilizzo  il valore di umidità che lo strumento relativo legge per affinare la previsione;

- se invece la p_slm e p_prif sono uguali o ci sono altre evoluzioni non previste nei precedenti casi, allora analizzo il contenuto dell'ultimo blocco:

Code: [Select]
if ((p_slm < 1000) && (h > 70)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev1"); // partly cloudy/rain's cloudy
      p_rif = p_slm;
    }
    if ((p_slm > 1001) && (p_slm <= 1015)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev4"); // partly cloudy
      p_rif = p_slm;

    }
    if ((p_slm > 1016) && (h < 60)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev5"); // sunny
      p_rif = p_slm;
    }


Spero di aver chiarito meglio ciò che sto cercando di ottenere.

Grazie



Silente

Se ho capito bene la previsione deriva dal confronto tra due pressioni, una misurata ed una statica.
Se è maggiore una si verificano alcuni parametri e si traggono alcune conseguenze
Se è maggiore l'altra si verificano altri parametri e si traggono altre conseguenze
Se sono uguali si verificano un terzo livello di parametri e si traggono un terzo livello di conseguenze.

E fino a capire in che fascia siamo mi pare abbastanza facile. Basterebbe banale banale scrivere una funzione che confronti i due parametri (valore reale e valore di riferimento) e restituisca -1, 0, +1, a seconda della fascia. Il restituito da questa funzione lo si usa come valore per una switch case in tre elementi. Perché così complesso? Così facendo i conti una volta sola si evita la possibilità di sovrapposizione tra if.

Domanda: ora, studiando in dettaglio ogni fascia esiste un modo per ridurre tutto a una switch case interna a quella mostrata? Perché passare alle switch case? Le reputo, seppur o proprio perché limitate, più semplici degli if, e sono più analizzabili in maniera brutale (mentre per un if devo fare si che si avveri l'intera condizione per una case basta che le dia in pasto una variabile con il valore corretto). Inoltre la divisione tra casi possibili è massima senza dover tenere il conto delle parentesi.
Si può fare?

Etemenanki

... Perché così complesso? ...
Forse perche' (se non ho capito male io), le condizioni non sono solo tre ... voglio dire, non e' solo il fatto che sia maggiore, minore o uguale, ma anche "di quanto" e' maggiore o minore, perche' se maggiore o minore entro un certo rango, la previsione e' di un certo tipo, mentre se oltre quel rango e' di un certo altro, quindi come minimo le condizioni dovrebbero essere 5 ... sempre che non serva anche vedere la "velocita'" relativa di variazione, per cui se e' cambiato molto ma in tanto tempo e' un caso, mentre se e' cambiato molto in poco tempo e' ancora un'altro caso diverso ...

> droidprova: ci ho azzeccato, piu o meno ? ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Silente

Se ho capito bene almeno la velocità non interessa. Poi a me le variabili sono apparse ancora più complesse, per questo chiedo se sono semplificabili

droidprova

Se ho capito bene la previsione deriva dal confronto tra due pressioni, una misurata ed una statica.
Se è maggiore una si verificano alcuni parametri e si traggono alcune conseguenze
Se è maggiore l'altra si verificano altri parametri e si traggono altre conseguenze
Se sono uguali si verificano un terzo livello di parametri e si traggono un terzo livello di conseguenze.
esattamente

droidprova

Forse perche' (se non ho capito male io), le condizioni non sono solo tre ... voglio dire, non e' solo il fatto che sia maggiore, minore o uguale, ma anche "di quanto" e' maggiore o minore, perche' se maggiore o minore entro un certo rango, la previsione e' di un certo tipo, mentre se oltre quel rango e' di un certo altro,

> droidprova: ci ho azzeccato, piu o meno ? ...
questo pezzo è giusto, per la velocità bastano le tre ore. Se si vuole andare oltre serve attrezzatura più complessa olte che avere la laurea in meteorologia...:)

droidprova

x Silente, tu intendi una cosa del genere? Il defaul finale nello switch case può aiutare a raccogliere i casi ignorati dai 2 precedenti?


Code: [Select]
void previsioni()
{
  if ((millis() - tempo_prev) > 10800000) {                    // ogni 3 ore controllo come è la p_rif rispetto alla p_slm per capire l'andamento del meteo
   
   if (p_slm < p_rif) {                  // temmpo in peggioramento
      fascia = 1;                           //attivo questo case
    }
   if (p_slm > p_rif) {                  // temmpo in miglioramento         
      fascia = 2;                           //attivo questo case
    }
  } 
    tempo_prev = millis();
   
  switch (fascia) {

      case '1':      // case temmpo in peggioramento
     
        if ((p_rif - p_slm >= 1) && (p_rif - p_slm <= 2)) {
        Serial.println("prev1"); // partly cloudy/rain's cloudy
        p_rif = p_slm;
        }
      if ((p_rif - p_slm > 2) && (p_rif - p_slm <= 4)) {
        Serial.println("prev2"); //rain light
        p_rif = p_slm;
        }
      if ((p_rif - p_slm >= 5) && (h > 70)) {
        Serial.println("prev3"); // thunderstorms
        p_rif = p_slm;
        }
       
         break;
         
      case '2':   // case temmpo in miglioramento
       
      if ((p_slm - p_rif >= 1) && (p_slm - p_rif <= 2)) {
        Serial.println("prev4"); //partly cloudy
        p_rif = p_slm;
        }
      if ((p_slm - p_rif > 2) && (p_slm - p_rif <= 4) && (h < 60)) {
        Serial.println("prev5"); // sunny
        p_rif = p_slm;
      }
       
         break;
         
      default:    // con questo default, posso raccogliere il resto dei casi?
     

      if ((p_slm < 1000) && (h > 70)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev1"); // partly cloudy/rain's cloudy
      p_rif = p_slm;
      }
      if ((p_slm > 1001) && (p_slm <= 1015)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev4"); // partly cloudy
      p_rif = p_slm;
      }
      if ((p_slm > 1016) && (h < 60)) {  // condizione che vorrei far eseguire se nessuna delle precedenti condizione è verificata.
      Serial.println("prev5"); // sunny
      p_rif = p_slm;
      }
   
}

Silente

Si. Ricorda che tutto il testo delle case va messo tra graffe. E anche le case nella switch.
Inoltre per numeri puri va lasciato il numero, senza apostrofi

droidprova

Si. Ricorda che tutto il testo delle case va messo tra graffe. E anche le case nella switch.
Non ho capito

Silente

Si può fare anche qualcosa di meglio.
Nel momento in cui effettui la misura ti calcoli la differenza tra essa e il valore di riferimento, e la salvi in una variabile globale tipo char (char é byte con segno, ricorda che tronca i decimali, quindi 2,9=2). Poi fai uno seitch case usando direttamente quella come variabile.
Mantieni la default co.e é.
Prova a scriverlo e mostra, idea appena venuta

Etemenanki

Hai dimenticato ...

se p_rif-p_slm maggiore di 100 ed h maggiore di 99, stampa "SCAPPA !!!"

(scusa, non ho resistito :D)

Seriamente, invece ... ma le previsioni, oltre che dalla differenza istantanea (considerando "istantanea" l'intervallo della lettura di 3 ore), non sono anche influenzate dalla media e dalla curva di alcune letture precedenti, almeno 4 o 5, se non ricordo male ? ... oppure a te interessa solo la previsione momentanea, con la possibilita' data dalla variazione singola, anche se potenzialmente meno precisa ?

E poi 3 ore non sono un po troppe ? ... qui a volte un temporale ci mette 5 minuti scarsi, a tirarti in testa di tutto e poi sparire, in certi periodi dell'anno ... quindi forse, battuta iniziale a parte, converrebbe introdurre anche una funzione di controllo che legga, tipo, una volta al minuto, e dia una specie di allarme in quei casi ? ... o no ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

droidprova

#42
Apr 20, 2018, 06:27 pm Last Edit: Apr 20, 2018, 06:27 pm by droidprova
Ete stiamo valutando previsioni locali con un margine d'errore sensibile che valutano la pressione al suolo e l'umidità relativa. E' vero un temporale in zone alpine ci mette 5 minuti ad arrivare, ma a parte pochi casi (che la mia centrale non si prefigge di prevedere) per gli altri, vuole dire che la pressione al suolo nelle 3 ore precedenti è precipitata di almeno 5-6 hPa.

Grazie

Silente

Comunque intendevo una cosa di questo tipo:
Code: [Select]

switch (variabile)
{
case 1:
{


}
case 2:
{


}
case 3:
{


}.
.
.
default:
{

}
}

Capito l'altro consiglio?

droidprova

Capito! Allora cominciamo a provare il primo blocco, poi passo al tuo secondo consiglio ed infine valuto quale sistema sbaglia di meno.

Penso che questa funzione se resa funzionante può essere utile x tutti coloro che con Arduino costruiscono la classica centrale meteo.

Vi aggiorno e vi seguo per altri consigli.

Grazie a tutti!

Go Up