Quando l'IF falla

ciao,

stavolta sono alle prese con qualcosa che sta tutto in 4 linee di codice, ma NON E' POSSIBILE che accada e invece.....

questo e' il codice:

Serial.println("CONTROLLO LUX***************************************************");
Serial.println(LastReportDay);
Serial.println(luxAvg);
Serial.println(prevAvgValues.lux);
    if (strcmp(LastReportDay, "") != 0) {
      delta = luxAvg - prevAvgValues.lux;
      if (delta > 0) {
        Serial.println("Delta > 0");
        Serial.println(delta);
        Sdelta = "↑";
      } else if (delta < 0) {
        Serial.println("Delta < 0");
        Serial.println(delta);
        Sdelta = "&darr;";
      } else {
        Serial.println("Delta = 0");
        Serial.println(delta);
        Sdelta = "-";
      }
    }
    
    Serial.println(Sdelta);
    Serial.println("-----------------------------------------------------------------");

si tratta banalmente di valorizzare una variabile con il simbolino HTML della freccia in alto, in basso, oppure "-" , in base al valore della differenza fra due variabili.
Bene : questo e' l'output:

00:28:51.271 -> CONTROLLO LUX***************************************************

00:28:51.271 -> 06-08-2023 00:28:33

00:28:51.271 -> 59.29

00:28:51.271 -> 59.29

00:28:51.271 -> Delta < 0

00:28:51.271 -> -0.00

00:28:51.271 -> &darr;

00:28:51.271 -> -----------------------------------------------------------------

Come vedete, i due valori da confrontare, sono uguali (dichiarati float) , stampati giusto una riga prima del calcolo, ma poi l'if imbocca la strada del delta < 0 (!!!) .

Voglio precisare, che nelle iterazioni precedenti , questo stesso pezzo di codice funziona perfettamente......

Sento puzza di 'magheggi' in memoria del wemos lolin32 lite dove gira il codice.... mi sbaglio?
grazie

Sai che di default la println sui float stampa solo 2 decimali?
I tuoi numeri potrebbero essere ad esempio 59.293 e 59.294 e quindi il delta essere 0.001 ma stampando solo 2 decimali non lo vedi

1 Like

Grazie 1000. In effetti, ho risolto, facendo fare i calcoli considerando solo 2 decimali e ritrasformandoli poi in float. Ci sono ammattito dietro una nottata! Sono sempre più propenso a passare a micropython….

Bene, ma se per caso hai bisogno di vedere più decimali, puoi usare "dtrostrf":

    if (strcmp(LastReportDay, "") != 0) {
      delta = luxAvg - prevAvgValues.lux;
      char buf[16];
      dtostrf(delta, 7, 4, buf); // 7 caratteri totali, di cui 4 decimali
      if (delta > 0) {
        Serial.println("Delta > 0");
        Serial.println(buf);
        Sdelta = "&#x2191;";
      } else if (delta < 0) {
        Serial.println("Delta < 0");
        Serial.println(buf);
        Sdelta = "&darr;";
      } else {
        Serial.println("Delta = 0");
        Serial.println(buf);
        Sdelta = "-";
      }
    }
1 Like

Scusate, ma usare l'apposito parametro della Serial.print() / Serial.println() che indica i decimali che si vogliono vedere?

  • Serial.print(1.234567, 2) stampa "1.23"
  • Serial.print(1.234567, 4) stampa "1.2345"
  • Serial.print(1.234567, 6) stampa "1.234567"

... e così via. Il default è 2.

Guglielmo

Si ma qui il problema era che lui giustamente fa i calcoli coi float, poi, quando fa il compare, basta un decimillesimo che mi falsa il flusso del programma, perche' a me oltre i centesimi non interessa..... e se andavo a stampare i valori di test, vedevo invece i valori uguali e non mi spiegavo come mai...

... stampando come ho indicato sarebbe stato evidente :wink:

Guglielmo

Ok, quindi basta questo:

      float delta = roundf((luxAvg - prevAvgValues)*100.0)/100.0;
1 Like

Ma perché, scusa con micropython questo non accade?

Non conosco micropython ma solo python e ci ho pure perso la mano, pensa te
che prima non usavo C/C++ ma solo python, però credendo che il C/C++ fosse più rapido ho iniziato a studiarlo e mi ha preso tanto che ho abbandonato python (peccato).

Ciao.

intanto grazie a tutti per le numerose soluzioni trovate. Inutile dire che ho imparato un'altro 'spizzico' a riguardo. Mi rendo conto di essere parecchio 'out' . Un tempo ci sarei arrivato con piu' facilita', adesso e' come se dovessi reimparare la bicicletta! :slight_smile: evvabbe... tanto non mi corre dietro nessuno .

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