Pessoal, estou desenvolvendo um projeto de uma máquina de envase onde há uma esteira, uma bomba, sensor, keypad e botões e utilizando um Arduino Mega. Ele vai funcionar desta maneira:

- Minha principal dúvida é em relação ao menu do LCD onde pretendo ter na primeira tela após ser acionado por um botão "bverde" uma mensagem com o nome da máquina passando então 1 segundo irá mostrar a quantidade a ser envasada. A quantidade será o valor digitado no Keypad;

- Após o valor ser digitado pelo keypad uma segunda tela é mostrada, nessa tela será contada a quantidade de envasada e pressionando o "bamarelo" muda a tela para a terceira tela onde irá mostrar o nível do tanque de armazenamento, pressionando o "bamarelo" novamente ele volta para a segunda tela, ou seja o "bamarelo" irá funcionar como um botão de opões que transita entre essas duas telas;

- Usando um decrementador quero que o mesmo decremente o valor digitado na tela 1 mostrando a mensagem de que o Lote esta pronto e que se deve inserir um novo valor;

- Um terceiro botão "bvermelho" seria o botão de emergência, ou seja se pressionado a máquina trava.

- Todo esse programa foi baseado em exemplos e projetos que encontrei aqui no fórum e em outros sites.

Como devo organizar os botões para agirem desta maneira ? Pois eles estão executando as ações que defini mais não da maneira que descrevi acima.


Segue o Programa:

//========================================================================
#include <Keypad.h>
#include <LiquidCrystal.h> 
LiquidCrystal lcd(22,23,24,25,26,27); // DECLARAÇÃO DOS PINOS DO 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 do 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 A SER ALTERADA PELO MENU
char state=1; // VARIÁVEL QUE GUARDA POSIÇÃO ATUAL DO 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 DO KEYPAD 
'1','2','3' }

{
'4','5','6' }
,
{
'7','8','9' }
,
{
'*','0','#' }
};
byte LinPins[LIN] = {
28,29,30,31}; //PINOS DO ARDUINO CORRESPONDENTES AS COLUNAS
byte ColPins[COL] = {
32,33,34}; //E AS LINHAS DA MATRIZ
Keypad keypad = Keypad( makeKeymap(keys), LinPins, ColPins, LIN, COL );
char key = keypad.getKey();
void setup()
{
lcd.begin(16, 2); // Iniciando a biblioteca do 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 A 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 loop()
{
Sensor = digitalRead(sensorPin); // A VARIAVEL SENSOR CORRESPONDE AO sensorPin QUE ESTÁ LIGADO A PORTA ANALÓGICA A0 DO 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 A BOMBA JOGAR 200ml DE AGUA NA GARRAFA
contador++;
Sensor == !Sensor; //O SINAL DO SENSOR É INVERTIDO PARA A FUNÇAO RETORNAR DE ONDE ESTAVA
}
EstadoSensor = digitalRead(sensorPin); // O SINAL DO SENSOR É MOSTRADO NO SERIAL MONITOR 
Serial.println(Sensor);
if(EstadoSensor == HIGH){ // A FUNÇAO RETORNA AO ESTADO INICIAL
digitalWrite(MotorEsteira, HIGH); 
digitalWrite(MotorBomb, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(buzzer,LOW);
delay(2000);
}
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");
lcd.setCursor(0,2);
lcd.print("Eng. Mecatronica");
delay(5000);
lcd.clear();
lcd.setCursor(0,0); 
lcd.print("Controle Prod.");
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 a função lcd.clear()
break;
lcd.clear(); 
Set_state(1);
break;
default: // Caso nenhum botão tenha sido apertado, ela executa a 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 DO 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 PCP() // FUNÇÃO QUE DEFINE A QUANTIDADE DE GARRAFAS A SEREM ENVASADAS NO DIA
{
char key = keypad.getKey();
if (key != NO_KEY){
lcd.setCursor(i,2); 
lcd.print(key);
i++;
}
}
void Set_state(char index) {
state = index; // Atualiza a variável state para a nova tela
switch (state) { // verifica qual a tela atual e exibe o conteúdo correspondente
case 1: //==================== state 1
PCP();
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);

// if(contador==key){
// lcd.setCursor(0,0);
// lcd.print("Lote Pronto!");
// lcd.setCursor(0,1);
// lcd.print("Insira Novo");
// }
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: 
;}}

Exibições: 930

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço