Ir para conteúdo
  • Cadastre-se

dúvida Projeto Termometro

Avalie este tópico:


Everton Aljonas

Posts em destaque

Boa noite pessoal, estou fazendo um projeto para conclusao de curso.

O meu problema é o seguinte:

Tenho que mostrar na tela inicial a temperatura média de 5 sensores, porém o valor fica zerado. Enquanto que nas telas onde mostra cada sensor individualmente tudo está ok.

Tenho simulado atraves do Proteus, já que ainda não tenho em mãos os componentes. Acredito que este problema possa ser do próprio Proteus, mas caso não seja, peço que me ajudem analisando o codigo que desenvolvi.

Agradeço, desde já.

 

Link da Biblioteca do LM35

Você não tem permissão para ver links. Faça login ou cadastre-se.

 

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal.h>                              //Biblioteca para o display LCD
#include <lm35.h>
// --- Mapeamento de Hardware ---
#define butUp    8                                     //Botão para selecionar proxima tela no digital 8
#define butDown  9                                     //Botão para selecionar tela anterior no digital 9

lm_t sensor1(A0);
lm_t sensor2(A1);
lm_t sensor3(A2);
lm_t sensor4(A3);
lm_t sensor5(A4);

// --- Protótipo das Funções Auxiliares ---
void changeMenu();                                      //Função para modificar o menu atual
void dispMenu();                                        //Função para mostrar o menu atual
void telaInicial();                                   //Funçao da tela inicial, temperatura media
void telaS1();                                       //Função do menu1, temperatura do sensor 1
void telaS2();                                     //Função do menu2, temperatura do sensor 2
void telaS3();                                          //Função do menu3, temperatura do sensor 3
void telaS4();                                           //Função do menu4, temperatura do sensor 4
void telaS5();                                      //Função do menu5, temperatura do Sensor 5

// --- Variáveis Globais ---
char menu = 0x01;                                       //Variável para selecionar o menu
boolean t_butUp, t_butDown;             //Flags para armazenar o estado dos botoes
float temperatura1 ; //lê valor do Sensor 1
float temperatura2 ; //lê valor do Sensor 2
float temperatura3 ; //lê valor do Sensor 3
float temperatura4 ; //lê valor do Sensor 4
float temperatura5 ; //lê valor do Sensor 5
float temperatura ;
// --- Hardware do LCD ---
LiquidCrystal disp(7,  //RS no digital 7
                   6,  //EN no digital 6
                   5,  //D4 no digital 5
                   4,  //D5 no digital 4
                   3,  //D6 no digital 3
                   2); //D7 no digital 2

// --- Configurações Iniciais ---
void setup()
{
  
  disp.begin(16,2);                                      //Inicializa LCD 16 x 2
  
  for(char i=8; i<10; i++) pinMode(i, INPUT_PULLUP);     //Entrada para os botões (digitais 8 e 9) com pull-ups internos

  t_butUp   = 0x00;                                      //limpa flag do botão Up
  t_butDown = 0x00;                                      //limpa flag do botão Down

  temperatura = (temperatura1+temperatura2+temperatura3+temperatura4+temperatura5)/5; //Temperatura Média

} //end setup


// --- Loop Infinito ---
void loop()
{
    
   
   changeMenu();
   dispMenu();

} //end loop

// --- Desenvolvimento das Funções Auxiliares ---
void changeMenu()                                       //Modifica o menu atual
{
   if(!digitalRead(butUp))   t_butUp   = 0x01;          //Botão Up pressionado? Seta flag
   if(!digitalRead(butDown)) t_butDown = 0x01;          //Botão Down pressionado? Seta flag
      
   if(digitalRead(butUp) && t_butUp)                    //Botão Up solto e flag setada?
   {                                                    //Sim...
      t_butUp = 0x00;                                   //Limpa flag
      
      disp.clear();                                     //Limpa display
      menu++;                                           //Incrementa menu
      
      if(menu > 0x06) menu = 0x01;                      //Se menu maior que 6, volta a ser 1
   
   } //end butUp
   
   if(digitalRead(butDown) && t_butDown)                //Botão Down solto e flag setada?
   {                                                    //Sim...
      t_butDown = 0x00;                                 //Limpa flag
      
      disp.clear();                                     //Limpa display
      menu--;                                           //Decrementa menu
      
      if(menu < 0x01) menu = 0x06;                      //Se menu menor que 1, volta a ser 6
   
   } //end butDown   

} //end changeMenu

