|
| 1 | + //////////////////////////////////////////////////////////////////////////////// |
| 2 | +// Fun??o para ler as informa??es de temperatura e umidade no sensor DHT11 // |
| 3 | + //////////////////////////////////////////////////////////////////////////////// |
| 4 | + |
| 5 | +#define dht11_dir trisB.f1 //bit de configuração da direção I/O da porta de comunicação com o sensor DHT11 |
| 6 | +#define dht11dado portB.f1 //porta de comunicação com o sensor DHT11 |
| 7 | + |
| 8 | +//variáveis usadas na leitura do sensor de umidade e temperatura DHT11 |
| 9 | +unsigned short int temperatura1; |
| 10 | +unsigned short int temperatura2; |
| 11 | +unsigned short int umidade1; |
| 12 | +unsigned short int umidade2; |
| 13 | +unsigned short int checksum; |
| 14 | + |
| 15 | +void Inicia_ambiente(){ |
| 16 | + ANSELB.f1 = 0; //configura o pino de comunicação com o módulo DHT11 como digital |
| 17 | + dht11_dir = 0; //define porta como saída |
| 18 | + dht11dado = 1; //envia 1 na porta de saída |
| 19 | +} |
| 20 | + |
| 21 | +void dht11_read(){ |
| 22 | + int count; |
| 23 | + INTCON.GIE = 0; //desliga chave geral das interrupções |
| 24 | + temperatura1=0; //zera variáveis antes da comunicação |
| 25 | + temperatura2=0; //zera variáveis antes da comunicação |
| 26 | + umidade1=0; //zera variáveis antes da comunicação |
| 27 | + umidade2=0; //zera variáveis antes da comunicação |
| 28 | + checksum=0; //zera variáveis antes da comunicação |
| 29 | +//inicia comunicação requisitando o envio dos dados |
| 30 | + dht11_dir = 0; //define como saída |
| 31 | + dht11dado = 0; //envia 0 |
| 32 | + delay_ms(20); //por 20 milisegundos |
| 33 | + dht11dado = 1; //envia 1 |
| 34 | + delay_us(42); //por 42 microsegundos |
| 35 | + dht11_dir = 1; //define como entrada |
| 36 | + while(dht11dado); //aguarda inicio do recebimento dos dados |
| 37 | +//recebe resposta |
| 38 | + while(!dht11dado); //recebe 0 (zero) |
| 39 | + while(dht11dado); //recebe 1 (um) |
| 40 | +//inicia recepção dos dados |
| 41 | + while(!dht11dado); //recebe 0 (zero) |
| 42 | + for(count=1; count<=8; count++){ //recebe a 1ª parte do valor da umidade |
| 43 | + delay_us(40); |
| 44 | + if(dht11dado){umidade1++ ; while(dht11dado);} |
| 45 | + umidade1<<=1; |
| 46 | + while(!dht11dado); |
| 47 | + } |
| 48 | + for(count=1; count<=8; count++){ //recebe a 2ª parte do valor da umidade |
| 49 | + delay_us(40); |
| 50 | + if(dht11dado){umidade2++ ; while(dht11dado);} |
| 51 | + umidade2<<=1; |
| 52 | + while(!dht11dado); |
| 53 | + } |
| 54 | + for(count=1; count<=8; count++){ //recebe a 1ª parte do valor da temperatura |
| 55 | + delay_us(40); |
| 56 | + if(dht11dado){temperatura1++ ; while(dht11dado);} |
| 57 | + temperatura1<<=1; |
| 58 | + while(!dht11dado); |
| 59 | + } |
| 60 | + for(count=1; count<=8; count++){ //recebe a 2ª parte do valor da temperatura |
| 61 | + delay_us(40); |
| 62 | + if(dht11dado){temperatura2++ ; while(dht11dado);} |
| 63 | + temperatura2<<=1; |
| 64 | + while(!dht11dado); |
| 65 | + } |
| 66 | + for(count=1; count<=8; count++){ //recebe o checksum para confirmar se a mensagens foi recebida corretamente |
| 67 | + delay_us(40); |
| 68 | + if(dht11dado){checksum++ ; while(dht11dado);} |
| 69 | + checksum<<=1; |
| 70 | + while(!dht11dado); |
| 71 | + } |
| 72 | + umidade1>>=1; |
| 73 | + temperatura1>>=1; |
| 74 | + checksum>>=1; |
| 75 | + if(checksum==temperatura1+temperatura2+umidade1+umidade2){ //se o checksum estiver correto |
| 76 | + |
| 77 | + } |
| 78 | + INTCON.GIE = 1; //religa chave geral das interrupções |
| 79 | +} |
| 80 | + |
0 commit comments