Sensore di temperatura e umidità DHT11
Il sensore misura la temperatura con una precisione di ± 2 gradi centigradi e l'umidità relativa con una precisione di ± 5 %. Entrambi i valori misurati vengono trasmessi al microcontrollore in un pacchetto di dati tramite un protocollo a filo singolo.
Sia il sensore Arduino che il sensore DHT11 hanno un'uscita da collettore aperta che può essere utilizzata anche come input. Il Pullup Resist integrato nell'Arduino è condiviso. Per avviare la trasmissione, l'Arduino commuta l'uscita per almeno 18 ms su LOW e quindi passa il pin all'ingresso. Quando il sensore rileva questo segnale LOW sul pin dei dati, inizia a trasmettere i dati. Cambia il pin dei dati come output e lo imposta su LOW per 80 e poi di nuovo per gli anni '80 su HIGH. Questo è seguito da 40 bit di dati. Per distinguere i bit di dati, per uno 0 bit l'uscita è 50 s su LOW e 28 s su HIGH, mentre per un 1 bit è 50 s su LOW e 70 s su HIGH. I 40 bit di dati sono divisi in 5 byte. Umidità alto byte, umidità basso byte, temperatura di alto byte, temperatura basso byte e checksum.
Ma non preoccuparti di controllare la porta Arduino non devi implementare te stesso, c'è già una libreria già pronta che puoi integrare nel tuo programma.
Ci sono due librerie per l'Arduino e una per eSPx. Ho scelto SimpleDHT.
Circuito e programma di test:
Colleghiamo il pin di dati del DHT11 con il pin 2 sull'Arduino. Tuttavia, qualsiasi altro pin digitale può essere utilizzato anche.
#include "simpledht.h>"
dati byte const - 2; Pin di dati del DHT11
SimpleDHT11 dht11;
void setup()
l'inizio dell'interfaccia seriale per produrre valori misurati
Serial.begin(115200);
}
void loop()
Serial.println (con il nome del file seriale)
Serial.println("Misure da DHT11");
lettura dei valori
temperatura in byte: 0;
byte umido : 0;
controlliamo se si è verificato un errore
int err - SimpleDHTErrSuccess;
errr - dht11.read(dataPin, &temperatura, &bagnato, NULL);
if (err !
Serial.print("Errore durante la lettura da DHT11. Errore : ");
Serial.println(err);
- altro
Serial.print((int)temperatura);
Serial.println(" :C ");
Serial.print((int)bagnato);
Serial.println(" %H ");
}
attendere 1,5 s Il DHT11 fare 1 misura / s
ritardo(1500);
}
Per i test, ad esempio, è possibile toccare il sensore, che dovrebbe aumentare la temperatura e soprattutto l'umidità.
Sensore di temperatura DS18B20
Questo sensore di temperatura è anche un sensore di temperatura intelligente che trasmette i valori misurati tramite un protocollo a filo singolo in C. A differenza del DHT 11, il DS18B20 misura solo la temperatura ma con una maggiore precisione. La precisione è ± 0,5 c in un range di temperatura compreso tra -10 e 85 gradi centigradi. Il tempo di misurazione è 0,75s con risoluzione a 12 bit.
A differenza del DTH11, il protocollo a filo singolo è molto più flessibile. Ogni sensore ha un numero di serie univoco, in modo che qualsiasi numero di sensori possa essere azionato sullo stesso bus a filo singolo. Ci sono anche altri sensori che utilizzano lo stesso protocollo, che possono quindi essere tutti controllati da un bus.
Il microcontrollore può utilizzare un comando di ricerca per determinare quali sensori sono collegati al bus dopo l'inizializzazione. Dha unico numero di serie Contiene fornisce inoltre informazioni il tipo di sensore per identificarlo. Per leggere i valori, il numero di serie deve sempre essere inviato per primo, in modo che solo uno dei sensori occupi il bus.
E (in questo modoun'altra caratteristica speciale del DS18B20 è la possibilità di ottenere l'alimentazione necessaria internamente dalla linea dati (modalità parassitaria), in modo che sia necessario solo un cablaggio a due fili.
Naturalmente, le librerie Arduino sono disponibili anche per il DS18B20, uno per il protocollo a filo singolo e un altro per il sensore di temperatura.
Circuito e programma di test
Per il circuito utilizziamo inoltre un display a sette segmenti Display a 4 cifre per visualizzare la temperatura.
Per il display abbiamo anche bisogno di una libreria:
Programma:
#include "dallastemperature.h"
#include tm1637display.h>
Perni per sensore di temperatura
bus byte const - 2;
Pin per la visualizzazione
orologio byte const - 8;
dati byte const - 9;
Istanze per le librerie
OneWire oneWire(bus);
Sensori DallasTemperature (&oneWire);
Array per memorizzare gli indirizzi dei dispositivi
Indirizzi DeviceAddress;
TM1637Visualizzazione del display (orologio, dati);
variabile globale per i caratteri meno sul display
const uint8_t meno[] - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const uint8_t più[] - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
void setup()
Avviare l'interfaccia seriale
Serial.begin(115200);
Noi determiniamo l'anzah dei sensori sul bus a filo singolo
sensors.begin();
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println("Sensori trovati.");
Ora controlliamo se il bus è in modalità parassitaria
Serial.print("Modalità parassitaria è ");
if (sensors.isParasitePowerMode())
Serial.println("ON");
- altro
Serial.println("OFF");
}
Ora controlliamo se uno dei sensori sul bus è un sensore di temperatura
if (!sensors.getAddress(addresses,0)) Serial.println("No temperature sensor present!");
Visualizzare gli indirizzi
Serial.print("Indirizzo: ");
printAddress(indirizzi);
Serial.println();
Ora abbiamo impostato la risoluzione desiderata (9, 10, 11 o 12 bit)
sensors.setResolution(indirizzi, 9);
Per il controllo, leggiamo di nuovo il valore
Serial.print("Risoluzione - ");
Serial.print(sensors.getResolution(indirizzi), DEC);
Serial.println();
Ora accendiamo il display
display.setBrightness(0x0f);
}
funzione per la stampa della temperatura di un sensore
void printTemperature(DeviceAddress DeviceAddress)
{
float tempC - sensors.getTempC(indirizzi);
Serial.print("Temperatura C: ");
Serial.print(tempC);
Serial.print(" Temperatura F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); Converte il valore in Fahrenheit
per il display abbiamo impostato il segno di destra
ed emettere il valore di tre cifre dalla posizione 1
if (tempC<0)
display.setSegments (meno,1,0);
per le temperature negative dobbiamo invertire il valore
display.showNumberDec(round(tempC-10),true,3,1);
- altro
display.setSegments (più,1,0);
display.showNumberDec(round(tempC-10),true,3,1);
}
}
void loop()
Serial.print("Temperatura di lettura ...");
sensors.requestTemperatures(); Comanda to read the temperatures
Serial.println("Fatto!");
Ora output dei dati
printTemperature(indirizzi);
ritardo(1000); stiamo aspettando 1 s
}
funzione per stampare un indirizzo del sensore
void printAddress (indirizzi DeviceAddress)
{
per (uint8_t i - 0; i < 8; i
{
if (indirizzi[i] < 16) Serial.print("0");
Serial.print(addresses[i], HEX);
}
}