Ir ao conteúdo

Posts recomendados

  • Membro VIP
Postado

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() na função main(). Esse é o código do PIC:


#define DATA PIN_A1
unsigned char umidade_byte1, umidade_byte2, temperatura_byte1, temperatura_byte2, paridade_byte;
unsigned long temperatura_2byte, umidade_2byte, timeOut;
float temperatura = 0, umidade = 0;

/*********************** 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 char checkResponse() {
delay_us(40);
if(!input(DATA)) delay_us(80);
if(input(DATA)) {
delay_us(40);
return 1;
}
return 0;
}

//Função para ler os dados do sensor DHT22
unsigned char readData() {
unsigned char 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){ // Se leitura passar de 100us
printf(lcd_putc,"\f"); // Limpa LCD
lcd_gotoxy(2, 6); // Define o ponto de inicio da frase L2C6
printf(lcd_putc, "Time out!"); // Escreve no LCD
}
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 0000 0000 (binario)
temperatura_2byte &= 0x7FFF; // Temperatura recebe 14bits, pois o bit 15 representa sinal
temperatura = temperatura_2byte;
temperatura = ( temperatura / 10) * -1; // Corrige temperatura
}
else {
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
}
}
}

  • Membro VIP
Postado

Leia o d.s. do DHT22 e veja se o algoritimo está correto. Também pode haver no mesmo d.s., algum exemplo de programa

  • Membro VIP
Postado
Em 09/05/2017 às 09:04, Isadora Ferraz disse:

Leia o d.s. do DHT22 e veja se o algoritimo está correto. Também pode haver no mesmo d.s., algum exemplo de programa


Bom dia,
Eu decorei o Datasheet do DHT22, não há nenhum algoritmo nele, mas todos os que eu vi na internet seguem esse mesmo padrão.
Coloquei um Cristal de 20MHz e agora está funcionando. Tive que usar Float para guardar os bytes e mostrar no LCD. Memoria do PIC está 100% ocupada.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!