Tag: bits

Palavra-chave
Destaque/Sem destaque
Resolvida/Não Resolvida
Aberta/Encerrada
0 votos
1k visualizações

Saudações,
Estou fazendo um projeto com o sensor de temperatura e umidade DHT22 junto com o PIC 16F628A, porém percebi que o problema está na função que lê os bits do sensor. Alguém poderia me indicar onde está o problema? O meu LCD não aparece nada, somente aparece se eu comentar as linhas que recebem readData(). Esse é o código do PIC:

/*********************** FUNÇOES DO SENSOR DHT22 ****************************************************/
//Envia sinal de start para o sensor
void startSignal() {
set_tris_a(0b00000000); //Configura RA1 como output
output_low(DATA); //Pino DATA envia 0 para o sensor
delay_ms(25);
output_high(DATA); //Pino DATA envia 1 para o sensor
delay_us(30);
set_tris_a(0b00000010); //Configura RA1 como input
}

//Checa resposta do sensor
unsigned short checkResponse() {
delay_us(40);
if(!input(DATA)) delay_us(80);
if(input(DATA)) {
delay_us(50);
return 1;
}
return 0;
}

//Função para ler os dados do sensor DHT22
unsigned short readData() {
unsigned short j=0, contaTempo=0, dataByte=0;

if(timeOut) break;

for(j = 0; j <= 7; j++) {
    contaTempo = 0;
    while(!input(DATA)){ // Espera até que a porta DATA vá para High
        delay_us(1);
        contaTempo++;
        if(contaTempo > 100) {
            timeOut = 1; 
            break;
        }
    }

    delay_us(40);

    if(!input(DATA)) { //Se continuar em Low apos 40us, bit = 0

        dataByte &= ~(1 << (7 - j)); //Zera bit (7-j)
    }
    else { //Se estiver em High apos 40us, bit = 1
        dataByte |= (1 << (7 - j)); //Seta bit (7-j)

        while(input(DATA)){ //Espera até que a porta DATA vá para Low
            delay_us(1);
            contaTempo++;
            if(contaTempo > 100) {
                timeOut = 1; 
                break;
            }
        }
    }
}
return dataByte;

}
/***************************************************************************/

//PROGRAMA PRINCIPAL
void main(void) {
set_tris_a(0b00000000);
set_tris_b(0b00000000);
output_a(0);
output_b(0);
setup_ccp1(CCP_OFF);
lcd_init(); //Inicializa LCD
printf(lcd_putc, “\f”); //Limpa LCD

while(TRUE) {

    delay_ms(2000);
    timeOut = 0;
    //inicia leitura do sensor
    startSignal();
    if(checkResponse()) {

        umidade_byte1 = readData();     //primeiro byte da umidade: bit 15 ~ bit 8
        umidade_byte2 = readData();     //segundo byte da umidade bit: 7 ~ bit 0
        temperatura_byte1 = readData(); //primeiro byte da temperatura: bit 15 ~ bit 8
        temperatura_byte2 = readData(); //segundo byte da temperatura: bit 7 ~ bit 0
        paridade_byte = readData();     //byte da paridade bit: 7 ~ bit 0

        if(timeOut){                           // If reading takes long time
            printf(lcd_putc,"\f");                       // LCD clear
            lcd_gotoxy(2, 6);                     // Go to column 5 row 1
            printf(lcd_putc, "Time out!");
        }
        else {
            if(paridade_byte == ((umidade_byte1 + umidade_byte2 + temperatura_byte1 + temperatura_byte2) & 0xFF)) {
                umidade_2byte = umidade_byte1;
                umidade_2byte = (umidade_2byte << 8) | umidade_byte2;
                temperatura_2byte = temperatura_byte1;
                temperatura_2byte = (temperatura_2byte << 8) | temperatura_byte2;

                if(temperatura_2byte > 0x8000) { //Se temperatura for maior que 1000 0000 (binario)
                    temperatura_2byte &= 0x7FFF; //Temperatura recebe 14bits, pois o bit 15 representa sinal
                    temperatura =  temperatura_2byte;
                    temperatura = ( temperatura / 10) * -1; //Corrige temperatura
                    sinal = '-';
                }
                else {
                    sinal = ' ';
                    temperatura =  temperatura_2byte;
                    temperatura = ( temperatura / 10) * -1; //Corrige temperatura
                }
                umidade = umidade_2byte;
                umidade = umidade / 10; //Corrige umidade

                lcd_gotoxy(1,5);                                                   // Define o ponto de inicio da frase L1C5                                             
                printf(lcd_putc,"Temp: %02.1f \xDFC", temperatura);                // Escreve no LCD Temperatura em Celsius     [printf(lcd_putc, "%f " "\xdf" "C", temperatura)];
                lcd_gotoxy(2,5);                                                   // Define o ponto de inicio da frase L2C5
                printf(lcd_putc,"Temp: %02.1f \xDFF", ((temperatura * 1.8) + 32)); // Escreve no LCD Temperatura em Fahrenheit
                /*lcd_gotoxy(3,5);                                                   // Define o ponto de inicio da frase L3C5
                printf(lcd_putc,"Temp: %02.1f \xDFK", temperatura + 273.15);       // Escreve no LCD Temperatura em Kelvin*/
                lcd_gotoxy(4,5);                                                   // Define o ponto de inicio da frase L4C5
                printf(lcd_putc,"Umid: %02.1f %c", umidade, 0x25);                 // Escreve no LCD Umidade em %
            }
            else {
                printf(lcd_putc, "\f");              // Limpa LCD
                lcd_gotoxy(2, 3);                    // Define o ponto de inicio da frase L2C3
                printf(lcd_putc, "Checksum Error!"); // Escreve no LCD (Erro de paridade dos dados)
            }
        }
    }
    else {
        lcd_gotoxy(2, 3);                     // Define o ponto de inicio da frase L2C3
        printf(lcd_putc, "  No response   "); // Escreve no LCD
        lcd_gotoxy(3, 3);                     // Define o ponto de inicio da frase L2C3
        printf(lcd_putc, "from the sensor");  // Escreve no LCD
    }
}

}

Mostrando 1 resultado