LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: iMartins87 em 26 de Fevereiro de 2011, 14:18
-
Olá pessoal,
Hoje voltei a pegar no arduino, e comecei por fazer um pequeno programa em WPF C# que comunica com o arduino pela porta serie.
A aplicação contem dois botões e consoante os click nos botões envia a valores para o Arduino.
Com um só botão e com o seguinte código no arduino, tudo funciona bem.
const int ledPin = 13;
int luzon = 0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available())
{
if(Serial.read()==48) //0
{luzon = 0;}
else
{luzon=1;}
}
if(luzon == 0)
{digitalWrite(ledPin, LOW);}
else
{digitalWrite(ledPin, HIGH);}
}
Mas, de forma a aumentar o numero de led's fiz este codigo que não consegue ligar nenhum dos led's.
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
int luzon2 = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available())
{
if(Serial.read()==48) //0
{ luzon = 0; }
else if (Serial.read()==49) //1
{ luzon = 1; }
else if (Serial.read()==50) //2
{ luzon2 = 0; }
else if (Serial.read()==51) //3
{ luzon2 = 1; }
else
{ luzon = 0; luzon2 = 0;}
}
if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }
else if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
else
{ digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);}
}
Alguém me pode ajudar e explicar o que estou a fazer mal?
Cumprimentos
-
No primeiro exemplo sem enviares qualquer numero menos 0 ele fica em high e se enviares 0 ele não fica a low...
Para o segundo vê isto:
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0)// Alteração n1
{
luzon = Serial.read();
}
if(luzon == '0')
{ digitalWrite(ledPin, LOW); }
else if (luzon == '1')
{ digitalWrite(ledPin, HIGH); }
else if (luzon == '2')
{ digitalWrite(ledPin2, LOW); }
else if (luzon == '3')
{ digitalWrite(ledPin2, HIGH); }
// Limpei codigo!
}
E se quiseres receber o estado dos portos por serial:
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0)// Alteração n1
{
luzon = Serial.read();
}
if(luzon == '0')
{ digitalWrite(ledPin, LOW);
Serial.println("Pino 13 a Low");}
else if (luzon == '1')
{ digitalWrite(ledPin, HIGH);
Serial.println("Pino 13 a High");}
else if (luzon == '2')
{ digitalWrite(ledPin2, LOW);
Serial.println("Pino 12 a Low");}
else if (luzon == '3')
{ digitalWrite(ledPin2, HIGH);
Serial.println("Pino 12 a High");}
// Limpei codigo!
}
-
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.
Cumprimentos
-
De nada , mais duvidas não hesites?
:)
-
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.
E percebeste exactamente pq é que não funcionava?
-
E percebeste exactamente pq é que não funcionava?
Eu penso que sim, em primeiro lugar eu deveria atribuir o valor lido na porta serie a uma variável, e o erro mais grave no meu codigo era a cadeia de "else if" com variáveis diferentes, ou seja, eu tinha isto:
if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }
else if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
else
{ digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);}
e neste caso ele nunca iria passar do primeiro "else if" porque aquela variável só podia ter dois valores, 0 ou 1, e isso são uma das duas primeiras condições.
Para o código que eu tinha ficar correcto teria de ser corrigido e ficar da seguinte forma:
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
int luzon2 = 0;
int valor_serial_read;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available())
{
valor_serial_read = Serial.read();
if(valor_serial_read ==48) //0
{ luzon = 0; }
else if (valor_serial_read ==49) //1
{ luzon = 1; }
else if (valor_serial_read ==50) //2
{ luzon2 = 0; }
else if (valor_serial_read ==51) //3
{ luzon2 = 1; }
}
if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }
if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
}
Mas o código que o GnGz fez está bem mais simples.
Corrigiam me se disse alguma coisa mal, quererá dizer que não fiquei a perceber o erro!
Cumprimentos