LCD, Menu and Buttons


guys, i'm developing project filling machine there mat , pump , sensor , keypad , buttons , using arduino mega

- main question in regards lcd menu want on first screen after being triggered " bverde " button message hostname , passing 1 second show amount bottled . amount value entered in keypad ;

- after value entered keypad second screen shown , screen told amount of bottled , pressing " bamarelo " changes screen third screen show level of storage tank , pressing " bamarelo " again goes second screen , ie " bamarelo " act options button moves between these 2 screens ;

- using decrementador want same decrement value entered in first screen showing message lot ready , entering new value ;

- third button " bvermelho " emergency button pressed ie machine hangs.

- whole program based on examples , projects found here on forum , other sites .
follows program :

code: [select]


#include <keypad.h>
#include <liquidcrystal.h>  
liquidcrystal lcd(22,23,24,25,26,27);  // declaraÇÃo dos pinos lcd no arduino

// definiÇÃo dos botÕes - verde. vermelho, amarelo
#define bverde    a1  // os pinos analógicos podem ser
#define bamarelo  a2  // usados como digitais, bastando
#define bvermelho      a3  // referenciá-los por a0, a1..
#define bdown    a4

#define bverde0   90  // valor de referência que a
#define bamarelo0 91  // função checkbutton() passa
#define bvermelho0     92  // indicando que um botão foi
#define bdown0   93  // solto

boolean averde, aamarelo, avermelho, adown;  // grava o ultimo valor lidos nos botões.
// utilizado pela função checkbutton p/ identificar quando há uma alteração no estado pino dos botões

// definiÇÃo dos pinos e valores para o sensor, esteira e bomba
int contador = 0;  
int sensor = 0;  
int sensorpin = a0;  
int motoresteira =  11;
int motorbomb= 12;
int estadomotor=0;
int estadosensor=1;
int led1=8;
int led2=9;
int led3=10;
int led4=2;
int buzzer=7;
int variavel;  // variavel ser alterada pelo menu
char state=1;  // variÁvel que guarda posiÇÃo atual menu
int dec=-1;
int i=0;

const byte lin = 4; // teclado possui 4 linhas
const byte col = 3; //teclado possui 3 colunas
char keys[lin][col] = {
 {//matriz correspondente aos caracteres keypad  
   '1','2','3'                                                                                                            }
 ,    
 {
   '4','5','6'                                                                                                            }
 ,
 {
   '7','8','9'                                                                                                            }
 ,
 {
   '*','0','#'                                                                                                            }
};
byte linpins[lin] = {
 28,29,30,31}; //pinos arduino correspondentes colunas
byte colpins[col] = {
 32,33,34};    //e linhas da matriz

keypad keypad = keypad( makekeymap(keys), linpins, colpins, lin, col );
char key = keypad.getkey();

void setup()
{
 lcd.begin(16, 2);  // iniciando biblioteca lcd
 serial.begin(9600); // definiÇÃo da porta serial

 pinmode(bverde,  input);   // botões
 pinmode(bamarelo,input);
 pinmode(bvermelho,    input);
 pinmode(bdown,  input);

 digitalwrite(bverde,  high);  // aciona o pull-up interno
 digitalwrite(bamarelo,high);  // dos botões
 digitalwrite(bvermelho,    high);
 digitalwrite(bdown,  high);

 pinmode(sensorpin, input);           //definir se variavel É entrada(imput) ou saida(output) de dados
 pinmode(motoresteira, output);    
 pinmode(motorbomb, output);
 pinmode(estadosensor, input);
 pinmode(led1, output);
 pinmode(led2, output);
 pinmode(led3, output);
 pinmode(led4, output);
 pinmode(buzzer, output);
}

