Display LCD piscando ao exibir informações - TCC de Automação Industrial

Olá, comunidade Lab de Garagem. 

Bom... vou tentar explicar a problemática pela qual estou passando com o desenvolvimento do meu projeto e espero que vocês possam me ajudar. 

Desenvolvi uma placa controladora para um sistema de captação e reaproveitamento de aguá de chuva para fins não potáveis em residências. A confecção do hardware está ok, tudo conferido e funcionando corretamente. 

Estou trabalhando com dois sensores ultrassônicos HC-SR04, usados para medir o nível de água nos reservatório, variando entre 0 e 100%. e de acordo com os níveis lidos irei acionar uma bomba ou então uma válvula solenoide. O microcontrolador utilizado na placa é um ATmega328P ( o mesmo da plataforma Arduino UNO). 

A lógica de programação foi desenvolvida e um êxito na rodagem de testes, no entanto os dados enviados ao display ficam sempre piscando. Eu gostaria de saber o porquê.

Logo abaixo vou deixar algumas fotos para que todos possam ter uma noção mais clara ao que estou me referindo. 

Abraço e conto com a colaboração de todos. 

CÓDIGO:

#include <LiquidCrystal.h>                        //Biblioteca do display.

#include <LinkedList.h>                            //

#include <Gaussian.h>                             //Bibliotecas para cálculo da média móvel.

#include <GaussianAverage.h>                 //

#include <Ultrasonic.h>                           //Biblioteca dos sensores ultrassônicos.  

 

#define trigger1 6              //Trigger do US1 no pino 6.

#define echo1    5             //Trigger do US1 no pino 5.

#define trigger2 4              //Trigger do US2 no pino 4.

#define echo2    3             //Trigger do US2 no pino 3.

 

#define pulsoSOLENOIDE A4          //Botão da solenóde no pino A4.

#define pulsoBOMBA     A5             //Botão da bomba no pino A5.

#define AUTO_MANU       0            //Bot. para sel. do modo de trabalho no pino 0.

#define SOLENOIDE       1             //Saída para acionamento da solenóide no pino 1.

#define BOMBA           2                //Saída para acionamento da bomba no pino 2.

 

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);              //Pinos de comu com o display.

GaussianAverage myMovingAverage1(10);

GaussianAverage myMovingAverage2(10);         

Ultrasonic ultrasonic1(trigger1, echo1);          //Pinos trigger e echo do US1.

Ultrasonic ultrasonic2(trigger2, echo2);          //Pinos trigger e echo do US2.

 

float caixadagua =   28.5;                //Caixa d'água com 28,5cm.

float reservatorio = 28.5;                 //Reservatório com 28,5cm.

int porcentagem1, nivel1, US1;       //Variáveis do tipo inteira.

int porcentagem2, nivel2, US2, estadoNivel, setLCD, estadoSolen;    

//=========================================================================

 

void setup(){                                      //Inícialização do programa.

  

  lcd.begin(20,4);                                //Define o display com 20 colunas e quatro linhas.

  

  pinMode(pulsoBOMBA,INPUT_PULLUP)           //Entrada com pullup interno.

  pinMode(pulsoSOLENOIDE,INPUT_PULLUP);   //Entrada com pullup interno.

  pinMode(AUTO_MANU,INPUT_PULLUP);         //Entrada com pullup interno.

  pinMode(SOLENOIDE,OUTPUT);                     //Saída digital.

  pinMode(BOMBA,OUTPUT);                            //Saída digital.

 

  digitalWrite(SOLENOIDE,LOW);             //Inicia com a solenóide desligada.

  digitalWrite(BOMBA,LOW);                    //Inicia com a bomba desligada.

  

  estadoNivel = 0;                                   //Atribui valor zero a variável estadoNivel.

  estadoSolen = 0;                                  //Atribui valor zero a variável estadoSolen.

}                            //Fim setup.

 

//=========================================================================