void dispMenu()                                         //Mostra o menu atual
{
    switch(menu)                                        //Controle da variável menu
    {
       case 0x01:                                       //Caso 1
             telaInicial();                               //Chama a função de temperatura media
             
             break;                                     //break
       case 0x02:                                       //Caso 2
             telaS1();                             //Chama a função de temperatura do Sensor 1
             
             break;                                     //break
       case 0x03:                                       //Caso 3
             telaS2();                                  //Chama função de temperatura do Sensor 2
            
             break;                                     //break
       case 0x04:                                       //Caso 4
             telaS3();                                   //Chama função de temperatura do Sensor 3
             
             break;                                     //break
       case 0x05:                                       //Caso 5
             telaS4();                                   //Chama função de temperatura do Sensor 4
             
             break;                                     //break
       case 0x06:                                       //Caso 6
             telaS5();                                   //Chama função de temperatura do Sensor 5
             
             break;                                     //break    
    } //end switch menu

} //end dispMenu

void telaInicial()                                        //Temperatura Media (menu1)
{
  float temperatura;
  temperatura = ((temperatura1 + temperatura2 + temperatura3 + temperatura4 + temperatura 5)/5);
  disp.setCursor(2,0);
  disp.print("TEMPERATURA");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius

    

} //end telaInicial

