Salve,
ho provato un progetto gia prodotto e messo su internet da qualcun'altro.
Si tratta di un semplice sketch con print su seriale dei valori umidità e temp del sensure appunto dht11.
Ho messo anche la resisteza da 10k come viene descritto nel progetto ma il problema è che mi da dei valori veramente altissimi, del tipo 680 gradi centigradi o più di mille di umidità. Ho provato e riprovato ma nulla. qualcuno mi sa indicare un link per trovare librerie adatte e sketch per un semplice progetto?
ciao
anche io avevo lo stesso problema
prova con questo sketch
Componenti necessari per il DHT11 arduino
Per riprodurre questo progetto ti occorre:
sonda DHT11 dfrobot
cavetto a 3 poli di connessione tra sonda e arduino
arduino uno ( in alternativa Leonardo,Mega,Mini,Nano,ecc… )
libreria dht11.h scaricabile qui
mauro alfieri
Collegamento della sonda ad arduino
le connessioni della sonda ad arduino sono semplicissime in quanto la sonda presenta 3 soli cavetti:
un cavo positivo ( +5v ) che devi collegare al +5v di arduino
un cavo negativo ( Gnd ) che devi collegare al Gnd di arduino
un cavo output ( verde ) che puoi collegare ad uno dei pin digitali di arduino (in questo caso digital 4)
segui la figura seguente
DHT11 arduino diagram
riferita alla V2 della sonda DHT11 arduino, sul wiki del produttore puoi verificare che la V1 ha il cavo positivo e quello negativo invertiti.
Lo sketch di test della DHT11
il test del sensore puoi farlo utilizzando questo sketch di esempio:
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4
void setup(){
Serial.begin(9600);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
void loop(){
int chk;
Serial.print("DHT11, \t");
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk){
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAT DATA
Serial.print(DHT.humidity,1);
Serial.print(",\t");
Serial.println(DHT.temperature,1);
delay(1000);
}
grazie all’utilizzo della libreria dht11.h è molto semplice, ecco cosa accade linea per linea.
linea 01: includi la libreria dht11.h che avrai scaricato dal link riportato sopra;
linea 02: definisci una istana dell’oggetto dht11.h che chiami DHT;
linea 03: imposta la costante DHT11_PIN valorizzandola con il pin a cui hai collegato il cavo output del sensore;
linee 06-11: nella funzione setup() imposta il canale di comunicazione seriale con il Serial Monitor a 9600 baud e scrivi, in fase di startup dello sketch, la versione della libreria e l’intestazione in merito a Temperatura ( misurata in gradi Celsius ) ed umidità ( misurata in % );
linea 15: imposta una variabile di tipo integer (chk) in cui memorizzerai i valori restituiti dall’interrogazione della sonda;
linea 16: scrivi sul monitor seriale “DHT11, “;
linea 17: leggi dalla sonda lo stato della stessa e memorizzane il valore nella variabile chk, nota che il metodo read dell’istanza DHT accetta come parametro il pin a cui la sonda è collegata;
linee 18-31: con lo switch verifichi il valore di check restituito dalla sonda prima di chiederle informazioni su umidità e temperatura;
linee 33-35: leggi dalla sonda i valori di umidità e temperatura utilizzando rispettivamente i metodi humidity e temperature dell’istanza DHT e scrivi questi valori sul monitor seriale;
linea 37: attendi un secondo prima di ripetere il ciclo di interrogazioni della sonda.
Prova la libreria Adafruit DHT-sensor-library-master.
Se da errore in compilazione (a me lo dava su Digispark, Attiny85), basta modificare in DHT.cpp le istruzioni pinMode(_pin, INPUT_PULLUP); in pinMode(_pin, INPUT); sono due.
A me funziona col sensore AM2320 in modalità one wire con pull-up da 10kOhm. Si tratta di un sensore della stessa famiglia, più simile al DHT22, ma comunque compatibile. Peraltro più preciso del DHT11.
Attenzione che nelle definizioni devi dichiarare il tipo di sensore, che per default non è l'11, ma mi sembra il 22.
Salve ho parzialmente risolto, o meglio, l temperatura e umidità ora la segna perfettamente.. Adesso però vorrei far scattare un relay quando la temperatura è maggiore di 10 gradi. io ho elaborato uno sketch cosi come posto qui ma mi dite cosa sbaglio per favore? Perchè il relay non da segno di vita. Sono un neofita ma imparo e mi piace imparar alla svelta. Vi ringrazio per le risposte cosi complete e fulminee.
Questo è lo sketch. Ripeto la temperatura e umidità ora sono perfette.
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4
void setup(){
Serial.begin(9600);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
void loop(){
int chk;
Serial.print("DHT11, \t");
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk){
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAT DATA
Serial.print(DHT.humidity,1);
Serial.print(",\t");
Serial.println(DHT.temperature,1);
if (DHT.temperature >=10); CREDO CHE L'ERRORE SIA QUI MA NON CAPISCO COSA SBAGLIO.
digitalWrite(2,HIGH);
delay(1000);
}
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4
#define PIN 2
void setup(){
Serial.begin(9600);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
void loop(){
int chk;
Serial.print("DHT11, \t");
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk){
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAT DATA
Serial.print(DHT.humidity,1);
Serial.print(",\t");
Serial.println(DHT.temperature,1);
if (DHT.temperature,1 >10); //credo che errore sia in questo punto !
digitalWrite(PIN,HIGH);
delay(1000);
}
L'errore è che devi usare le parentesi graffe.
Da:
if (DHT.temperature,1 >10); //credo che errore sia in questo punto !
digitalWrite(PIN,HIGH);
A:
if (DHT.temperature,1 >10) {digitalWrite(PIN,HIGH);}
A parte che fai due letture consecutive della temperatura e sarebbe meglio assegnare prima il valore a una variabile e magari cancellare tutte le parti ridondanti, per migliorare la leggibilità.
qualcuno mi può postare lo sketch corretto per favore? ne sarei veramente grato
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4
#define PIN 2
void setup(){
Serial.begin(9600);
Serial.println("DHT TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
void loop(){
int chk;
Serial.print("DHT11, \t");
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk){
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAT DATA
Serial.print(DHT.humidity,1);
Serial.print(",\t");
Serial.println(DHT.temperature,1);
if (DHT.temperature,1 >10) //credo che errore sia in questo punto !
{digitalWrite(PIN,HIGH);}
delay(1000);
}
Niente da fare, nemmeno cosi
Scusa, il relè come lo attivi? Con un transistor? Se il transistor ha una resistenza sulla base, prova a collegare il terminale che andrebbe su Arduino a Vcc e vedi se senti che il relè attacca. Se lo fa, il circuito è sano, altrimenti hai un guasto sul circuito e non c'è processore che possa attivarlo. Dopodiché puoi provare a mettere un LED con resistenza da 470Ohm, verso GND, al posto del filo che pilota il relè, per vedere se il processore manda il pin alto e accende il LED. Se ambedue le prove danno esito positivo, allora è un problema del programma. Ma è un programma così semplice che è difficile sbagliarlo...
A livello programma c'è solo quel metodo DHT.temperature,1 che non mi quadra. Penso andrebbe tra parentesi tonde, essendoci una virgola, che indica il passaggio di un parametro. Ma non conosco quella libreria e non so come è scritta.
e-person:
if (DHT.temperature,1 >10); //credo che errore sia in questo punto !
digitalWrite(PIN,HIGH);
Gli errori qui sono molti, non segnalato dal compilatore è il ; dopo la tonda, è ammesso.
L'istruzione corretta è:
if( test )
digitalWrite(PIN,HIGH);
oppure con le graffe
if( test )
{ digitalWrite(PIN,HIGH);
}
ma ... no punti e virgola !!
Questo ( DHT.temperature,1 >10) non ha senso !!
Nella Serial.print il ,1 indica come secondo parametro che vuoi 1 cifra dopo la virgola
Serial.println(DHT.temperature,1);
Questo ",1" qui non serve:
if ( DHT.temperature >10)