void loop(){                                              //Loop do programa.

  

   if(digitalRead(AUTO_MANU) == LOW){    //Cond. que habilita o modo manual.

     

     float cmMsec1;                                                                                      

     long microsec1 = ultrasonic1.timing();

     cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);  

     porcentagem1 = (((cmMsec1-6.5)*100)/reservatorio);

     nivel1 = (100-porcentagem1);   

     myMovingAverage1 += nivel1;

     myMovingAverage1.process();

     US1 = myMovingAverage1.mean;            //Lógica responsável pela leitura do US1.

     if(US1 > 100){

       US1 = 100;

     }

     if(US1 < 0){

       US1 = 0;

     }                                                           

     

     float cmMsec2;                                              

     long microsec2 = ultrasonic2.timing();

     cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);  

     porcentagem2 = ((cmMsec2-12)*100)/caixadagua; 

     nivel2 = (100-porcentagem2);  

     myMovingAverage2 += nivel2;

     myMovingAverage2.process();

     US2 = myMovingAverage2.mean;             //Lógica responsável pela leitura do US2. 

     if(US2 > 100){

       US2 = 100;

     }

     if(US2 < 0){

       US2 = 0;

     }                                

     

     lcd.clear();                                  //limpa a tela do display.

     lcd.setCursor(4,0);

     lcd.print("MODO MANUAL");       //Imprime na coluna quatro, linha zero.

     lcd.setCursor(0,1);

     lcd.print("RESERVATORIO = ");  //Imprime na coluna zero linha um.

     lcd.setCursor(15,1);

     lcd.print(US1);                            //Impr. US1 na coluna quinze, linha um.

     lcd.setCursor(18,1);

     lcd.print("%");                             //Impr. % na coluna dezoito, linha um.                                                      

     lcd.setCursor(0,2);

     lcd.print("CAIXA D'AGUA = ");    //Imprime na coluna zero, linha dois.

     lcd.setCursor(15,2);

     lcd.print(US2);                           //Impr. US2 na coluna , linha dois.

     lcd.setCursor(18,2);

     lcd.print("%");                           //Impr. % na coluna dezoito,linha dois.

     

     if(digitalRead(pulsoSOLENOIDE) == LOW){

         digitalWrite(SOLENOIDE, HIGH);              //Aciona a solenóide.

         lcd.setCursor(0,3);

         lcd.print("SOLEN=ON");                           //Imprime ON na coluna zero, linha 3.

         }

     else{                                                        

         digitalWrite(SOLENOIDE, LOW);             //Desaciona a solenóide.

         lcd.setCursor(0,3);

         lcd.print("SOLEN=OFF");                        //Impr OFF na coluna zero, linha três.

         }

     

     

     if(digitalRead(pulsoBOMBA) == LOW){

         digitalWrite(BOMBA, HIGH);                     //Aciona a bomba.

         lcd.setCursor(10,3);                  

         lcd.print("BOMBA=ON");                          //Imprime ON na coluna dez, linha três.

         }                    

     else{                                                       

         digitalWrite(BOMBA, LOW);                      //Desaciona a bomba.                   

         lcd.setCursor(10,3);                  

         lcd.print("BOMBA=OFF");   //Imprime OFF na coluna dez, linha três.

     }

   }                                                                   //Fim manual.

 

