Temperatuur en vochtigheid DHT11 Sensor
, De Sensor meet de temperatuur met een nauwkeurigheid van ± 2°C en de relatieve luchtvochtigheid met een nauwkeurigheid van ± 5 %. Zowel voor de gemeten waarden kunnen worden verzonden in een packet-gegevens via een single-wire Protocol om de micro-controller.
Zowel de Arduino en de DHT11 Sensor hebben een Open-Collector uitgang kan ook worden gebruikt als input. De Arduino ingebouwde Pullup weerstand wordt gebruikt. Starten van de omschakelaars aan de Arduino de uitgang voor een minimum van 18 ms te LAAG en vervolgens schakelt u de Pin-code invoeren. Wanneer de Sensor detecteert dit LAGE Signaal bij de Data-Pin, begint de Overdracht van de gegevens. Hij schakelt de Gegevens Pin als output en stelt het voor 80µs naar LAAG en dan weer op voor 80 µs te HOOG. Vervolgens, 40 bits van de gegevens volgen. Om onderscheid te maken tussen de data bits 50 µs te LAAG en 28 µs voor een 0-Bit de output is van HOGE terwijl voor een 1-Bits 50 µs op LAGE en 70 µs te HOOG. De 40 databits zijn verdeeld over 5 Bytes. Vocht Hoge Byte, luchtvochtigheid, Lage Byte temperatuur Hoge Byte temperatuur Lage Byte en de checksum.
Maar geen angst, de controle van de Arduino Poorten die u niet nodig heeft voor de uitvoering van het zelf, een kant-en-klare bibliotheek, die u kunt opnemen in uw programma bestaat al.
Er zijn twee bibliotheken voor de Arduino en een voor de ESPx. Ik heb gekozen voor de SimpleDHT.
Schakeling en test programma:
We verbinden de Data Pin van de DHT11 naar Pin 2 van de Arduino. Maar het kan ook een andere Digitale Pin te worden gebruikt.
#include
const byte dataPin = 2; //data pin van de DHT11
SimpleDHT11 dht11;
void setup() {
//start de seriële interface voor de gemeten waarde-uitgang
aan op de Seriële.beginnen(115200);
}
void loop() {
Serial.println("=================================");
Serial.println("metingen van de DHT11");
//lees de waarden
byte temperatuur = 0;
byte luchtvochtigheid = 0;
//controleren we of er is een fout opgetreden
int err = SimpleDHTErrSuccess;
err = dht11.lees(dataPin, &temperatuur &vochtigheid, NULL);
if (err != SimpleDHTErrSuccess) {
Serial.print("kan niet lezen uit DHT11. Fout = ");
Serial.println(err);
} else {
Serial.print((int)temperatuur);
Serial.println(" °C ");
Serial.print((int)vochtigheid);
Serial.println(" %H ");
}
// wacht 1,5 s voor De DHT11 mach 1 meting / s
delay(1500);
}
Voor het Testen van u kan gewoon ademen, bijvoorbeeld, de Sensor, die moeten leiden tot de temperatuur en vooral de vochtigheid.
Temperatuur Sensor DS18B20
, Deze temperatuur Sensor is een intelligente temperatuursensor van de gemeten waarden via een single-wire Protocol in °C verzonden. In tegenstelling tot de DHT 11 van de DS18B20 is het meten van alleen de temperatuur, maar met een hogere nauwkeurigheid. De nauwkeurigheid van ± 0,5 °C in een temperatuur bereik van -10 tot +85 °C. de duur van De meting is 0,75 s met 12-Bit resolutie.
In tegenstelling tot de DTH11 de single-wire Protocol is veel flexibeler. Elke Sensor heeft een uniek serienummer, zodat een aantal Sensoren kunnen worden gebruikt op de ene draads Bus. Er zijn ook andere Sensoren die gebruik maken van hetzelfde Protocol worden geregeld via een Bus.
Een Search opdracht van de micro-controller na de initialisatie kan detecteren welke Sensoren zijn aangesloten op de Bus. Die uniek serienummer bevat Informatie over het type van sensor om hem te identificeren. Voor het uitlezen van de waarden moeten altijd worden verzonden eerste op de serienummer, zodat slechts één van de Sensoren die zijn toegewezen aan de Bus.
Eine een verder kenmerk van de DS18B20 is de mogelijkheid om het intern vereiste voeding van de gegevens lijn te winnen (parasitaire modus), zodat slechts een twee-aderige kabels nodig.
Natuurlijk, ook Arduino bibliotheken voor de DS18B20, en één voor de single-wire Protocol en één voor de temperatuur Sensor.
Circuit-en test-programma
Voor het circuit zullen we gebruiken bovendien een zeven-segment-display 4-cijferig display om de temperatuur te tonen.
Voor het tonen we hebben een Bibliotheek:
Pprogramma:
#include
#include
//Pinnen voor temperatuur sensor
const byte van de bus = 2;
//Pennen voor de Weergave
const byte klok = 8;
const byte data = 9;
//exemplaren voor de bibliotheken
OneWire oneWire(bus);
Dallas temperatuur sensoren(&oneWire);
//Array van het apparaat adressen om te slaan het
adres van het apparaat adressen;
TM1637Display display(klok,data);
//globale Variabele voor het Min-teken op het Display
const uint8_t min[] = { 0x40 };
const uint8_t plus[] = { 0x00 };
void setup() {
// seriële interface start
Serial.beginnen(115200);
//We bepalen het aantal Sensoren op de single-wire Bus
sensoren.begin();
Serial.print(sensoren.getdevice count(), DEC);
Serial.println(" Sensoren gevonden.");
//Nu gaan we controleren of de Bus, in de parasitaire modus is
Serieel.print("Parasitaire modus ");
if (sensoren.isParasitePowerMode()) {
Serial.println("Een");
} else {
Serial.println("UIT");
}
//Nu gaan we controleren of één van de Sensoren op de Bus, een temperatuur Sensor
if (!sensoren.getAddress(adressen,0)) Serieel.println("Geen temperatuur sensor!");
//adressen
Serial.print("adres: ");
print het adres(de adressen);
naar Serieel.println();
//Nu gaan we de gewenste resolutie (9, 10, 11, of 12-bit)
sensoren.setResolution(adressen, 9);
//Om de controle van de waarde van
Serieel.print("resolution = ");
Serial.print(sensoren.getResolution(adres), DEC);
Serial.println();
//Nu schakelen we over de Weergave op een
beeldscherm.setBrightness(0x0f);
}
// functie zumDrucken de temperatuur van een sensor
void print temperatuur(device address adres van het apparaat)
{
float tempC = sensoren.getTempC(adres);
Serial.print("temperatuur C: ");
Serial.print(tempC);
Serial.print(" temperatuur F: ");
Serial.println(Dallas temperatuur::toFahrenheit(tempC)); // Zet de waarde in Fahrenheit
//voor Display, zetten we het juiste teken
//en terug te keren de waarde met drie cijfers beginnen op Positie 1
als (tempC<0) {
- display.setSegments(min,1,0);
//voor negatieve temperaturen moeten we gebruik maken van de waarde van de omgekeerde
weergave.showNumberDec(ronde(tempC*-10),trouw,3,1);
} else {
display.setSegments(plus,1,0);
display.showNumberDec(ronde(tempC*10),trouw,3,1);
}
}
void loop() {
Serial.print("het Lezen van temperatuur ...");
sensoren.verzoek bevriezen(); // het Commando om de temperatuur uit te lezen
op een Seriële manier.println("Klaar!");
// Nu de uitgang van de gegevens
afdrukken temperatuur(adressen);
delay(1000); //we wachten voor 1 s
}
// de functie om een sensor adres afdrukken
void print-adres(apparaatadres adres)
{
voor (uint8_t i = 0; i < 8; i++)
{
if (adressen[i] < 16) Serieel.print("0");
Serial.print(adressen[i], HEX);
}
}