DHT11 Sensor de temperatura / humedad

1

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

Aquí hay algo de 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 formato de datos de 40 bits: Los datos enteros de humedad de 8 bits + 8 bits los datos decimales de humedad +8 datos enteros de temperatura de bits + datos de temperatura fraccional de 8 bits + bit de paridad de 8 bits. También puede encontrar la hoja de datos en: aquí

    
pregunta Sanberk

2 respuestas

2

Hace un par de semanas quería configurar un circuito simple, que medirá la humedad y el nivel de temperatura en el aire. Cuando comienzo 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 te sea de utilidad. Antes de comenzar, debes volver a llenar tus tazas, puede que sea un poco largo.

Ahora aquí está mi lista de componentes;

Pic 16F877A (40 pines)  Cristal 4.0 MHz  Condensador 22pF  Condensador 100nJ (0.1uF)  Condensador 330nJ (0.3uF)  DHT11 (Sensor de humedad y temperatura)  Condensador 1uF (1 Micro F)  Condensador 10uF  max232  Conector DB2 RS232  Batería de 9V y amp; ajuste de batería

Configuración;

1) Breadboard

Algunos tipos de placas de prueba tienen una línea positiva o negativa a través de la tabla, por otro lado, las líneas eléctricas y de tierra de los otros tipos pueden dividirse en dos. Puedes resolver esto mirando las líneas rojas y azules en el tablero. Y en su parte interior, 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.

2)7805Regulador(9Va5V)

Sileeslashojasdedatosdepic16f877aydht11,aprendistequefuncionancon5Vperonuestrabateríaesde9V.

Comopuedeverarriba,puederegularfácilmentesuvoltaje.Ahorapuedealimentarsu(s)terminal(s)positivo(s)desdelasalidadelregulador.

3)DHT11(Sensor)

Esteesunsensordetemperaturayhumedaddigitalbaratocon4pines.Aquíestálahojadedatosagradable(debidoamireputaciónnopudepublicarmásde2enlaces.Puedeencontrarlaengoogle,silaencuentra,miredosomáshojasdedatosporquealgunasdeellaspuedennoserlosuficientementeclaras),queesEsvitalentendercómofuncionadht11.Mientrastrabajaenproyectoselectrónicos,seencontraráconVcc,Vdd,Vss,Vee.Enunabreveexplicación,VccyVddsonalimentacióndetensiónpositiva,VeeyVsssonconexiónatierranegativa.AsíquepuedesasumirqueVccyVddsonigualesparalassiguientesimágenes.

4)Pic16F877A(40pin)

Estaesunaunidaddemicrocontroladormuyconocida,fácildeencontraryconsuficientesoporteparamiproyecto,poresoprefieroestafoto.Aquíestálahojadedatos:(desafortunadamentedebidoamireputaciónnopudepublicarmásde2enlaces.Lopuedesencontrarenlapáginawebdemikrochip)Lahojadedatostemuestraeldiagramadepines.Eneldiagrama,verálosnúmerosdel1al40.Enlasiguienteimagen,observeelpequeñopuntodehundimiento.Representalaprimeraetapa.

5) Cristal (Reloj)

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

6)Max232

Bien,comodije,esteproyectovaamedirlatemperatura-humedadyenviarestosvaloresalacomputadora.Enestepunto,parapoderobtenerestosvaloresdenuestrocircuitoalaPC,tenemosqueconstruirunapartedecomunicaciónenserie.Notengamiedodelaspalabrasdetelecomunicaciones,conlaayudadelcableRS-232todoesrealmentesimple.Antesdeconectarelcabledebesconstruirelsiguienteesquema.Enlaimagen,veráquelosdoscablesTTLserialTXyRXseconectaránconlos25pines(TX)y26(RX)delaimagen.

El esquema anterior puede ser confuso, imagina 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 ver el tutorial completo de proteus, puede encontrar mi video a continuación, pero no olvide que proteus es solo una simulación y no se garantiza que su hardware funcione correctamente. Especialmente la frecuencia puede causar algunos problemas. Aquí está

¡Mi video de YouTube!

En el código mikroC, configuro los leds de acuerdo con la humedad si es superior al 20%. El led superior se enciende, y si el nivel de humedad supera el 30%, el 2do led también se enciende.

CódigoMikroC;

sbitDataatRB0_bit;sbitDataDiratTRISB0_bit;unsignedshortk;unsignedshortT_Byte1,T_Byte2,RH_Byte1,RH_Byte2;chartemp[]="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;

    
respondido por el Sanberk
0

DHT11 ATMEGA8 MikroC Programming ...

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);
  }
}
    
respondido por el 5 Tech Solutions

Lea otras preguntas en las etiquetas