//========================================================================

 

   if(digitalRead(AUTO_MANU) == HIGH){                         //Cond. que habilita o modo automát.

     

     float cmMsec1;                                              

     long microsec1 = ultrasonic1.timing();

     cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);  

     porcentagem1 = (((cmMsec1-6.5)*100)/reservatorio);

     nivel1 = (100-porcentagem1);   

     myMovingAverage1 += nivel1;

     myMovingAverage1.process();

     US1 = myMovingAverage1.mean;                              //Lógica responsável pela leitura do US1.  

     if(US1 > 100){

       US1 = 100;

     }

     if(US1 < 0){

       US1 = 0;

     } 

                                                                

     float cmMsec2;                                              

     long microsec2 = ultrasonic2.timing();

     cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);  

     porcentagem2 = ((cmMsec2-12)*100)/caixadagua; 

     nivel2 = (100-porcentagem2);  

     myMovingAverage2 += nivel2;

     myMovingAverage2.process();

     US2 = myMovingAverage2.mean;   //Lógica responsável pela leitura do US2.                              

     if(US2 > 100){

       US2 = 100;

     }

     if(US2 < 0){

       US2 = 0;

     }                                                            

     

     lcd.clear();                                       //limpa a tela do display

     lcd.setCursor(2,0);

     lcd.print("MODO AUTOMATICO");     //Imprimme na coluna dois, linha zero.

     lcd.setCursor(0,1);

     lcd.print("RESERVATORIO = ");        //Imprime na coluna zero, linha um.

     lcd.setCursor(15,1);

     lcd.print(US1);                                 //Imp. US1 na coluna quinze, linha um.

     lcd.setCursor(18,1);

     lcd.print("%");                                  //Impr. % na coluna dezoito, linha um.                                                     

     lcd.setCursor(0,2);

     lcd.print("CAIXA D'AGUA = ");           //Imprime na coluna zero, linha dois.

     lcd.setCursor(15,2);

     lcd.print(US2);                                  //Imp. US2 coluna quinze, linha dois.

     lcd.setCursor(18,2);

     lcd.print("%");                                   //Impri. % coluna dezoito, linha dois.

     

     switch(estadoNivel){                         //Switch responsável pelo controle da bomba.

          case 0:

               estadoNivel = 1;                            //Atribui valor um à variável estadoNivel.

               if((US2 < 20) && (US1 >10)){          //Se US2>20% e US1>10%.

                   digitalWrite(BOMBA, HIGH);       //Aciona a bomba.                          

               }               

          break;         

          case 1:

               estadoNivel = 2;                            //Atribui valor dois a var. estadoNivel.

               if(US2 > 90){                                 //Habilita se US2>90%.

                   digitalWrite(BOMBA, LOW);       //Desaciona a bomba.

                   setLCD = 0;   

               }        

          break;         

          case 2:

               estadoNivel = 0;                          //Atribui valor zero à var. estadoNivel.

               if(US1 < 10){                               //Habilita se US1<10%.

                   digitalWrite(BOMBA, LOW);     //Desaciona a bomba.

                   setLCD = 0; 

               }        

          break;                

     }

     

     if (digitalRead(BOMBA) == LOW){                   //Se a bomba estiver desligada.

           lcd.setCursor(10,3);                                    

           lcd.print("BOMBA=OFF");                        //Imprime na coluna zero, linha três.

     }

     else{

         lcd.setCursor(10,3);                                    

         lcd.print("BOMBA=ON");                           //Imprime na coluna dez, linha três.

     }                 

           

     

     switch(estadoSolen){                                   //Switch responsável pelo controle da solenóide.

           case 0:

                                                                      //Atribui valor um a var. estadoSolen.

           if((US2 <20) && (US1 < 10)){                 //Se US2> 20% e US1<20%.

                 digitalWrite(SOLENOIDE, HIGH);    //Aciona solenóide.

           }

           break;           

           case 1:

           estadoSolen = 0;        //Atribui valor zero a var. estadoSolen.

           if(US2 > 90){                           //Se US2>90%.

                digitalWrite(SOLENOIDE, LOW);      //Desaciona a solenóide.

           }

           break;

     }

     

      if (digitalRead(SOLENOIDE) == LOW){             //Se a sol. estiver desligada.

           lcd.setCursor(0,3);                                       

           lcd.print("SOLEN=OFF");                           //Imprime na coluna zero, linha três.

       }

       else{

           lcd.setCursor(0,3);                                    

           lcd.print("SOLEN=ON");                            //Imprime na coluna zero, linha três.

       }

   }

   delay(500);

  }                                                                      //Fim loop.

Exibições: 1804

Anexos

As respostas para este tópico estão encerradas.

Respostas a este tópico

Oi JCS, boa tarde.

PFNCCNADTDT

Se quiser saber o que significa, vá em :

 http://labdegaragem.com/forum/topics/por-favor-n-o-cole-code-na-are...

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço