Ir para conteúdo
View in the app

A better way to browse. Learn more.

EletrônicaBR.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Navegação Limpa e Sem Anúncios! (Cadastre-se)

O melhor fórum técnico do mundo está de cara nova e de portas abertas! Estamos de cara nova e com ferramentas ainda mais poderosas para a sua bancada. Faça o seu cadastro de forma rápida e simples para acessar o maior e mais atualizado acervo de Esquemas Elétricos, BIOS e Firmwares da internet.

Aqui, o conhecimento vale muito: através do nosso sistema de créditos, membros participativos ganham acesso totalmente gratuito aos downloads. Venha trocar experiências com os melhores especialistas do mercado!

👉 Técnico sem o EletrônicaBR não é um técnico completo!

 

Featured Replies

Postado

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 visualizar 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

Postado

Poste o esquema do hardware também!!!

 

Nem sempre o problema pode ser o firmware!!!

 

Por haver bibliotecas de terceiros, informar também o git ou nomes do autores das bibliotecas!!!


Flw...

Editado: por nagkiller

Postado

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

Postado

Não vi nenhuma nova informação antes de postar o meu tópico. Por isso tive que fazer algumas modificações para que funcionasse.

Flw...

Editado: por nagkiller

Postado

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

Postado
  • Autor

@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
}

Postado

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.

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

Account

Navigation

Pesquisar

Pesquisar

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.