[RISOLTO] Invio dato solo se il valore è > o < rispetto al precedente (spike)

Con un sensore DHT22 rilevo umidità e temperatura esterna, i valori li memorizzo poi su un database per graficare il tutto.
Per non popolare troppo il database acquisisco misure ogni 3 minuti ed invio il dato solo se il nuovo valore è maggiore/uguale o minore/uguale di 0.2°C per temperatura e 0.3% per umidità.

Questo è il codice:

  ////sensore_temperatura esterno DHT22---------------------
  unsigned long now_DHT22 = millis();
  if (now_DHT22 - lastTempRequest_DHT22 > 180000) {
    lastTempRequest_DHT22 = now_DHT22;
    temperatura_esterna = dht.readTemperature();
    umidita_esterna = dht.readHumidity();


    if ((temperatura_esterna > -40) && (temperatura_esterna < 50) && (abs(temperatura_esterna - temperatura_esterna_precedente) >= 0.2)) {
      temperatura_esterna_precedente = temperatura_esterna;
      Serial.print(F("Temperatura Esterna: "));
      Serial.println(temperatura_esterna);
    }
    if ((umidita_esterna > 0) && (umidita_esterna < 101) && (abs(umidita_esterna - umidita_esterna_precedente) >= 3)) {
      umidita_esterna_precedente = umidita_esterna;
      Serial.print(F("Umidita Esterna: "));
      Serial.println(umidita_esterna);
    }
  }
  ////sensore_temperatura esterno DHT22---------------------

Purtroppo a volte però mi ritrovo nel grafico dei valori errati che sono esattamente la metà tra il valore precedente e quello successivo, tale valore è anche invertito di segno.
Spiego con un valore appena rilevato:

ore 15:34:26" (ultimo valore corretto): 11.7°C
dopo le 15.34 non ci sono misure, presumo perché la temperatura sia rimasta nei +/-0.2 gradi
ore 16:13:40" (dato errato): -5.8°C
ore 16:16:36" (dato corretto): 11.5°C

Il problema è random, due giorni fa nessun errore, ieri pomeriggio alle ore 15 circa si è verificato l'errore descritto sopra, tre giorni fa avrò avuto 5 o 6 di questi errori.

C'è secondo voi un errore nel codice oppure devo imputare gli errori al DHT22? Mi pare però strano, perché come detto, le misure errate sono appunto la metà del valore precedente o successivo a volte anche con segno cambiato.

Grazie!

Mah nel codice non vedo nulla che possa portare ad avere quelle letture anomale, il valore che mostri è esattamente quello restituito da readTemperature() per cui punterei a qualcosa lato hardware come cavi e connessioni (masse comprese) o, come sospetti, al DHT22.
L'umidità invece è sempre corretta?

Hai messo tra Vdd e GND un condensatore da 100nF?
Ho letto da qualche parte che lo consigliano.
Magari aiuta a tenere l'alimentazione più stabile.
Sparo un po' a caso, ma potrebbe essere che un'oscillazione sull'alimentazione spenga e riaccenda il sensore e tu lo interroghi nel secondo di instabilità dopo la riaccensione.
E' un'ipotesi, per quanto remota...

E' sempre, in valore assoluto, a metà tra di due valori pre e post buoni?
Oppure è casuale?

EDIT:
E la resistenza di pull-up sul pin dei dati?

Anche io d'accordo con chi dice che è un problema hardware, quindi occhio alla resistenza di pull-up e attenzione che la sonda non sia troppo lontana perché il collegamento a tre fili è garantito fino a 20 metri. Se lo vuoi più lontano devi fare delle modifiche.

Poi, che Arduino usi?

Dopo un pomeriggio/sera abbastanza incasinato eccomi qua a rispondere.

Il fatto che il codice sembra essere corretto mi rincuora, anche l'umidità soffre d questo problema. Mi ritrovo con picchi (verso il basso) inaspettati e valori totalmente non in linea con quelli precedenti o successivi.
A livello hardware la cosa era montata da più di un mese senza rilevare alcun problema.
Cosa ho cambiato? Sono passato da un nodemcu ad un arduino mega e qualche giorno fa ho installato l'ultima libreria disponibile per i sensori DHT.
Ora voglio verificare sullo storico dati e confrontare con i cambi effettuati. Ricapitolando:
-nodemcu e libreria 1.2.3 nessun problema (nessuna variazione per sketch e connessione hardware)
-arduino mega e libreria 1.2.3 da verificare (nessuna variazione per sketch e connessione hardware)
-arduino mega e ultima libreria (1.3.2 se non erro) problemi (nessuna variazione per sketch e connessione hardware)

Le cause sembrano ridursi a due fattori: il passaggio da nodemcu ad arduino mega oppure il cambio libreria.
Nessun condensatore tra Vcc e GND, resistore da 10K tra Vcc e DATA. Anche la lunghezza e posizionamento del cavo è sempre la stessa, esagerando saranno massimo 5 metri.

Occhio, che magari il problema c'è sempre stato ma è diventato evidente solo dopo le variazioni.

Sono più per il problema della libreria DHT22

maubarzi:
Occhio, che magari il problema c'è sempre stato ma è diventato evidente solo dopo le variazioni.

No, è da un bel po di tempo che sta funzionando il tutto (almeno 3 o 4 mesi credo) e non ho mai avuto anomalie (il tutto viene poi messo su grafico e guardando i "vecchi" dati non ci sono questi spike (in negativo)

steve-cr:
Sono più per il problema della libreria DHT22

Concordo. Ho già rimesso la versione 1.2.3 al posto della 1.3.2.
Ero passato all'ultima versione perché la 1.2.3 mi bloccava il loop ciclo per circa 270ms ad ogni lettura del sensore.
Con l'ultima versione invece sono sui 6ms però sembra soffrire di questo problema.
Lascio girare il tutto per questa notte e domani con libreria 1.2.3 e vedo. Per ora (da questa mattina) nessun errore.

ammmapperccheee' tu sei quello delle librerie che 270 ms erano troppi, adesso ricordo
che "basta usare librerie aggiornate".......
ma se fai una lettura ogni 3 minuti, 270 ms ti mandavoano in crisi?, per una temperatura? che ci devi fare, un controllo della temperatura del nocciolo di Three Miles Island?

Standardoil:
ammmapperccheee' tu sei quello delle librerie che 270 ms erano troppi, adesso ricordo
che "basta usare librerie aggiornate".......
ma se fai una lettura ogni 3 minuti, 270 ms ti mandavoano in crisi?, per una temperatura? che ci devi fare, un controllo della temperatura del nocciolo di Three Miles Island?

Esatto! Sono proprio io!
Poi vado nell'altro post e scrivo che le ultime librerie non sempre sono il top :slight_smile:
Ho bisogno di reattività perché tengo sotto controllo un bonsai che produce banconote. Se non stabilizzo la temperatura entro in 270ms, anziché produrre banconote da 100 euro me ne produce solo quelle da 10 e non va bene :smiley: :smiley: :smiley:

Scherzi a parte, oltre al controllo temperatura e umidità faccio un po di altre cose, ad esempio devo contare degli impulsi per calcolare l'assorbimento. Non ho ancora misurato la lunghezza dell'impulso ma capisci che se è inferiore ai 270ms rischio di perderlo. Vorrei anche aggiungere la misura dell'intensità pioggia (sensore a bascula) ed anche in questo caso potrei perdere degli impulsi... insomma, mi pacerebbe che arduino girasse "snello" :slight_smile:

khriss75:
Poi vado nell'altro post e scrivo che le ultime librerie non sempre sono il top :slight_smile:

... dubito fortemente che la casua sia quella ... ho idea che nella nuova libreria hanno modificato qualche cosa ed occorre adattare i programmi. Prova a studiarti bene gli esempi che l'accompagnano e verificare perché a me quella libreria NON ha mai dato problemi ... ::slight_smile:

Guglielmo

Io ancora non ho mai fatto un log delle misure, per cui non so dire se mi sia mai capitato.
Ho installata la 1.3.0, per cui le ultime prove che ho fatto le ho fatte con questa versione però sempre per letture su display, per cui difficile notare una lettura scazzata quà e là se non stai sempre li a guardare il display.

Hai potuto verificare se rimettendo la 1.2.3 funziona correttamente?

Ormai sono curioso, e poi sarebbe un peccato scartare una libreria che porta a tempi normali senza capirne esattamente il motivo, anche perchè la 1.3.x è accreditata per far stampare ai bonsai banconote fino a 500 euro :wink:

Chiaro, ha una sua logica

gpb01:
... dubito fortemente che la casua sia quella ... ho idea che nella nuova libreria hanno modificato qualche cosa ed occorre adattare i programmi. Prova a studiarti bene gli esempi che l'accompagnano e verificare perché a me quella libreria NON ha mai dato problemi ... ::slight_smile:

Guglielmo

Ho rimesso la "vecchia" versione 1.2.3 e da ieri non ho avuto alcuno spike (negativo). L'ultimo era alle ore 9

Ovviamente voglio verificare ancora per un po. Ho poi controllato gli esempi della libreria (rispettive versioni):
la libreria 1.2.3 contiene solo un file di esempio, la più recente ne contiene due. Un esempio è identico alla libreria vecchia, l'altro fa riferimento agli "Unified Sensor Drivers".
Le istruzioni per i DHT sono veramente poche:

#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float h = dht.readHumidity();
float t = dht.readTemperature();

e sono le stesse per entrambe le versioni. Per ora sarei propenso ad "accusare" la libreria, ripeto, da ieri con quella "vecchia" non ho avuto alcun errore.

khriss75:
... Le istruzioni per i DHT sono veramente poche ...

NON devi guardare quelle che usi TU, devi guardare DENTRO la libreria come sono implementate e capire le differenze che possono portare, saltuariamente, a false letture (tra l'altro, facilmente scartabili) ... ::slight_smile:

Guglielmo

gpb01:
NON devi guardare quelle che usi TU, devi guardare DENTRO la libreria come sono implementate e capire le differenze che possono portare, saltuariamente, a false letture (tra l'altro, facilmente scartabili) ... ::slight_smile:

Guglielmo

Perdonami Guglielmo, ma se io installo una libreria, carico lo sketch di esempio e mi genera quegli errori qualcosa non quadra.
Poi vado su gthumb dove c'è la libreria e ricontrollo per eventuali variazioni che non trovo...
Può benissimo essere un mio problema (hardware...) ma se con la "vecchia" non ho errori e con la nuova versione ne ho... a livello di documentazione non ho trovato nulla che mi indichi altre vie.
Poi il fatto di implementare qualcosa per scartare tali anomalie lo so anch'io che è possibile farlo, ma il problema di fondo rimane.

Se IO devo guardare nella libreria (ammesso che sia in grado di farlo) per trovare eventuali funzioni che portano a queste anomalie, beh, significa che ci possono essere problemi di libreria...

La 1.2.3 blocca il loop per circa 250ms ma non genera errori
La 1.3.2 per la lettura richiede circa 6ms ma a megenera questi errori.

khriss75:
Perdonami Guglielmo, ma se io installo una libreria, carico lo sketch di esempio e mi genera quegli errori qualcosa non quadra.
Se IO devo guardare nella libreria (ammesso che sia in grado di farlo) per trovare eventuali funzioni che portano a queste anomalie, beh, significa che ci possono essere problemi di libreria...

Beh dato che le librerie, tranne quelle di sistema, sono in genere scritte da appassionati e non sono prodotti commerciali, diciamo che questa cosa la dovresti sempre mettere in conto come eventualità... :wink:

La 1.2.3 blocca il loop per circa 250ms ma non genera errori
La 1.3.2 per la lettura richiede circa 6ms ma a megenera questi errori.

Hai provato farti un diff tra le due versioni? Al limite se non l'hai mai fatto dammi i link github delle due e te lo faccio io... :wink:

docdoc:
Beh dato che le librerie, tranne quelle di sistema, sono in genere scritte da appassionati e non sono prodotti commerciali, diciamo che questa cosa la dovresti sempre mettere in conto come eventualità... :wink:

Assolutamente d'accordo con te! Ci mancherebbe! Sia chiaro, non sto contestando il funzionamento di tale libreria, sto solo esponendo un possibile problema che ribadisco, magari è semplicemente mio!
Il fatto però che sia totalmente casuale (così pare) e che può venire identificato solo se si fa un log delle misure potrebbe essere un motivo per cui non sia stato subito identificato.
Ripeto, non me la sto prendendo affatto con chi ha scritto la libreria! Ci mancherebbe, anzi, merita un infinito grazie per averla scritta e condivisa!!!

docdoc:
Hai provato farti un diff tra le due versioni? Al limite se non l'hai mai fatto dammi i link github delle due e te lo faccio io... :wink:

Non ho fatto una differenziazione tra le due versioni, le ho scaricate direttamente con la "Gestione Librerie".
in ogni caso, il link è questo:
Libreria_DHT

Ti va di fare una prova e dirmi come va?

Ti allego una libreria DHT ... "alternativa" ... fatta da un'altro sviluppatore ... puoi provare a vedere come ti funziona? Nella cartella degli esempi ci sono un paio di esempi di come usarla :wink:

Guglielmo

DHTNew.zip (7.64 KB)