Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

Projeto 16: Termômetro Digital via I2C

Share:

Termômetro Digital via I2C




Este outro projeto é um termômetro digital utilizando o PIC16F877A. A temperatura é medida pelo componente TC74-A5 que envia ao microcontrolador a informação via comunicação I2C. O MCU recebe a informação e mostra-o no display de 7 segmentos anodo comum.

O clock utilizado é de 8MHz.

DOWNLOAD:
Arquivo de Simulação: Termometro-digital-i2c.DSN

CÓDIGO-FONTE:
int temp;

//Numero de 0 a 9, +, -
char number[12]={ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 
                  0x82, 0xF8, 0x80, 0x90, 0xFF, 0xBF};
char res1, res2, res3, sinal;

void programa_i2c()
{
 i2c1_Init(100000); //Inicializa o modulo
 i2c1_start();
 i2c1_Wr(0b10011010);
 i2c1_Wr(0);
 i2c1_wr(0x00);
 i2c1_Stop();
}

void leitura_i2c()
{
 i2c1_start(); //envia sinal de Start no barramento
 i2c1_wr(0b10011010); //Seleciona o dispositivo + escrita
 i2c1_wr(0x00); //Selecione o endereço do registro pra leitura
 i2c1_Repeated_start(); //envia sinal de start no barramento
 i2c1_wr(0b10011011); //Seleciona o dispositivo + leitura
 temp = i2c1_rd(0); //leitura
 i2c1_stop(); //Envia o sinal de stop no barramento
}

void main()
{
  TRISB=0;
  PORTB=0;
  TRISD=0;
  PORTD=0;
  programa_i2c();
 
 while(1)
 {
 
    leitura_i2c();
    
    //temperatura positiva
    if( temp < 131 && temp >= 0 )
    {
          res1 = temp / 100;
          res2 = (temp % 100) / 10;
          res3 = (temp % 100) % 10;
          sinal=10;
    }
    //temperatura negativa
    else
    {
          temp = (~temp & 0xFF) + 1;
          res1 = temp / 100;
          res2 = (temp % 100) / 10;
          res3 = (temp % 100) % 10;
          sinal=11;
     }    
     
     //escreve nos displays 7 segmentos
     PORTD=0b00000001; //seleciona display 1
     PORTB=number[signal];
     
     Delay_ms(1);
     PORTD=0b00000010;//seleciona display 2
     PORTB=number[res1];
     
     Delay_ms(1);
     PORTD=0b00000100;//seleciona display 3
     PORTB = number[res2];
     
     Delay_ms(1);
     PORTD=0b00001000;//seleciona display 4
     PORTB=number[res3];
     
     ///

     Delay_ms(30);
 }
}

10 comentários:

  1. Respostas
    1. Blz! Para esse projeto, como todos os outros deste blog eu utilizei o compilador MikroC PRO PIC.

      Excluir
  2. ola, gostaria de saber qual a função do instrumento I2C debugger no circuito, pois eu observei q meu programa não simula se ele não estiver inserido.
    obrigado.

    ResponderExcluir
    Respostas
    1. Ola! o I2C Debugger monitora os dados no barramento, e é necessario coloca-lo pra poder fazer a comunicacao do MCU com algum periferico.

      Excluir
  3. Estou começando com PIC e esse blog foi realmente um achado. Gostaria de uma dica como faço para usar mais de um dispositivo no barramento i2c.

    ResponderExcluir
  4. Baixei o código mas quando abri se trata de um relógio digital com display LCD e não termõmetro. Teria como corrigir. Obrigado

    ResponderExcluir
  5. tem como adaptar pra mostrar num LCD ? qual a modificacao?

    ResponderExcluir