Sensor de temperatura/humedad DHT11

Actualmente estoy tratando de leer un byte de mi sensor dht11 y escribirlo en la terminal virtual, pero no pude encontrar una hoja de datos simple para principiantes. Encontré un código mikroC un poco complicado y una configuración que tiene pic16f628a y lcd. Puede encontrarlo aquí Eso funciona, pero si le agrego una terminal virtual. No aparece nada en el terminal virtual, incluso si agrego los códigos mikroC requeridos. Mientras que mi segundo intento, reemplazo mi microcontrolador con pic16f877a, puedo ver este texto en la terminal virtual "Sin respuesta del sensor", que es el mensaje de error de mi código mikroC.

Aquí hay información sobre dht11; DHT11 utiliza una comunicación simplificada de un solo bus. Bus único que solo una línea de datos, el sistema de intercambio de datos, control por un solo bus para completar. Envía un formato de datos de 40 bits: datos enteros de humedad de 8 bits + datos decimales de humedad de 8 bits + datos enteros de temperatura de 8 bits + datos de temperatura fraccional de 8 bits + bit de paridad de 8 bits. También puede encontrar la hoja de datos desde: aquí

Como se puede ver no hay conexión defectuosa

También tengo el mismo problema una vez que trato de usar pic16f877a, lo siento, si tienes la solución, ayúdame, Justine Joseph.
@JustineWambura después del 19 de diciembre voy a publicar una solución paso a paso que incluye código mikroC, simulación de proteus, imágenes de hardware, etc. Si cree que es demasiado tarde, aquí tiene una pista: DHT11 envía 40 bits en secuencia antes de obtenerlos bits debe iniciar la señal, puede encontrar un ejemplo aquí . En este ejemplo, la parte del temporizador puede ser confusa y problemática. Echa un vistazo a esa parte. Buena suerte :)

Respuestas (2)

Hace un par de semanas quería configurar un circuito simple, que va a medir el nivel de humedad y temperatura en el aire. Cuando empiezo a investigar, no tengo ningún conocimiento sobre cómo configurar un circuito o cómo puedo incrustar un código en una unidad de microcontrolador y muchas preguntas similares.

Entonces, a continuación, explicaré mi pequeño desafío paso a paso. Espero que sea útil. Antes de comenzar, debe volver a llenar sus vasos, puede ser un poco largo.

Ahora aquí está mi lista de componentes;

Pic 16F877A (40 pines) Crystal 4.0 MHz 22pF Condensador 100nJ Condensador (0.1uF) 330nJ Condensador (0.3uF) DHT11 (sensor de humedad y temperatura) 1uF Condensador (1 Micro F) 10uF Condensador max232 RS232 Conector DB9 Batería de 9V y cierre de batería

configuración;

1) Protoboard

Algunos tipos de placas de prueba tienen una línea positiva o negativa a través de la placa, por otro lado, las líneas de alimentación y tierra de los otros tipos pueden dividirse en dos. Puede averiguarlo mirando las líneas rojas y azules en el protoboard. Y la parte interior de la misma, hay letras y números. Los números representan las columnas que están conectadas entre sí. Entonces, si conecto 5V a A-0, entonces B-0, C-0, D-0 y E-0 tienen el mismo voltaje.ingrese la descripción de la imagen aquí

2) Regulador 7805 (9V a 5V)

Si leyó las hojas de datos de pic16f877a y dht11, aprendió que funcionan con 5V pero nuestra batería es de 9V.ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Como puede ver arriba, puede regular fácilmente su voltaje. Ahora puede alimentar sus terminales positivos desde la salida del regulador.

3) DHT11 (Sensor)

Este es un sensor de temperatura y humedad digital económico con 4 pines. Aquí hay una buena hoja de datos (debido a mi reputación, no pude publicar más de 2 enlaces. Puede encontrarla en Google, si la encuentra, eche un vistazo a dos o más hojas de datos porque algunas de ellas pueden no ser lo suficientemente claras) que es vital para entender cómo funciona dht11. Mientras trabaja en proyectos electrónicos, se encontrará con pines Vcc, Vdd, Vss, Vee en una explicación muy breve. Vcc y Vdd son suministro de voltaje positivo, Vee y Vss son suministro de tierra negativo. Entonces puede asumir que Vcc y Vdd son iguales para las siguientes imágenes.ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

4) Imagen 16F877A (40 pines)

Esta es una unidad de microcontrolador bien conocida, fácil de encontrar y tiene suficiente pierna para mi proyecto, por eso prefiero esta foto. Aquí está la hoja de datos: (desafortunadamente, debido a mi reputación, no pude publicar más de 2 enlaces. Puede encontrarlo en la página web de mikrochip) La hoja de datos muestra el diagrama de pines. En el diagrama, verá los números del 1 al 40. En la siguiente imagen, observe el pequeño punto hundido. Representa el partido de ida.

ingrese la descripción de la imagen aquí

5) Cristal (Reloj)

Al igual que todos los procesadores, el 877a también necesita reloj. Por favor, no considere el Mhz de cristal del esquema, nuestro circuito funciona con cristal de cuarzo de 4MHz con condensadores de 22pF.

ingrese la descripción de la imagen aquí

6) Máx. 232

Ok, como dije, este proyecto medirá la temperatura y la humedad y enviará estos valores a la computadora. En este punto, para poder llevar estos valores de nuestro circuito a la PC, tenemos que construir una parte de comunicación en serie. No tenga miedo de las palabras de telecomunicaciones, con la ayuda del cable RS-232 todo es realmente simple. Antes de conectar el cable, debe construir el siguiente esquema. En la imagen, verá TTL serie TX y RX, estos dos cables se conectarán con los pines 25 (TX) y 26 (RX) de la imagen.

ingrese la descripción de la imagen aquí

El esquema anterior puede ser confuso. Imagine que en la parte inferior de la imagen hay una tierra y cuatro nodos negros (que están cerca de la parte inferior) conectados a tierra.

Para un tutorial completo de proteus, puede encontrar mi video a continuación, pero no olvide que proteus es solo una simulación y eso no garantiza que su hardware funcione correctamente. Especialmente la frecuencia puede causar algunos problemas. Aquí está

¡Mi vídeo de YouTube!

En el código mikroC configuro los leds de acuerdo a la humedad si es mayor al 20% se enciende el led superior, y si el nivel de humedad pasa por encima del 30% también se enciende el 2do led.

ingrese la descripción de la imagen aquí

Código MikroC;

sbit Data    at RB0_bit;
sbit DataDir at TRISB0_bit;
unsigned short k;

unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";

void DHT11StartSignal(){
  DataDir = 0;
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;
}

unsigned short DHT11CheckResponse(){
  k = 150;
  while(!Data){
    Delay_us(2);
    k--;
    if(k<1) return 0;  // time out
  }
  k = 150;
  while(Data){
    Delay_us(2);
    k--;
    if(k<1) return 0;   // time out
  }
  return 1;
}


unsigned short DHT11ReadByte(){
  int i;
  unsigned short num = 0;
  DataDir = 1;
  for (i=0; i<8; i++){
    while(!Data);
    Delay_us(40);
    if(Data) num |= 1<<(7-i);
    while(Data);
  }
  return num;
}

void main() {
  UART1_Init(9600);
  TRISC.RC0 = 0;
  TRISC.RC1 = 0;
  TRISC.RC2 = 0;

  while(1){
    DHT11StartSignal();
    if(!DHT11CheckResponse()) continue;
    RH_Byte1 = DHT11ReadByte();
    RH_Byte2 = DHT11ReadByte();
    T_Byte1 = DHT11ReadByte();
    T_Byte2 = DHT11ReadByte();
    DHT11ReadByte(); /* Checksum */

    // Set temp
    temp[15] = T_Byte1/10 + 48;
    temp[16] = T_Byte1%10 + 48;
    temp[18] = T_Byte2/10 + 48;
    UART1_Write_Text(temp);
    UART1_Write(10);
    UART1_Write(13);

    // Set hum
    hum[12] = RH_Byte1/10 + 48;
    hum[13] = RH_Byte1%10 + 48;
    hum[15] = RH_Byte2/10 + 48;
    UART1_Write_Text(hum);
    UART1_Write(10);
    UART1_Write(13);
    UART1_Write(10);
    UART1_Write(13);

    PORTC.RC0 = (RH_Byte1) >= 20;
    PORTC.RC1 = (RH_Byte1) >= 30;
    PORTC.RC2 = (RH_Byte1) >= 40;

    // Wait
    Delay_ms(1000);
  }
}

Y parte final:

Incrustar código en la MPU;

estación de fotos

ingrese la descripción de la imagen aquí

DHT11 ATMEGA8 MikroC programación...

sbit Data    at PORTC5_Bit;
sbit Data_In at PINC5_Bit;
sbit DataDir at DDC5_bit;

unsigned short k,l;

unsigned int T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";

void DHT11StartSignal(){
  DataDir = 1;
  Data    = 0;
  Delay_ms(18);
  Data    = 1;
  Delay_us(40);
  //Data = 0;
  DataDir = 0;
}

int DHT11CheckResponse(){
  k = 150;
  while(!Data_In)
  {
    Delay_us(10);
    k--;
    if(k<=1)
    {
     UART1_Write('D');
     return 0;  // time out
    }
  }

  k = 150;
  while(Data_In)
  {
    Delay_us(20);
    k--;
    if(k<=1)
    {
    UART1_Write('T');
    return 0;   // time out
    }
  }
  return 1;
}


unsigned int DHT11ReadByte(){
  int i;
  unsigned short num = 0;
  DataDir = 0;
  for (i=0; i<8; i++){
    while(!Data_In);
    Delay_us(25);
    if(Data_In) num |= 1<<(7-i);
    while(Data_In);
  }
  return num;
}

void main() {
  UART1_Init(9600);
  while(1){
again:
    DHT11StartSignal();
   if(!DHT11CheckResponse()) continue;
    RH_Byte1 = DHT11ReadByte();
    RH_Byte2 = DHT11ReadByte();
    T_Byte1 =  DHT11ReadByte();
    T_Byte2 =  DHT11ReadByte();
    DHT11ReadByte(); /* Checksum */

    // Set temp
    temp[15] = T_Byte1/10 + 48;
    temp[16] = T_Byte1%10 + 48;
    temp[18] = T_Byte2/10 + 48;
    UART1_Write_Text(temp);
    UART1_Write(10);
    UART1_Write(13);

    // Set hum
    hum[12] = RH_Byte1/10 + 48;
    hum[13] = RH_Byte1%10 + 48;
    hum[15] = RH_Byte2/10 + 48;
    UART1_Write_Text(hum);
    UART1_Write(10);
    UART1_Write(13);
    UART1_Write(10);
    UART1_Write(13);


    // Wait
    Delay_ms(1000);
  }
}