void telaS1()                                        //Temperatura Sensor 1 (menu2)
{
 float temperatura1;
 temperatura1 = sensor1.t_celsius();
  disp.setCursor(0,0);
  disp.print("    SENSOR 1    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura1);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS2()                                        //Temperatura Sensor 2 (menu3)
{
  float temperatura2;
 temperatura2 = sensor2.t_celsius();
  disp.setCursor(0,0);
  disp.print("    SENSOR 2    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura2);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS3()                                        //Temperatura Sensor 3 (menu4)
{
  float temperatura3;
 temperatura3 = sensor3.t_celsius();
  disp.setCursor(0,0);
  disp.print("    SENSOR 3    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura3);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}   
void telaS4()                                        //Temperatura Sensor 4 (menu5)
{
 float temperatura4;
 temperatura4 = sensor4.t_celsius();
  disp.setCursor(0,0);
  disp.print("    SENSOR 4    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura4);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS5()                                        //Temperatura Sensor 5 (menu6)
{
  float temperatura5;
 temperatura5 = sensor5.t_celsius();
  disp.setCursor(0,0);
  disp.print("    SENSOR 5    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temperatura5);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}

tcc.png

Editado: por Everton Aljonas
Acrescimo de Informações
Link para o comentário
Compartilhar em outros sites

Tive que fazer algumas alterações por conta da biblioteca do LM35 e está funcionando...
Só a média que não está calculando, pois os valores Temp1, Temp2, Temp3... não foram inicializados, ou seja, não estão chegando os valores das temperaturas!!!
 

image.png

 

 

Flw...

 

 

Editado: por nagkiller
Link para o comentário
Compartilhar em outros sites

Agora vendo o esquema, faltam os resistores de pullup nos botões!!!
O ideal (na minha opinião) é sempre utilizar um resistor externo (não utilizar os resistores internos do microcontrolador).

 

Além de no código você declarar variáveis globais e locais com mesmo nome!!!

 

Flw...

Editado: por nagkiller
  • Joinha 1
Link para o comentário
Compartilhar em outros sites

@nagkiller Consegui fazer funcionar, retirei a biblioteca do LM35 e fiz tudo atraves de analogRead. Adicionei algumas variaveis, e li todos os sensores novamente para fazer o calculo de média. Sua informação de não incrementar a informação me deu a ideia, e agradeço por isso. Segue abaixo o novo codigo caso queira dar uma olhada. No circuito eletrico nao alterei nada.

 



// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal.h>                              //Biblioteca para o display LCD

// --- Mapeamento de Hardware ---
#define butUp    8                                     //Botão para selecionar proxima tela no digital 8
#define butDown  9                                     //Botão para selecionar tela anterior no digital 9

#define sensor1 A0
#define sensor2 A1
#define sensor3 A2
#define sensor4 A3
#define sensor5 A4

// --- Protótipo das Funções Auxiliares ---
void changeMenu();                                      //Função para modificar o menu atual
void dispMenu();                                        //Função para mostrar o menu atual
void telaInicial();                                   //Funçao da tela inicial, temperatura media
void telaS1();                                       //Função do menu1, temperatura do sensor 1
void telaS2();                                     //Função do menu2, temperatura do sensor 2
void telaS3();                                          //Função do menu3, temperatura do sensor 3
void telaS4();                                           //Função do menu4, temperatura do sensor 4
void telaS5();                                      //Função do menu5, temperatura do Sensor 5

// --- Variáveis Globais ---
char menu = 0x01;                                       //Variável para selecionar o menu
boolean t_butUp, t_butDown;             //Flags para armazenar o estado dos botoes
float temp1 ; //lê valor do Sensor 1
float temp2 ; //lê valor do Sensor 2
float temp3 ; //lê valor do Sensor 3
float temp4 ; //lê valor do Sensor 4
float temp5 ; //lê valor do Sensor 5
float tempM, tempMC;
float temp1c, temp2c, temp3c, temp4c, temp5c;

// --- Hardware do LCD ---
LiquidCrystal disp(7,  //RS no digital 7
                   6,  //EN no digital 6
                   5,  //D4 no digital 5
                   4,  //D5 no digital 4
                   3,  //D6 no digital 3
                   2); //D7 no digital 2

// --- Configurações Iniciais ---
void setup()
{
  
  disp.begin(16,2);                                      //Inicializa LCD 16 x 2
  
  for(char i=8; i<10; i++) pinMode(i, INPUT_PULLUP);     //Entrada para os botões (digitais 8 e 9) com pull-ups internos

  t_butUp   = 0x00;                                      //limpa flag do botão Up
  t_butDown = 0x00;                                      //limpa flag do botão Down

} //end setup


// --- Loop Infinito ---
void loop()
{
    
   
   changeMenu();
   dispMenu();

} //end loop

// --- Desenvolvimento das Funções Auxiliares ---
void changeMenu()                                       //Modifica o menu atual
{
   if(!digitalRead(butUp))   t_butUp   = 0x01;          //Botão Up pressionado? Seta flag
   if(!digitalRead(butDown)) t_butDown = 0x01;          //Botão Down pressionado? Seta flag
      
   if(digitalRead(butUp) && t_butUp)                    //Botão Up solto e flag setada?
   {                                                    //Sim...
      t_butUp = 0x00;                                   //Limpa flag
      
      disp.clear();                                     //Limpa display
      menu++;                                           //Incrementa menu
      
      if(menu > 0x06) menu = 0x01;                      //Se menu maior que 6, volta a ser 1
   
   } //end butUp
   
   if(digitalRead(butDown) && t_butDown)                //Botão Down solto e flag setada?
   {                                                    //Sim...
      t_butDown = 0x00;                                 //Limpa flag
      
      disp.clear();                                     //Limpa display
      menu--;                                           //Decrementa menu
      
      if(menu < 0x01) menu = 0x06;                      //Se menu menor que 1, volta a ser 6
   
   } //end butDown   

} //end changeMenu

void dispMenu()                                         //Mostra o menu atual
{
    switch(menu)                                        //Controle da variável menu
    {
       case 0x01:                                       //Caso 1
             telaInicial();                               //Chama a função de temperatura media
             
             break;                                     //break
       case 0x02:                                       //Caso 2
             telaS1();                             //Chama a função de temperatura do Sensor 1
             
             break;                                     //break
       case 0x03:                                       //Caso 3
             telaS2();                                  //Chama função de temperatura do Sensor 2
            
             break;                                     //break
       case 0x04:                                       //Caso 4
             telaS3();                                   //Chama função de temperatura do Sensor 3
             
             break;                                     //break
       case 0x05:                                       //Caso 5
             telaS4();                                   //Chama função de temperatura do Sensor 4
             
             break;                                     //break
       case 0x06:                                       //Caso 6
             telaS5();                                   //Chama função de temperatura do Sensor 5
             
             break;                                     //break    
    } //end switch menu

} //end dispMenu

void telaInicial()                                        //Temperatura Media (menu1)
{
  temp1 = analogRead(sensor1);
  temp2 = analogRead(sensor2);
  temp3 = analogRead(sensor3);
  temp4 = analogRead(sensor4);
  temp5 = analogRead(sensor5);
  float tempM;
  tempM = (temp1 + temp2 + temp3 + temp4 + temp5);

  float tempMC = ((tempM/5)/1024)*500;
  disp.setCursor(2,0);
  disp.print("TEMPERATURA");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(tempMC);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius

    

} //end telaInicial

void telaS1()                                        //Temperatura Sensor 1 (menu2)
{
 float temp1;
 temp1 = analogRead(sensor1);
 float temp1c = (temp1/1024)*500;
  disp.setCursor(0,0);
  disp.print("    SENSOR 1    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temp1c);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS2()                                        //Temperatura Sensor 2 (menu3)
{
  float temp2;
 temp2 = analogRead(sensor2);
 float temp2c = (temp2/1024)*500;
  disp.setCursor(0,0);
  disp.print("    SENSOR 2    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temp2c);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS3()                                        //Temperatura Sensor 3 (menu4)
{
  float temp3;
 temp3 = analogRead(sensor3);
 float temp3c = (temp3/1024)*500;
  disp.setCursor(0,0);
  disp.print("    SENSOR 3    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temp3c);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}   
void telaS4()                                        //Temperatura Sensor 4 (menu5)
{
 float temp4;
 temp4 = analogRead(sensor4);
 float temp4c = (temp4/1024)*500;
  disp.setCursor(0,0);
  disp.print("    SENSOR 4    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temp4c);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}
void telaS5()                                        //Temperatura Sensor 5 (menu6)
{
  float temp5;
 temp5 = analogRead(sensor5);
 float temp5c = (temp5/1024)*500;
  disp.setCursor(0,0);
  disp.print("    SENSOR 5    ");//mensagem na primeira linha
  disp.setCursor(4,1);
  disp.print(temp5c);//Mostra a temperatura media na segunda linha
  disp.write(B11011111);//SIMBOLO DE GRAUS
  disp.print("C"); //Celsius
}

Link para o comentário
Compartilhar em outros sites

Fiz uma versão sem a biblioteca do LM35, e com esse esquema (os pinos usados para o lcd não estão na mesma ordem que você pôs, mas é só mudar no código):

image.png

 

E o código:




	typedef unsigned char byte;

	#include <LiquidCrystal.h>

	#define botMais    8

	#define botMenos  9

	#define COMPENSACAO 1.0703



	volatile unsigned int leitura[5];

	volatile byte sensor_atual = 0;

	volatile byte menu = 0;

	volatile byte menuAnterior = 1;

	byte t_botMais, t_botMenos;



	LiquidCrystal disp(2, 3, 4, 5, 6, 7);



	void atualizaLeitura();

	void checaBotoes();



	void setup()

	{

	  ADCSRA = _BV(ADEN) | _BV(ADPS2);

	  ADMUX = _BV(REFS1) | _BV(REFS0);

	  disp.begin(16, 2);      

	  pinMode(8, INPUT_PULLUP);

	  pinMode(9, INPUT_PULLUP);

	  t_botMais   = 0;         

	  t_botMenos = 0;          

	  disp.setCursor(0, 0);

	  disp.write("Sensor  :");

	  disp.setCursor(0, 1);

	  disp.write("Media: ");

	}



	void loop()

	{

	  ADCSRA |= _BV(ADSC);

	  while(ADCSRA & _BV(ADSC));

	  leitura[sensor_atual] = ADCL | ADCH << 8;

	  sensor_atual++;

	  if (sensor_atual > 4) sensor_atual = 0;

	  ADMUX = _BV(REFS0) | _BV(REFS1) | sensor_atual;

	  checaBotoes();

	  atualizaLeitura();



	} //end loop



	

	void checaBotoes() {

	  if (!digitalRead(botMais)) t_botMais = 1;

	  if (!digitalRead(botMenos)) t_botMenos = 1;

	  if (digitalRead(botMais) && t_botMais) {

	    t_botMais = 0x00;

	    menu++;

	    if (menu > 4) menu = 0;

	  }

	  if (digitalRead(botMenos) && t_botMenos) {

	    t_botMenos = 0;

	    menu--;                

	    if (menu > 4) menu = 4;

	  } 

	}



	void atualizaLeitura() {

	  unsigned int temperatura = leitura[menu] * COMPENSACAO;

	  if (menu != menuAnterior) { 

	    disp.setCursor(7, 0);

	    disp.print(menu + 1);

	    menuAnterior = menu;

	  }

	  disp.setCursor(10, 0);

	  disp.print(temperatura / 10);

	  disp.write(".");

	  disp.print(temperatura % 10);

	  disp.write(223);

	  disp.write("C ");

	  disp.setCursor(6, 1);

	  temperatura = 0;

	  for(int aux = 0; aux < 5; aux++) {

	    temperatura += leitura[aux];

	  }

	  temperatura = temperatura / 5 * COMPENSACAO;

	  disp.setCursor(7, 1);

	  disp.print(temperatura / 10);

	  disp.write(".");

	  disp.print(temperatura % 10);

	  disp.write(223);

	  disp.write("C ");

	}





 

O método que usei, sem usar variáveis do tipo float (elas sacrificam muito a performance do AVR, pois ele não tem suporte nativo para ponto flutuante) dá uma margem de erro de 0.1 grau nos extremos da faixa de temperatura do LM35, mas acredito que isso não seja um problema.

Link para o comentário
Compartilhar em outros sites

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...