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í
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.
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.
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.
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.
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.
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.
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á
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.
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;
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);
}
}
usuario59829
Sanberk