PRÁTICA 6 – SENSOR DE TEMPERATURA E UMIDADE
Objetivos:
- Aprender a usar o sensor de umidade e temperatura RHT03.
- Colocar a temperatura no display de LCD HD44780
Introdução:
Sensores de temperatura integrados como o RHT03, são bastante práticos por serem de pequeno tamanho e baixo consumo. Eles possuem a pinagem abaixo, onde o pino 3 (em branco) não é usado:
O pino 1 deve ser alimentado com 5V, o pino 2 é para transmissão da informação de temperatura e umidade e o pino 4 é o GND.
O sensor RHT03 envia 40 bits de dados, 16 bits de umidade relativa do ar, 16 bits de temperatura e 8 bits de checksum. O checksum é a soma de todos das parcelas de 8 em 8 bits.
Por exemplo, se o RHT enviar os seguintes dados -> 0000 0010 1000 1100 0000 0001 0101 1111 1110 1110:
A umidade relativa do ar será RH= (0000 0010 1000 1100)/10=65.2%
A temperatura será T=(0000 0001 0101 1111)/10=35.1°C
O checkSum poderá ser verificado para que não haja nenhum erro: checkSum = (0000 0010)+(1000 1100)+(0000 0001)+(0101 1111)=1110 1110
O RHT03 envia ZERO e UM para o PIC em um formato de largura de pulso. Depois de enviar um pulso alto de 50µs, o pulso baixo de 26 a 28µs significa o envio de ZERO lógico e um pulso baixo de 70µs significa UM lógico. Há necessidade do microprocessador enviar um pulso low inicial de 1ms para que o RHT03 inicie a transmissão de dados.
Tarefa:
- Compilar o programa 1 (abaixo) em C usando o MikroC e gerar o arquivo HEX.
- Enviar o arquivo HEX para o pic usando o pickit2.
- Montar o circuito e verificar o funcionamento.
- Configurações para o projeto (em project -> edit project)
- OSCILLATOR SELECTION: INTOSC
- MASTER CLEAR: DISABLE
- POWER-UP TIMER: ENABLE
- Todas as outras opções: DISABLE
Programa 1 – Semáforo (PROGRAMA CORRIGIDO EM 24/10/2019)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
//Configura os pinos do PIC para utilizar a biblioteca do LCD HD44780 sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; char message1[] = "Temp = 00.0 C"; char message2[] = "Hum = 00.0 %"; unsigned short T_high, T_low, RH_high, RH_low; int temp, hum; void StartSignal(){ TRISA.RA0 = 0; // Agora output PORTA.RA0 = 0; Delay_ms(18); PORTA.RA0 = 1; Delay_us(30); TRISA.RA0 = 1; // Agora input } unsigned short ReadByte(){ unsigned short i; unsigned short num = 0; for (i=0; i<8; i++){ while(PORTA.RA0 == 0) { } //Ficar aqui até que seja 1 delay_us(40); if (PORTA.RA0 == 1) { num |= 1<<(7-i); // Se ainda é 1 depois de 35uS, é porque o dado é 1 (Esta Linha gasta +-20us) delay_us(10); } } return num; } void main() { TRISA = 0x00; TRISB = 0x00; CMCON = 0x07; Lcd_Init(); //Inicializa o LCD com a configuração indicada Lcd_Cmd(_LCD_CLEAR); //Limpa a tela do LCD Lcd_Cmd(_LCD_CURSOR_OFF); //Desabilita o cursor while(1) { // Loop infinito StartSignal(); delay_us(160); RH_high = ReadByte(); RH_low = ReadByte(); T_high = ReadByte(); T_low = ReadByte(); //Temp e Hum são 16 bits, por isso o byte mais significativo multiplica por 256. temp = (T_high*256 + T_low); hum = (RH_high*256 + RH_low); //Exemplo: Temp = 321 (o que dá 32,1C) // O primeiro caractere é temp/100 (3) // Depois temp = resto de temp/100 = 21 // O segundo caractere é temp/10 (2) // O próximo caractere é resto de temp/10 (1) message1[7] = temp/100 + 48; temp = temp%100; message1[8] = temp/10 + 48; message1[10] = temp%10 + 48; message2[7] = hum/100 + 48; hum = hum%100; message2[8] = hum/10 + 48; message2[10] = hum%10 + 48; message1[11] = 223; // Degree symbol Lcd_Cmd(_Lcd_Clear); Lcd_Out(1, 1, message1); Lcd_Out(2, 1, message2); delay_ms(2000); } } |
Circuito 1 – Sensor RHT03 e LCD: