LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: joaopedrocmp 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.
/***********************************************************************************
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?
-
O erro está aqui:
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:
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.
-
Ok,l vou reformular a pergunta.
O problema principal é por ex:
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.
-
int variavel = 0;
...
if (okbutstatus == HIGH) {
variavel = !variavel;
digitalWrite(13, variavel);
}
-
Falta ai fazer debounce ao botão, se não isso não será lá muito fiavel.
Mas o código compila?
-
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:
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;
}
}
}