Sensor de temperatura y humedad DHT11
El sensor mide la temperatura con una precisión ± 2oC y la humedad relativa con una precisión de ± 5 %. Ambos valores medidos se transmiten al microcontrolador en un paquete de datos a través de un protocolo de un solo cable.
Tanto el Arduino como el sensor DHT11 tienen una salida de colector abierta que también se puede utilizar como entrada. El Pullup Resist integrado en el Arduino se comparte. Para iniciar la transmisión, el Arduino cambia la salida para al menos 18 ms a LOW y luego cambia el pin a la entrada. Cuando el sensor detecta esta señal LOW en el pin de datos, comienza a transmitir los datos. Cambia el pin de datos como salida y lo establece en LOW para los años 80 y luego de nuevo para los 80 en HIGH. Esto es seguido por 40 bits de datos. Para distinguir los bits de datos, para un bit 0 la salida es 50 s en LOW y 28 s en HIGH, mientras que para un 1 bit es 50 s en LOW y 70 s en HIGH. Los 40 bits de datos se dividen en 5 bytes. Humedad de byte alto, humedad de byte bajo, temperatura alta byte, temperatura baja byte y suma de comprobación.
Pero no te preocupes por controlar el puerto Arduino que no tienes que implementar tú mismo, ya hay una biblioteca ya hecha que puedes integrar en tu propio programa.
Hay dos bibliotecas para el Arduino y una para el ESPx. Elegí SimpleDHT.
Circuito y programa de prueba:
Conectamos el pin de datos del DHT11 con el pin 2 en el Arduino. Sin embargo, cualquier otro pin digital también se puede utilizar.
#include "simpledht.h>"
const byte dataPin n.o 2; Pin de datos del DHT11
SimpleDHT11 dht11;
configuración del vacío()
inicio de la interfaz serie para generar valores medidos
Serial.begin(115200);
}
void loop()
Serial.println ("Tmabil." . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Serial.println("Medidas de DHT11");
leyendo los valores
temperatura de byte 0;
byte húmedo 0;
comprobamos si se ha producido un error
int err - SimpleDHTErrSuccess;
err á dht11.read(dataPin, &temperature, &wet, NULL);
si (err !- SimpleDHTErrSuccess)
Serial.print("Error al leer de DHT11. Error á ");
Serial.println(err);
• de lo contrario
Serial.print((int)temperature);
Serial.println(" c ");
Serial.print((int)wet);
Serial.println(" %H ");
}
esperar 1.5 s El DHT11 hacer 1 medición / s
retardo(1500);
}
Para las pruebas, por ejemplo, puede tocar el sensor, lo que debe aumentar la temperatura y especialmente la humedad.
Sensor de temperatura DS18B20
Este sensor de temperatura es también un sensor de temperatura inteligente que transmite los valores medidos a través de un protocolo de un solo cable en C. A diferencia del DHT 11, el DS18B20 mide solo la temperatura pero con una mayor precisión. La precisión es ± 0,5 oC en un rango de temperatura de -10 a +85 oC. El tiempo de medición es de 0,75s con una resolución de 12 bits.
A diferencia del DTH11, el protocolo de un solo cable es mucho más flexible. Cada sensor tiene un número de serie único, de modo que cualquier número de sensores se puede operar en el mismo bus de un solo cable. También hay otros sensores que utilizan el mismo protocolo, que luego puede ser controlado por un bus.
El microcontrolador puede utilizar un comando de búsqueda para determinar qué sensores están conectados al bus después de la inicialización. Dnúmero de serie único Contiene también proporciona información sobre el tipo de sensor para identificarlo. Para leer los valores, el número de serie siempre debe enviarse primero, de modo que solo uno de los sensores ocupe el bus.
EOtra característica especial del DS18B20 es la posibilidad de obtener la fuente de alimentación internamente necesaria de la línea de datos (modo parásito), de modo que sólo se requiere un cableado de dos hilos.
Por supuesto, las bibliotecas Arduino también están disponibles para el DS18B20, uno para el protocolo de un solo cable y otro para el sensor de temperatura.
Circuito y programa de prueba
Para el circuito, además, utilizamos una pantalla de siete segmentos Pantalla de 4 dígitos para mostrar la temperatura.
Para la pantalla también necesitamos una biblioteca:
Program:
#include "dallastemperature.h"
#include tm1637display.h>
Pines para sensor de temperatura
bus de bytes const n.o 2;
Pines para visualización
Const byte clock n.o 8;
Datos de bytes const n.o 9;
Instancias de las bibliotecas
OneWire oneWire(bus);
DallasSensores de temperatura(&oneWire);
Matriz para almacenar direcciones de dispositivos
Direcciones DeviceAddress;
TM1637Pantalla (reloj, datos);
variable global para caracteres menos en la pantalla
Const uint8_t minus[] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Const uint8_t plus[] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
configuración del vacío()
Iniciar interfaz serie
Serial.begin(115200);
Determinamos la anzah de los sensores en el bus de un solo cable
sensors.begin();
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println("Sensores encontrados.");
Ahora vamos a comprobar si el autobús está en modo parásito
Serial.print("El modo parasitario es ");
si (sensors.isParasitePowerMode())
Serial.println("ON");
• de lo contrario
Serial.println("OFF");
}
Ahora comprobamos si uno de los sensores del autobús es un sensor de temperatura
if (!sensors.getAddress(addresses,0)) Serial.println("No hay sensor de temperatura presente!");
Ver direcciones
Serial.print("Dirección: ");
printAddress(direcciones);
Serial.println();
Ahora establecemos la resolución deseada (9, 10, 11 o 12 bits)
sensors.setResolution(direcciones, 9);
Para el control, leemos el valor de nuevo
Serial.print("Resolución á ");
Serial.print(sensors.getResolution(addresses), DEC);
Serial.println();
Ahora encendemos la pantalla
display.setBrightness(0x0f);
}
función para imprimir la temperatura de un sensor
void printTemperature(DeviceAddress deviceAddress)
{
float tempC - sensors.getTempC(addresses);
Serial.print("Temperatura C: ");
Serial.print(tempC);
Serial.print(" Temperatura F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); Convierte el valor a Fahrenheit
para la pantalla establecemos el signo correcto
y salida el valor tres dígitos de la posición 1
si (tempC<0)
display.setSegments (menos,1,0);
para temperaturas negativas tenemos que invertir el valor
display.showNumberDec(round(tempC*-10),true,3,1);
• de lo contrario
display.setSegments (más,1,0);
display.showNumberDec(round(tempC*10),true,3,1);
}
}
void loop()
Serial.print("Leer temperatura ...");
sensors.requestTemperatures(); Commando para leer las temperaturas
Serial.println("Hecho!");
Ahora la salida de los datos
printTemperature(direcciones);
retardo(1000); estamos esperando 1 s
}
función para imprimir una dirección del sensor
void printAddress (direcciones DeviceAddress)
{
para (uint8_t i a 0; i < 8; i++)
{
if (direcciones[i] < 16) Serial.print("0");
Serial.print(addresses[i], HEX);
}
}