Grazie mille Guglielmo!
La proverò sicuramente. Ora faccio ancora uno o due giorni con la "vecchia" versione per essere certo che non vi siano anomalie, poi testerò la "tua" dove potrò verificarne il funzionamento e calcolare il tempo ciclo in modo da compararlo con le altre librerie.
Ribadisco che la mai non è una lamentela nei confronti di chi scrive e condivide le librerie!
La "DHTnew" sarà testata con lo stesso identico hardware e lo stesso sketch (ovviamente cambiando se serve le istruzioni e comandi relativi alla gestione del sensore DHT).
Io la butto giù così, se l'unica cosa per cui ti serve la velocità é la lettura di impulsi digitali allora potrebbe essere possibile usare per essa un interrupt. Questo consente di usare anche la libreria lenta, a patto che essa tenga attivi gli interrupts.
Silente:
Io la butto giù così, se l'unica cosa per cui ti serve la velocità é la lettura di impulsi digitali allora potrebbe essere possibile usare per essa un interrupt. Questo consente di usare anche la libreria lenta, a patto che essa tenga attivi gli interrupts.
Si, si, assolutamente! Concordo con te. Volevo solo tenermi la cartuccia dell'interrupt per quando (e se) aggiungerò un anemometro, allora si che l'interrupt serve.
Adesso accendo l'oscilloscopio e leggo la durata dell'impulso che attualmente sto già leggendo
Penso che la questione sia che ormai siamo tutti un po' curiosi di capire se effettivamente c'è un problema nella libreria e magari riuscire a capire esattamente dove
Può essere che il sensore dia sempre quel tipo di errore e che a seconda della libreria usata questo problema emerga oppure no.
khriss75:
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
Ok, quella è una, la 1.2.3 di Adafruit.
L'altra che hai usato, versione 1.3.2, qual è? Se è quella, è sempre di Adafruit?
Si, sempre libreria Adafruit.
la 1.2.3 non necessita della libreria aggiuntiva "adafruit sensors", la 1.3.2 invece necessita della libreria aggiuntiva (che ovviamente ho installato).
Non c'entra nulla con il discorso librerie, ma ho misurato la durata dell'impulso del mio sensore, solo il tempo della parte che va a gnd visto che uso il pin in pull_up: durata tra 87 e 91 ms.
Per intercettare quindi l'impulso il mio sketch deve durare meno di 87ms... Ovviamente in alternativa devo passare all'utilizzo dell'interrupt.
Questa mattina ho verificato se c'erano spike nelle letture sempre con libreria "vecchia" (1.2.3): nessuna anomalia.
Ora testo la libreria che mi ha fornito gpb01
Riporto solo i dati di compilazione.
Lbreria Adafruit DHT 1.3.2 tempo ciclo di circa 6ms ma con spike:
Lo sketch usa 43464 byte (17%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 3169 byte (38%) di memoria dinamica, lasciando altri 5023 byte liberi per le variabili locali. Il massimo è 8192 byte.
Lbreria NEW_DHT (gpb01):
Lo sketch usa 43322 byte (17%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 3168 byte (38%) di memoria dinamica, lasciando altri 5024 byte liberi per le variabili locali. Il massimo è 8192 byte.
Caricato ma mi restituisce
Temperatura Esterna: nan
Umidita Esterna: nan
Ho poi cambiato arduino ed ho caricato l'esempio base della libreria (NEW_DHT) ma nulla, nan.
EDIT:
Ho caricato anche lo sketch Advacend e restituisce questo errore pur avendo inserito un delay di 3 secondi:
Figurati Guglielmo, grazie a te per l'interessamento! Lo apprezzo davvero. Io ho solo da imparare da tutti voi!
Ricapitolando, ho caricato questo sketch base:
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
unsigned long start;
unsigned long fine;
unsigned long durata;
void setup() {
Serial.begin(9600);
Serial.println(F("DHTxx test!"));
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(5000);
start = millis();
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
//float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Fahrenheit (the default)
// float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
// float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(F("°C "));
//Serial.print(f);
//Serial.print(F("°F Heat index: "));
//Serial.print(hic);
//Serial.print(F("°C "));
//Serial.print(hif);
//Serial.println(F("°F"));
fine = millis();
durata = fine - start;
Serial.print(F("Durata loop "));
Serial.println(durata);
}
Faccio solo misura di temperatura e umidità.
Potete testarlo anche voi con le varie librerie e verificare il tempo di loop (indicativo).
Con la 1.2.3 loop da 272ms
Con la 1.3.2 loop da 5ms
Ma ora ho visto che è uscita la versione 1.3.3
Con libreria 1.3.3 loop da 5ms
Ora compilo lo sketch con libreria 1.3.3 sul mio arduino e lascio andare per vedere se ci sono altri spike.
EDIT: promemoria---da oggi 15/02 ora 11.50 circa gira lo sketch con libreria 1.3.3. Vedo se ci sono spike.
a beh, è quasi una odissea ma vi tengo aggiornati, magari può interessare a qualcuno...
La versione 1.3.3 mi restituisce nan dalla scheda arduino dove ho collegato il sensore esterno.
Come detto sono meno di 5 metri di cavo.
La versione 1.3.3 funziona su breadboard con cavetti da 20cm circa.
Funziona fino con cavi entro i due metri e poi restituisce nan (almeno per le mie prove).
Caricando la 1.3.2 funziona ma con spike, caricando la 1.2.3 funziona senza spike ma con 270ms di loop.
Credo proprio che stiano lavorando sulla libreria perché effettivamente qualcosa non va. Mi aspetto la 1.3.4 a breve
Si, ho visto di quei 55us ed ho proprio pensato a quello.
La mia ignoranza però non mi permette di capire come modificare al meglio la cosa.
Basta cambiare il valore e banalmente salvare il file?
Valori più alti secondo te significa unità o anche decine?
L'unica è andare per tentativi ... io proverei ad incrementare di 25μsec al colpo ... 75, 100, 125, ... e vedere il comportamento.
Basta che metti il valore nella chiamata alla begin() nel tuo programma o, addirittura, più pulito, in una #define in testa la programma ... così è più facile da vedere e modificare
Forse ci siamo (al netto di verificare se ci saranno degli spike).
Per abitudine rifaccio solitamente le prove partendo dalla soluzione che mi sat dando problemi.
Faccio il mio bel #define PU_DELAY 55 e poi metto dht.begin(PU_DELAY);
Beh, così sta funzionando! Anche con i 55us!
L'unica cosa che forse e dico forse avevo omesso era il dht.begin();. Dico questo perché per le prove ho creato un sacco di programmi di prova ed in uno non mi sono trovato il dht.begin() (ovviamente nel void setup).
Provo però a compilare con libreria 1.2.3 e funziona (senza dht.begin() ).
Ora sta girando con il define a 55. Vediamo
Guglielmo, come è possibile che nella 1.2.3 e nella 1.3.2 funzionino anche senza il dht.begin()?
Veniva fatto poco o nulla ... veniva attivata la resistenza di pull-up sull'ingresso (ma tanto tutti mettono la resistenza esterna dul pin dati del DHT) e inizializzata la variabile per il tempo minimo tra un'interrogazione e la successiva ... tutte cose che, anche se non fatte ... non cambiavano molto le cose :
khriss75:
La versione 1.3.3 mi restituisce nan dalla scheda arduino dove ho collegato il sensore esterno.
Hm però mi incuriosisce questa cosa... Il "NaN" significa generalmente "Not A Number" quindi "qualcosa" cerca di rappresentare una qualche stringa come un numero ma non è possibile. Ma chi/cosa esattamente ti dà "NaN"? Hai il codice che usi per leggere quel dato?
docdoc:
Hm però mi incuriosisce questa cosa... Il "NaN" significa generalmente "Not A Number" quindi "qualcosa" cerca di rappresentare una qualche stringa come un numero ma non è possibile.
No, in reltà è la libreria che inizializza il float a NAN, così se ci sono problemi ... ha già pronto il valore di ritorno ...