void esteira(){
 sensor = digitalread(sensorpin); // variavel sensor corresponde ao sensorpin que estÁ ligado porta analÓgica a0 arduin

 if(sensor == low){                      
   digitalwrite(motoresteira, high);   // se o sensor nÃo estiver acionado o motor da bomba esta parado e o led1  asceso
   digitalwrite(led1,high);          
   digitalwrite(led2, low);
   digitalwrite(motorbomb, low);
   digitalwrite(buzzer, low);
 }
 if(sensor == high) {                // se o sensor  estiver acionado o motor da esteira esta parado e o  led1  apaga
   digitalwrite(motoresteira, low); //  o motor da bomba liga e o led2 ascende e um toque de 2 segundo É
   digitalwrite(motorbomb, high);  //  acionado pelo buzzer
   digitalwrite(led1, low);
   digitalwrite(led2, high);
   delay(8000);//este delay serve para bomba jogar 200ml de agua na garrafa
   contador++;
   sensor == !sensor;    //o sinal sensor É invertido para funÇao retornar de onde estava
 }
 estadosensor = digitalread(sensorpin);  // o sinal sensor É mostrado no serial monitor
 serial.println(sensor);

 if(estadosensor == high){            // funÇao retorna ao estado inicial
   digitalwrite(motoresteira, high);
   digitalwrite(motorbomb, low);
   digitalwrite(led1, high);
   digitalwrite(led2, low);
   digitalwrite(buzzer,low);
   delay(2000);
 }
}

void loop()
{

 esteira();

 switch (state) {  // define checa qual tela atual

 case 1:          // executado quando na tela 1
   switch (checkbutton()) {

   case bverde:
     lcd.setcursor(0,0);
     lcd.print("maquina envase");
     delay(1000);
     lcd.setcursor(0,0);    
     lcd.print("quantidade lote:");


     set_state(1);
     break;
   case bamarelo:
     lcd.clear();
     set_state(2); // antes de mudar de tela, é necessário limpar o
     break;
     lcd.clear();
     set_state(3);        // display com função lcd.clear()
     // break;
   default:   // caso nenhum botão tenha sido apertado, ela executa set_state
     set_state(1); // mesmo assim para atualizar o display.
   }
   break;

 case 2:          // executado quando na tela 2
   switch (checkbutton()) {
   case bverde:  
     lcd.clear();
     set_state(1);
     break;
   case bamarelo:  //
     lcd.clear();
     set_state(3);
     break;
     lcd.clear();
     set_state(1);
     break;
     lcd.clear();
     set_state(2);
     break;
   default:
     set_state(2);
   }
   break;

 case 3:          // executado quando na tela 3
   switch (checkbutton()) {
   case bverde:  
     lcd.clear();
     set_state(1);
   case bamarelo:
     lcd.clear();
     set_state(2);
     break;
     lcd.clear();
     set_state(3);
     break;
     lcd.clear();
     set_state(1);
     break;
   default:
     set_state(3);
   }
   break;

 case 4:          // executado quando na tela 4
   switch (checkbutton()) {
   case bamarelo:
     lcd.clear();
     set_state(1);
     break;
   default:
     set_state(1);
   }
   break;

 default:
   ;
 }
}// fim loop

char checkbutton() {                                              
 if (averde!=digitalread(bverde)) {    
   averde=!averde;                    
   if (averde) return bverde0;      
   else return bverde;
 }
 else
   if (aamarelo!=digitalread(bamarelo)) {
     aamarelo=!aamarelo;
     if (aamarelo) return bamarelo0;
     else return bamarelo;
   }
   else
     if (avermelho!=digitalread(bvermelho)) {
       avermelho=!avermelho;
       if (avermelho) return bvermelho0;
       else return bvermelho;
     }
     else
       if (adown!=digitalread(bdown)) {
         adown=!adown;
         if (adown) return bdown0;
         else return bdown;
       }
       else
         return 0;
}


void producao() // funÇÃo que define quantidade de garrafas serem envasadas no dia
{
 char key = keypad.getkey();
 if (key != no_key){

   lcd.setcursor(i,2);
   lcd.print(key);    
   lcd.print(" garrafas");
   i++;
 }
}

void set_state(char index) {
 state = index;  // atualiza variável state para nova tela
 switch (state) {  // verifica qual tela atual e exibe o conteúdo correspondente

   case 1: //==================== state 1

     producao();

   break;
 case 2: //==================== state 2

     lcd.setcursor(0,0);
   lcd.print("qnt. envasada:");
   lcd.setcursor(0,1);
   lcd.print(contador);  // mostra os segundos na tela
   lcd.print(" garrafas");
   delay(20);
   break;
 case 3: //==================== state 3

     lcd.setcursor(0,0);
   lcd.print("nivel tanque");
   lcd.setcursor(1,2);
   lcd.print("%");
   break;
 case 4: //==================== state 4

     break;
 default:
   ;
 }
}

please re-attach code using code # button not quote button.


Arduino Forum > Using Arduino > Programming Questions > LCD, Menu and Buttons


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support