collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Botão de "impulso"  (Lida 2238 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Botão de "impulso"
« em: 16 de Junho de 2011, 13:51 »
Boas, tenho trabalhado com os estados HIGH, e LOW para os pinos dos switch.

Agora queria utilizar botões de pressão, ou normalmente abertos para navegar por um menu. tenho o seguinte código, mas nao funciona.

Código: [Seleccione]

/***********************************************************************************
Controlo de luzes , amp, e acessorios, para carro com display
Falta testar com hardware
   
    Ultima alteração : 15/06/2011 pelas 03:26 By : Dead_Boy 
***************************************************************************/
char estadoecran1 = '        off     ';
char estadopin1 = 'LOW';

char estadoecran2 = '        off     ';
char estadopin2 = 'LOW';

char estadoecran3 = '        off     ';
char estadopin3 = 'LOW';

char estadoecran4 = '        off     ';
char estadopin4 = 'LOW';

char estadoecran5 = '        off     ';
char estadopin5 = 'LOW';

char estadoecran6 = '        off     ';
char estadopin6 = 'LOW';

int estado = 0;
int out1 = 2;
int out2 = 3;
int out3 = 4;
int out4 = 5;
int out5 = 6;
int out6 = 7;
int upbut = 8;
int downbut = 9;
int okbut = 10;

#define inicio 0
#define menu1 1
#define menu2 2
#define menu3 3
#define menu4 4
#define menu5 5
#define menu6 6

void setup()
{
Serial.begin(9600);
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
pinMode(out3,OUTPUT);
pinMode(out4,OUTPUT);
pinMode(out5,OUTPUT);
pinMode(out6,OUTPUT);
pinMode(upbut,INPUT);
pinMode(okbut,INPUT);
pinMode(downbut,INPUT);
}
 
 
void loop(){

switch (estado) {

case inicio:

selectLineOne();
Serial.print("  Hi Dead_Boy!  ");
selectLineTwo();
Serial.print("   Press Ok!    ");
delay(500);
 
  if (pulseIn(okbut, HIGH) == true) { estado = menu1;}
 
break;

case menu1:
selectLineOne();
Serial.print("  Acessorio 1   ");
selectLineTwo();
Serial.print(estadoecran1);

    if ((pulseIn(okbut, HIGH) == true) && (estadopin1 = 'LOW')){
        estadoecran1 = '    On          ';
        estadopin1 = 'HIGH';
    }
    if ((pulseIn(okbut, HIGH) == true) && (estadopin1 = 'HIGH')){
        estadoecran1 = '    OFF         ';
        estadopin1 = 'LOW'; 
    }
   
    if (pulseIn(upbut, HIGH) == true){
      estado = menu6;
    }
   
    if (pulseIn(downbut, HIGH) == true){
      estado = menu2;
    }



case menu2:
selectLineOne();
Serial.print("  Acessorio 2   ");
selectLineTwo();
Serial.print(estadoecran2);

    if ((pulseIn(okbut, HIGH) == true) && (estadopin2 = 'LOW')){
        estadoecran2 = '    On          ';
        estadopin2 = 'HIGH';
    }
    if ((pulseIn(okbut, HIGH) == true) && (estadopin2 = 'HIGH')){
        estadoecran2 = '    OFF         ';
        estadopin2 = 'LOW'; 
    }
   
    if (pulseIn(upbut, HIGH) == true){
      estado = menu1;
    }
   
    if (pulseIn(downbut, HIGH) == true){
      estado = menu1;
    }
   
   break;

}// closes switch state
}// closes loop


/*********************************************************************
*       Serial LCD disagnostic and general use tools                 *
*   selectLineOne(); | selectLineTwo(); | goTo(); | clearLCD();      *
*      backlightOn(); | backlightOff(); | serCommand();             *
**********************************************************************/
void selectLineOne(){  //puts the cursor at line 0 char 0.
   Serial.print(0xFE, BYTE);   //command flag
   Serial.print(128, BYTE);    //position
}
void selectLineTwo(){  //puts the cursor at line 0 char 0.
   Serial.print(0xFE, BYTE);   //command flag
   Serial.print(192, BYTE);    //position
}
void goTo(int position) { //position = line 1: 0-15, line 2: 16-31, 31+ defaults back to 0
if (position<16){ Serial.print(0xFE, BYTE);   //command flag
              Serial.print((position+128), BYTE);    //position
}else if (position<32){Serial.print(0xFE, BYTE);   //command flag
              Serial.print((position+48+128), BYTE);    //position
} else { goTo(0); }
}

void clearLCD(){
   Serial.print(0xFE, BYTE);   //command flag
   Serial.print(0x01, BYTE);   //clear command.
}
void backlightOn(){  //turns on the backlight
    Serial.print(0x7C, BYTE);   //command flag for backlight stuff
    Serial.print(157, BYTE);    //light level.
}
void backlightOff(){  //turns off the backlight
    Serial.print(0x7C, BYTE);   //command flag for backlight stuff
    Serial.print(128, BYTE);     //light level for off.
}
void serCommand(){   //a general function to call the command flag for issuing all other commands   
  Serial.print(0xFE, BYTE);
}

Faltam alguns "menus" mas apaguei para testar.
acho que o erro está no comando :  if ((pulseIn(okbut, HIGH) == true) && (estadopin2 = 'HIGH'))

E deverá faltar um digitalRead, para os pinos de entrada.

Qual será o problema?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Botão de "impulso"
« Responder #1 em: 16 de Junho de 2011, 13:57 »
O erro está aqui:
Código: [Seleccione]
estadopin2 = 'HIGH'

Usando só um = estás a assignar um valor e não a comparar, para comparar usas == e depois ' ' é para definir um caracter como por exemplo 'A', 'HIGH' é mais que um caracter logo nem sei como é que isso compila se é que compila...
Logo isso é meter == e tirar os ' ' e tens pelo menos esse erro duas vezes no código.

O mesmo se aplica aqui:
Código: [Seleccione]
char estadoecran1 = '        off     ';
char estadopin1 = 'LOW';

char estadoecran2 = '        off     ';
char estadopin2 = 'LOW';

char estadoecran3 = '        off     ';
char estadopin3 = 'LOW';

char estadoecran4 = '        off     ';
char estadopin4 = 'LOW';

char estadoecran5 = '        off     ';
char estadopin5 = 'LOW';

char estadoecran6 = '        off     ';
char estadopin6 = 'LOW';

Nem sei para que é tanto espaço ai, nem nunca um char podem ser várias letras, não tens a definição de off antes dessas declarações, logo mesmo que não tenha os ' ' e fosse uma variavel ia ser uma variavel indefinida.

Depois o pulseIn retorna o tempo que o botão está premido, isto partindo do principio que o botão quando premido conecta ao Vcc e que tem um pull-down,  e como retorna um tempo em valor numérico comparar com true é um erro tremendo, e é a primeira vez que vejo alguem a usar pulseIn para ler um botão.

Portanto, diria que tens ai muito que martelar.
Avr fanboy

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Botão de "impulso"
« Responder #2 em: 16 de Junho de 2011, 19:14 »
Ok,l vou reformular a pergunta.

O problema principal é por ex:


Código: [Seleccione]
case menu1:

selectLineOne();
Serial.print("  Acessorio 1   ");
selectLineTwo();
Serial.print(" menu1 ");

        okbutstatus = digitalRead(okbut);   
        if (okbutstatus == HIGH){
       
         digitalWrite(13, HIGH);
   }

Ora, se quisesse utilizar um botão (okbut) do tipo switch On/OFF, o código estaria bem.
Mas o botão que quero utilizar é um "pulsador", mas quero manter o led acesso quando largar o botão, ou seja, com um impulso,ligo o led, com outro desligo.


Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Botão de "impulso"
« Responder #3 em: 16 de Junho de 2011, 19:36 »
Código: [Seleccione]
int variavel = 0;

...

if (okbutstatus == HIGH) {

variavel = !variavel;
digitalWrite(13, variavel);

}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Botão de "impulso"
« Responder #4 em: 16 de Junho de 2011, 21:20 »
Falta ai fazer debounce ao botão, se não isso não será lá muito fiavel.
Mas o código compila?
Avr fanboy

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Botão de "impulso"
« Responder #5 em: 16 de Junho de 2011, 22:03 »
A intenção é fazer um menu de 1 a 6 acessorios, onde escolho entre On e Off, para por high ou low o respectivo pino.

Funcionamento:
Ao ligar a 1ºpos da ignição, o display apresenta uma mensagem:

(mensagem demo):        "HI Dead_Boy!"
                                           Press OK!

Depois de primir "OK", será redireccionado para um menu com 6 itemns do genero:

(Menu Demo):

    -----------------
   |  Acessorio 1   |
   |    - OFF -        |
    -----------------

Prime Ok para mudar estado para "ON", e ligar o acessorio:   "Se houver um impulso no okbut (pino10)"

    -----------------
   |  Acessorio 1   |
   |     - ON -         |
    -----------------

Ao primir os botões "UP" ou "DOWN", navega pelos outros 5 acessorios.

a seguir, encontra-se parte do cógio, mas ja tenho todo idealizado.

O que preciso de substituir é as linhas que estao como comentario:


Código: [Seleccione]
int estado = 0;
int out1 = 2;
int out2 = 3;
int out3 = 4;
int out4 = 5;
int out5 = 6;
int out6 = 7;
int upbut = 8;
int downbut = 9;
int okbut = 10;

#define inicio 0
#define menu1 1
#define menu1on
#define menu1off
#define menu2 2
#define menu3 3
#define menu4 4
#define menu5 5
#define menu6 6

int estadomenu1;
int estadomenu2;
int estadomenu3;

void setup()
{
Serial.begin(9600);
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
pinMode(out3,OUTPUT);
pinMode(out4,OUTPUT);
pinMode(out5,OUTPUT);
pinMode(out6,OUTPUT);
pinMode(upbut,INPUT);
pinMode(okbut,INPUT);
pinMode(downbut,INPUT);

}

void loop(){

switch (estado) {

case inicio:

selectLineOne();
Serial.print("   Wellcome!    ");
selectLineTwo();
Serial.print("   Press OK!    ");
   /* Se houver um impulso no okbut (pino10)*/ {
      estado = menu1off;
   }
break;
   
case menu1on:

clearLCD();
estadomenu1 = HIGH;
selectLineOne();
Serial.print("  Acessorio1   ");
selectLineTwo;
Serial.print("    -  ON  -    ");
digitalWrite(out1, HIGH);

  //se houver um impulso no okbut (pino10) {
    estado = menu1off;

    }
break;

case menu1off:

clearLCD();
estadomenu1 = LOW;
selectLineOne();
Serial.print("  Acessorio1   ");
selectLineTwo;
Serial.print("    -  OFF  -   ");
digitalWrite(out1, LOW);

  //se houver um impulso no okbut (pino10) {
    estado = menu1on;

   
}
}
}