Curiosità sui sensori...

... ma perché cambiando il tempo tra una lettura e l'altra mi cambiano anche i valori dei sensori?

Ho collegato un DHT11, se nel loop non metto un delay minimo tra una lettura e un'altra i valori sono molto differenti tra loro.

Ad esempio, se metto un delay di 1s, ottengo valori credibili: 60% umidità e 24° Senza delay l'umidità varia di un range tra il 36% fino al 48% e la temperatura varia di anche 3/4°.

Stessa roba se gli attacco il sensore di temperatura analogico che era nello starter kit.

Quale sketch? Ciao Uwe

Uno qualsiasi, anche uno che creo io...

Questo è con il sensore di temperatura incluso nello starter, attaccato alla 5v su arduino mega 2560...

void loop()
{
int sensorVal = analogRead(A0);
float voltage = (sensorVal/1024.0)*5.0;
float temperature = (voltage - .5) * 100;
Serial.println(temperature);
}

Se metto non metto il delay mi passa dei valori troppo differenti... 3/4° nel giro di un secondo sono troppi.

C è scritto in tutte le descrizioni del prodotto in questione che bisogna aspettare almeno 2 secondi per rinterrogare il sensore. Aggiungi la resistenza di pull up del data verso vcc e invece di usare la funzione delay usa la tecnica dei millis() (vedi l esempio blink without delay) buona fortuna . Luca

terrornoize:
collegato un DHT11, se nel loop non metto un delay minimo tra una lettura e un’altra i valori sono molto differenti tra loro.

I sensori DHTxx sono molto lenti, tocca aspettare almeno due secondi tra le letture altrimenti ottieni valori errati, del resto temperatura e umidità ambientale non cambiano velocemente e non ha senso acquisire questi valori con un rateo minore di una lettura ogni 20-30 secondi.

Grazie a tutti, ho ancora molto da imparare... :D

Una domanda veloce senza inquinare il forum...

Ma se setto i millis come unsigned long e si supera la lunghezza massima della variabile (4 miliardi e rotti se non erro) ... che succede? Si resettano i millis giusto?

Con questo codice...

unsigned long currentMillis = millis();
if ((currentMillis - previousMillis_dht) > 30000)) { 
    // azione da compiere ogni 30 secondi
    previousMillis_dht = currentMillis; // setto i previous come i millis
      }

Mettiamo il caso che dopo tot giorni i millis vengano resettati e io ho storicizzato i currentMillis nei previousMillis quasi al massimo della loro grandezza massima prima di resettarsi, con la mia formula non rientrerò più nella condizione che ho creato, perché ho il previousMillis sempre a 4 miliardi e non sarà mai più grande dei 30 secondi per compiere quella determinata azione... o sbaglio il ragionamento?

Con il controllo impostato come hai fatto tu, nell'esempio qui sopra, non devi temere per il reset del contatore di millis(). Il perché lo puoi leggere qui

leo72:
Con il controllo impostato come hai fatto tu, nell’esempio qui sopra, non devi temere per il reset del contatore di millis().
Il perché lo puoi leggere qui

Grandissimo Leo, quindi ho adottato involontariamente la soluzione n°2… :smiley:
Grazie, posso andare a letto tranquillo!