collapse

* Posts Recentes

Bibliotecas para arduino e drivers de stepper - o problema da 'distracção' por SerraCabo
[Ontem às 23:27]


Zener BZW04-105? por brunus
[Ontem às 17:34]


Artigo 11, 13 e os restantes por jm_araujo
[10 de Dezembro de 2018, 11:05]


Compra Colectiva Mouser N3-2018 (limite 25 Nov) por Hugu
[10 de Dezembro de 2018, 01:07]


Ajuda para reparar Luzes de LED de Natal por brunus
[09 de Dezembro de 2018, 00:59]


Como reproteger as pontas de cobre do ferros de soldar? por brunus
[09 de Dezembro de 2018, 00:12]


Usar steppers de 5 pontas como se fossem de 4 pontas por SerraCabo
[08 de Dezembro de 2018, 21:18]


LusoRobótica - Website - Estado actual por Tech_JA
[06 de Dezembro de 2018, 09:18]


Como transformar um mosquito killer de tomada em um portátil? por brunus
[05 de Dezembro de 2018, 23:28]


LR, passado, presente e futuro por iyahdub
[05 de Dezembro de 2018, 04:16]

Autor Tópico: Ligar leds por porta serie no arduino  (Lida 1684 vezes)

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

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Ligar leds por porta serie no arduino
« 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.

Citar
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.

Citar
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

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: Ligar leds por porta serie no arduino
« Responder #1 em: 26 de Fevereiro de 2011, 15:22 »
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:
Citar
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:
Citar
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!
}


« Última modificação: 26 de Fevereiro de 2011, 15:32 por GnGz »

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Re: Ligar leds por porta serie no arduino
« Responder #2 em: 26 de Fevereiro de 2011, 16:39 »
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

Cumprimentos

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: Ligar leds por porta serie no arduino
« Responder #3 em: 26 de Fevereiro de 2011, 16:41 »
De nada , mais duvidas não hesites?

:)

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.396
    • Tróniquices
Re: Ligar leds por porta serie no arduino
« Responder #4 em: 27 de Fevereiro de 2011, 00:47 »
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

E percebeste exactamente pq é que não funcionava?

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Re: Ligar leds por porta serie no arduino
« Responder #5 em: 27 de Fevereiro de 2011, 02:12 »
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:

Citar
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:

Citar
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