Este artículo explica cómo leer los datos de tres sensores de temperatura y humedad —DHT11, DHT22 y SHTC3— utilizando una placa NodeMcu y enviarlos por el puerto serie. Para cada sensor, proporciono ejemplos de código tanto con bibliotecas de terceros como sin ellas.
Tutorial de configuración del entorno de desarrollo ESP8266: https://blog.zeruns.com/archives/526.html
Las direcciones de compra de los sensores utilizados en este artículo se encuentran al final del artículo.
DHT11
El DHT11 es un sensor de temperatura y humedad con salida de señal digital calibrada. Su precisión es de ±5% RH para humedad y ±2°C para temperatura, con un rango de medición de 20-90% RH para humedad y 0~50°C para temperatura. Tiene una precisión limitada, pero es económico. El DHT11 utiliza comunicación de bus único. El voltaje de alimentación es de 3.3~5 V.
Usar la biblioteca DHT
Utilice la biblioteca DHT sensor library (debe instalarse manualmente; la guía de instalación se encuentra en el Tutorial de configuración del entorno de desarrollo ESP8266 mencionado anteriormente) para leer directamente los datos del DHT11.
#include
``````c
#include <DHT.h> // Incluir la biblioteca DHT
DHT dht(D1, DHT11); // Configurar el pin de datos y el tipo de sensor
void setup(){ // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
dht.begin();
}
//https://blog.zeruns.com
void loop() {
delay(1000); // Retraso de 1000 milisegundos
float RH = dht.readHumidity(); // Leer los datos de humedad
float T = dht.readTemperature(); // Leer los datos de temperatura
Serial.print("Humidity:"); // Imprimir "Humidity:" por el puerto serie
Serial.print(RH); // Imprimir los datos de humedad
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); // Imprimir los datos de temperatura
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
Sin usar biblioteca
Leer los datos directamente escribiendo el programa siguiendo el manual de datos del DHT11.
Manual del DHT11: http://go.zeruns.com/G
#define data D1 // El pin de datos (Pin 2) del DHT11 está conectado al pin D1 de la placa NodeMcu
unsigned char i; // Variable entera sin signo de 8 bits
float RH,T; // Número de punto flotante de precisión simple (32 bits)
byte RH_H,RH_L,T_H,T_L,sum,check; // Variables de byte, números binarios
void setup() { // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
}
void loop() { // Función de bucle, se ejecuta repetidamente después de la inicialización
delay(1000); // Retraso de 1000 milisegundos
DHT11(); // Obtener datos de temperatura y humedad
Serial.print("Humidity:"); // Imprimir "Humidity:" por el puerto serie
Serial.print(RH); // Imprimir los datos de humedad
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); // Imprimir los datos de temperatura
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
void DHT11()
{
RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
pinMode(data,OUTPUT); // Configurar el pin como salida
digitalWrite(data,1); // Establecer el pin en nivel alto
delay(10); // Retraso de 10 milisegundos
digitalWrite(data,0); // Establecer el pin en nivel bajo
delay(25); // Retraso de 25 milisegundos
digitalWrite(data,1); // Establecer el pin en nivel alto
pinMode(data,INPUT); // Configurar el pin como entrada
delayMicroseconds(30); // Retraso de 30 microsegundos
if(!digitalRead(data)) // Verificar si el pin de entrada está en nivel bajo
{//https://blog.zeruns.com
while(!digitalRead(data)); // Esperar hasta que la entrada sea alta
while(digitalRead(data)); // Esperar hasta que la entrada sea baja
for(i=0;i<8;i++) // Repetir 8 veces
{
while(!digitalRead(data));// Esperar hasta que la entrada sea alta
delayMicroseconds(28); // Retraso de 28 microsegundos
if(digitalRead(data)){ // Verificar si la entrada está en nivel alto
bitWrite(RH_H, 7-i, 1); // Escribir 1 en el bit 7-i (contando desde la derecha) de la variable RH_H
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(RH_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_H, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(check, 7-i, 1);
while(digitalRead(data));
}
}
}
sum=RH_H + RH_L + T_H + T_L;
byte sum_temp=0;
// Leer los últimos 8 bits de sum y escribirlos en sum_temp
for(i=0;i<8;i++){
bitWrite(sum_temp,i,bitRead(sum,i));
}//https://blog.zeruns.com
if(check==sum_temp){ // Verificar los datos
RH=RH_H+float(RH_L)/10;
T=T_H+float(T_L)/10;
}
}
Resultado
DHT22 (AM2302)
El DHT22 (AM2302) es un sensor de temperatura y humedad con salida digital calibrada. Su precisión es de ±2% RH en humedad y ±0.5°C en temperatura, con un rango de humedad de 0-100% RH y temperatura de -40 a 80°C, con resolución de 0.1. Tiene alta precisión y un precio asequible. El DHT22 utiliza comunicación de un solo hilo. Voltaje de alimentación: 3.3 a 5 V.
Usar la biblioteca DHT
Utilizar la biblioteca DHT sensor library para leer directamente los datos del DHT22.
#include <DHT.h> // Incluir la biblioteca DHT
DHT dht(D1, DHT22); // Configurar el pin de datos y el tipo de sensor
void setup(){ // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
dht.begin();
}
//https://blog.zeruns.com
void loop() {
delay(1000); // Retraso de 1000 milisegundos
float RH = dht.readHumidity(); // Leer los datos de humedad
float T = dht.readTemperature(); // Leer los datos de temperatura
Serial.print("Humidity:"); // Imprimir "Humidity:" por el puerto serie
Serial.print(RH); // Imprimir los datos de humedad
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); // Imprimir los datos de temperatura
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
Sin usar biblioteca
Leer los datos directamente escribiendo el programa siguiendo el manual de datos del DHT22.
Manual del DHT22: http://go.zeruns.com/H
#define data D1 // El pin de datos (Pin 2) del DHT22 está conectado al pin D1 de la placa NodeMcu
unsigned char i; // Variable entera sin signo de 8 bits
float RH,T; // Número de punto flotante de precisión simple (32 bits)
byte RH_H,RH_L,T_H,T_L,sum,check; // Variables de byte, números binarios
void setup() { // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
}
void loop() { // Función de bucle, se ejecuta repetidamente después de la inicialización
delay(1000); // Retraso de 1000 milisegundos
DHT11(); // Obtener datos de temperatura y humedad
Serial.print("Humidity:"); // Imprimir "Humidity:" por el puerto serie
Serial.print(RH); // Imprimir los datos de humedad
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); // Imprimir los datos de temperatura
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
void DHT11()
{
RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
pinMode(data,OUTPUT); // Configurar el pin como salida
digitalWrite(data,1); // Establecer el pin en nivel alto
delay(10); // Retraso de 10 milisegundos
digitalWrite(data,0); // Establecer el pin en nivel bajo
delay(25); // Retraso de 25 milisegundos
digitalWrite(data,1); // Establecer el pin en nivel alto
pinMode(data,INPUT); // Configurar el pin como entrada
delayMicroseconds(30); // Retraso de 30 microsegundos
if(!digitalRead(data)) // Verificar si el pin de entrada está en nivel bajo
{//https://blog.zeruns.com
while(!digitalRead(data)); // Esperar hasta que la entrada sea alta
while(digitalRead(data)); // Esperar hasta que la entrada sea baja
for(i=0;i<8;i++) // Repetir 8 veces
{
while(!digitalRead(data));// Esperar hasta que la entrada sea alta
delayMicroseconds(28); // Retraso de 28 microsegundos
if(digitalRead(data)){ // Verificar si la entrada está en nivel alto
bitWrite(RH_H, 7-i, 1); // Escribir 1 en el bit 7-i (contando desde la derecha) de la variable RH_H
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(RH_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_H, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(check, 7-i, 1);
while(digitalRead(data));
}
}
}
sum=RH_H + RH_L + T_H + T_L;
byte sum_temp=0;
// Leer los últimos 8 bits de sum y escribirlos en sum_temp
for(i=0;i<8;i++){
bitWrite(sum_temp,i,bitRead(sum,i));
}//https://blog.zeruns.com
if(check==sum_temp){
if(bitRead(RH_H,7)==1){ // Verificar si la temperatura es negativa
T=-(float(T_H<<8)+float(T_L))/10;
}else{
T=(float(T_H<<8)+float(T_L))/10;
}
RH=(float(RH_H<<8)+float(RH_L))/10;
}
}
Resultado
SHTC3
El SHTC3 es un sensor de temperatura y humedad con salida digital calibrada. Su precisión es de ±2% RH en humedad y ±0.2°C en temperatura, con un rango de humedad de 0-100% RH y temperatura de -40 a 125°C, con resolución de 0.01. Tiene alta precisión y un precio relativamente bajo, pero la documentación es escasa. El SHTC3 utiliza comunicación I2C (IIC). Voltaje de alimentación: 1.62 a 3.6 V.
Manual del SHTC3: http://go.zeruns.com/I
Usar la biblioteca Wire (I2C)
Utilizar la biblioteca Wire para comunicarse con el SHTC3 y leer los datos.
/* https://blog.zeruns.com
* Conexión
* SHTC3 Placa de desarrollo
* SCL SCL (en la placa NodeMcu es D1)
* SDA SDA (en la placa NodeMcu es D2)
*/
#include <Wire.h>
#define SHTC3_ADDRESS 0x70 // Definir la dirección I2C del dispositivo SHTC3 como 0x70
float T, RH;
void setup() { // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
Wire.begin(); // Inicializar como maestro I2C
}
void loop() { // Función de bucle, se ejecuta continuamente después de la inicialización
delay(1000); // Retraso de 1000 milisegundos
SHTC3(); // Obtener datos de temperatura y humedad
Serial.print("Humedad:"); // Imprimir "Humedad:" por el puerto serie
Serial.print(RH); // Imprimir datos de humedad por el puerto serie
Serial.print("%");
Serial.print(" Temperatura:");
Serial.print(T); // Imprimir datos de temperatura por el puerto serie
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
void SHTC3(){ // Obtener datos de temperatura y humedad
Wire.beginTransmission(SHTC3_ADDRESS); // Iniciar transmisión al dispositivo I2C con dirección 0x70.
Wire.write(byte(0xE0)); // Enviar instrucción de escritura
Wire.endTransmission(); // Finalizar transmisión al dispositivo
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0x35)); // Enviar parte alta de la instrucción de despertar
Wire.write(byte(0x17)); // Enviar parte baja de la instrucción de despertar
Wire.endTransmission();
delayMicroseconds(300); // Retraso de 300 microsegundos
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0xE0));
Wire.endTransmission();
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0x7C)); // Enviar parte alta de la instrucción de adquisición
Wire.write(byte(0xA2)); // Enviar parte baja de la instrucción de adquisición
Wire.endTransmission();
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0xE1)); // Enviar instrucción de lectura
Wire.endTransmission();
Wire.requestFrom(SHTC3_ADDRESS,6); // Solicitar datos al dispositivo esclavo
uint16_t T_temp, RH_temp, T_CRC, RH_CRC;
if (2 <= Wire.available()) {
T_temp = Wire.read(); // Leer dato alto de temperatura
T_temp = T_temp << 8; // Desplazar 8 bits a la izquierda
T_temp |= Wire.read(); // Operación OR bit a bit entre el dato alto desplazado y el dato bajo de temperatura recibido
T_CRC = Wire.read(); // Leer código CRC
if(SHTC3_CRC_CHECK(T_temp,T_CRC)){ // Verificar datos
T = float(T_temp) * 175 / 65536 - 45; // Calcular temperatura
}
}//https://blog.zeruns.com
if (2 <= Wire.available()) {
RH_temp = Wire.read(); // Leer dato alto de humedad
RH_temp = RH_temp << 8; // Desplazar 8 bits a la izquierda
RH_temp |= Wire.read(); // Operación OR bit a bit entre el dato alto desplazado y el dato bajo de humedad recibido
RH_CRC = Wire.read();
if(SHTC3_CRC_CHECK(RH_temp,RH_CRC)){
RH = float(RH_temp) * 100 / 65536;
}
}
}
//https://blog.zeruns.com
uint8_t SHTC3_CRC_CHECK(uint16_t DAT, uint8_t CRC_DAT) // Verificación CRC del SHTC3
{
uint8_t i, t, temp;
uint8_t CRC_BYTE;
CRC_BYTE = 0xFF;
temp = (DAT >> 8) & 0xFF;
for(t = 0; t < 2; t ++)
{
CRC_BYTE ^= temp;
for(i = 0; i < 8; i ++)
{
if(CRC_BYTE & 0x80)
{
CRC_BYTE <<= 1;
CRC_BYTE ^= 0x31;
}else{
CRC_BYTE <<= 1;
}
}
if(t == 0)
{
temp = DAT & 0xFF;
}
}//https://blog.zeruns.com
if(CRC_BYTE == CRC_DAT)
{
temp = 1;
}else{
temp = 0;
}
return temp;
}
### Uso de la biblioteca SHTC3
Instale primero la biblioteca `SparkFun SHTC3`.
```c
/* https://blog.zeruns.com
* Conexión
* SHTC3 Placa de desarrollo
* SCL SCL (en la placa NodeMcu es D1)
* SDA SDA (en la placa NodeMcu es D2)
*/
#include <SparkFun_SHTC3.h>
SHTC3 mySHTC3;
void setup(){ // Función de inicialización, se ejecuta solo una vez al inicio del programa
Serial.begin(115200); // Configurar la velocidad del puerto serie
while(Serial == false){}; // Esperar a que se inicie la conexión serial
Wire.begin(); // Inicializar la biblioteca Wire (I2C)
unsigned char i=0;
errorDecoder(mySHTC3.begin());// Para iniciar el sensor, debe llamar a "begin()", la configuración predeterminada usa Wire (puerto I2C predeterminado de Arduino)
}
//https://blog.zeruns.com
void loop() {
float RH, T;
delay(1000); // Retraso de 1000 milisegundos
SHTC3_Status_TypeDef result = mySHTC3.update();
if(mySHTC3.lastStatus == SHTC3_Status_Nominal) // Verificar si el estado del SHTC3 es normal
{
RH = mySHTC3.toPercent(); // Leer datos de humedad
T = mySHTC3.toDegC(); // Leer datos de temperatura
}else{
Serial.print("Actualización fallida, error: ");
errorDecoder(mySHTC3.lastStatus); // Mostrar razón del error
Serial.println();
}
Serial.print("Humedad:"); // Imprimir "Humedad:" por el puerto serie
Serial.print(RH); // Imprimir datos de humedad por el puerto serie
Serial.print("%");
Serial.print(" Temperatura:");
Serial.print(T); // Imprimir datos de temperatura por el puerto serie
Serial.println("C");
Serial.println("https://blog.zeruns.com");
}
void errorDecoder(SHTC3_Status_TypeDef message) // La función errorDecoder imprime los resultados de "SHTC3_Status_TypeDef" de forma amigable
{
switch(message)
{
case SHTC3_Status_Nominal : Serial.print("Nominal"); break;
case SHTC3_Status_Error : Serial.print("Error"); break;
case SHTC3_Status_CRC_Fail : Serial.print("Fallo CRC"); break;
default : Serial.print("Código de retorno desconocido"); break;
}
}
Vista previa del resultado
Compra del sensor
DHT11: Copie $Lk3h1Mx8UTO$ para abrir Taobao en el móvil y realizar el pedido inmediatamente
DHT22: Copie $kr2T1MxkUKY$ para abrir Taobao en el móvil y realizar el pedido inmediatamente
SHTC3: Copie $UD4D1Mx6N3R$ para abrir Taobao en el móvil y realizar el pedido inmediatamente
Lecturas recomendadas:
- Recomendaciones de VPS/ servidor en la nube de alto rendimiento y bajo costo: https://blog.zeruns.com/archives/383.html
- Configurar un servidor de túnel de red interna con panel web: https://blog.zeruns.com/archives/397.html
- Crear un disco personalizado con Cloudreve: https://blog.zeruns.com/archives/515.html
- Cómo crear un blog personal: https://blog.zeruns.com/archives/218.html
- Beneficios para estudiantes: https://blog.zeruns.com/archives/321.html
- Comparto un pequeño juego que te puede generar ingresos: https://blog.zeruns.com/archives/472.html





