Sensor Digital de Temperatura y Humedad 1 wire ![]() El sensor DHT11 originalmente tiene 4 puertos de los cuales solo usaremos 3 para conectarlo a nuestra MCU tal y como nos indica el fabricante. Para comunicarnos con el sensor debemos de implementar en nuestra MCU el protocolo que el fabricante nos proporciona el datasheet es el siguiente: La MCU se comunicará con el DHT y éste le enviará 5 bytes de datos donde los 2 primeros corresponderán a la Humedad Relativa, los 2 siguientes a la Temperatura y el último byte para el Checksum. Pimero de todo MCU mandará una secuencia de START al DHT y después el mismo esperará a que el DHT responda. Después el DHT mandará una señal al MCU para indicar de que está preparado para inicial la trasmisión bit a bit. Siempre que inicia la trasmisión de un bit el sensor, mandará un pulso de bajo voltaje de 50us y después enviará un pulso de alto voltaje que según la duración del mismo el pulso significará que es un "0" (26-28us fig 3) o un "1" (70us fig 4). Código para realizar la secuencia de START: /* #define Data PORTBbits.RB4 //El sensor lo conectaremos al puerto RB4 #define DataDir TRISBbits.TRISB4 void start_signal() { DataDir = 0; // Data port is output Data = 0; __delay_ms(25); Data = 1; __delay_us(30); Data = 0; DataDir = 1; // Data port is input } */ Código para verificar que recibimos respuesta por parte del sensor para medir el tiempo utilizamos el TIMER2: /* unsigned short check_response() { TOUT = 0; TMR2 = 0; TMR2ON = 1; // start timer while (!Data && !TOUT); if (TOUT) return 0; else { TMR2 = 0; while (Data && !TOUT); if (TOUT) return 0; else { TMR2ON = 0; return 1; } } } */ Código para guardar los bits en bytes utilizando el TIMER2: /* unsigned short read_byte() { unsigned short num = 0; DataDir = 1; for (i=0; i<8; i++) { while (!Data); TMR2 = 0; TMR2ON = 1; while (Data); TMR2ON = 0; if (TMR2 > 49) num |= 1<<(7-i); // si el tiempo > 49us, Data es 1 } return num; } */ Código en el Main(): /* start_signal(); check = check_response(); if (!check) { while (BusyUSART()); putsUSART("No response from the sensor DHT11"); Salto_Enter(); } else { RH_Byte1 = read_byte(); RH_Byte2 = read_byte(); T_Byte1 = read_byte(); T_Byte2 = read_byte(); CheckSum = read_byte(); __delay_us(50); TRISBbits.TRISB4 = 0; PORTBbits.RB4 = 1; // Check for error in Data reception if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) { sprintf(CharTX, "DATA DHT11 :Temperature = %u C", T_Byte1); while (BusyUSART()); putsUSART(CharTX); Salto_Enter(); sprintf(CharTX, "DATA DHT11 :Humidity = %u %%", RH_Byte1); while (BusyUSART()); putsUSART(CharTX); Salto_Enter(); } else { while (BusyUSART()); putsUSART("Checksum Error! Trying Again ... "); Salto_Enter(); } } */ IMPLEMENTACIÓN: |