Boa tarde, galera!

Sou iniciante com arduíno e estou seguindo os projetos do livro Arduino Básico, porém em um dos exercícios, ao fazer o upload do código, o mesmo realiza a ação proposta, porém, o led ligado ao pino 8 acende fora do tempo, depois que as luzes se encontram e retornam.

Alguém saberia me dizer o que está errado no código, por gentileza?

O exercício proposto é esse, seguido pelo código:

Exercício 1: Faça com que os LEDs em AMBAS as pontas da sequência iniciem
acesos. Então, avance as luzes, uma em direção da outra, dando a impressão de
que estão se encontrando e retornando às pontas.

// Projeto 6 - Efeito de iluminação sequencial com LEDs
byte ledPin1[] = {4, 5, 6, 7, 8}; // cria um array para os pinos dos LEDs
byte ledPin2[] = {13, 12, 11, 10, 9};
int ledDelay(100); // intervalo entre as alterações
int direction = 1;
int currentLED = 0;
unsigned long changeTime;


void setup() {
  for (int x=0; x<10; x++) { // define todos os pinos como saída
  pinMode(ledPin1[x], OUTPUT);
  pinMode(ledPin2[x], OUTPUT); }
  changeTime = millis();
}

void loop() {
  if ((millis() - changeTime) > ledDelay) { //verifica se já transcorreram
  // ledDelay ms desde a última alteração
  changeLED();
  changeTime = millis();
  }
}

void changeLED() {
  for (int x=0; x<10; x++) { // apaga todos os leds
  digitalWrite(ledPin1[x], LOW);
  digitalWrite(ledPin2[x], LOW);
  }
 
  digitalWrite(ledPin1[currentLED], HIGH);
  digitalWrite(ledPin2[currentLED], HIGH); // acende o LED atual
  currentLED += direction; // incrementa de acordo com o valor de direction
  // altera a direção se tivermos atingido o fim
  if ((ledPin1[currentLED]) == 9) {direction = -1;}
  if ((ledPin1[currentLED]) == 0) {direction = 1;}
  if ((ledPin2[currentLED]) == 9) {direction = -1;}
  if ((ledPin2[currentLED]) == 0) {direction = 1;}
}

Exibições: 2534

Responder esta

Respostas a este tópico

Achei estranho o fato de cada array possuir 5 elementos e nas funções FOR ser utilizado um intervalo de 0 a 9.

Fiz aqui em casa o teste, trocando o 10 do FOR por 5 e correu normalmente.

Então, João, fiz o que você recomendou, troquei o 10 por 5 nas funções FOR, mas o LED continua a acender.

Percebi que o LED do pino 13 (aquele que fica no arduino) acende duas vezes, uma quando os LEDs fazem a sequência correta e a segunda quando o LED ligado ao pino 8 acende fora do tempo.

O LED do pino 13 só deveria acender uma vez a cada sequência, certo?

Desde já agradeço pela ajuda!

O led do pino 13 tem que acender junto com o led do pino 8, uma vez quando a direction é igual a 1 e outra vez quando é igual a -1.
Ainda não consegui descobrir o motivo exato desse problema que voce esta tendo, mas continuo procurando e assim que eu tiver alguma ideia eu posto aqui

Opa, obrigado pela atenção, João!

Vou fazer alguns testes e ver se consigo descobrir também.

Com a ajuda do meu cunhado consegui resolver esse seu problema, e segue abaixo o código.

 

// Projeto 6 - Efeito de iluminação sequencial com LEDs

byte ledPin1[] = {4, 5, 6, 7, 8}; // cria um array para os pinos dos LEDs

byte ledPin2[] = {13, 12, 11, 10, 9};

int ledDelay(100); // intervalo entre as alterações

int direction = 1;

int currentLED = 0;

unsigned long changeTime;

 

 

void setup() {

  for (int x=0; x<5; x++)

      { // define todos os pinos como saída

      pinMode(ledPin1[x], OUTPUT);

      pinMode(ledPin2[x], OUTPUT);

      }

  changeTime = millis();

}

 

void loop() {

  if ((millis() - changeTime) > ledDelay)

      { //verifica se já transcorreram

      // ledDelay ms desde a última alteração

      changeLED();

      changeTime = millis();

      }

}

 

void changeLED()

  {

  for (int x=0; x<5; x++)

      { // apaga todos os leds

      digitalWrite(ledPin1[x], LOW);

      digitalWrite(ledPin2[x], LOW);

      } 

  digitalWrite(ledPin1[currentLED], HIGH);

  digitalWrite(ledPin2[currentLED], HIGH); // acende o LED atual

  currentLED += direction; // incrementa de acordo com o valor de direction

  // altera a direção se tivermos atingido o fim

  if ((ledPin1[currentLED]) == 8) {direction = -1;}

  if ((ledPin1[currentLED]) == 4) {direction = 1;}

 

}

Caros amigos encontrei certas ambiguidade neste codigo, analisando mais a fundo no sketch do "Marcos Gomes" encontrei que não precisa definir array "x" exatamente dessa forma. Pois o termo x é comum para LedPin 1 e 2 ou seja vão de 0 a 4.

  Agradecendo deis de já pela atenção e espero ter ajudado de alguma maneira. ;)

a variável x foi criada para poder percorrer desde o valor 0 até o valor 4.

E o que são esses valores entre 0 e 4? São as posições (keys) do array LedPin1 e LedPin2

Dessa forma, temos no LedPin1:

posição 0 => pino4

posição 1 => pino5

posição 2 => pino6

posição 3 => pino7

posição 4 => pino8

essa informação foi escrita no sketch assim:

byte ledPin1[] = {4, 5, 6, 7, 8};

E com o LedPin2 ocorre de forma análoga, isto é, usando-se array, foi definido qual pino ocupa determinada posição dentro do array

Não consegui perceber qual foi sua contribuição/modificação no sketch sobre o sketch do Marcos

Boa tarde pessoal!

Sei que já tem um tempinho o tópico, mas depois de não ter sucesso na realização do exercício, fiquei muito curioso pra saber (depois de muitas tentativas sozinho) qual o código correto. Pesquisei no google e acabei parando aqui, segui as dicas e digitei o ultimo código postado, fiz várias e várias alterações na tentativa de resolver o exercício e não achei ninguem que o tenha feito, isso me deixou muito intrigado, pois o livro é um livro básico (segundo autor), para iniciantes, então não consigo entender o que há de errado com esse código que não funciona corretamente de jeito nenhum.

por favor, se alguem ja consegiu fazer funcionar perfeitamente, eu imploro ajuda rs, seja fornecendo o codigo ou comentan o que há de errado nesse.

desde já, obrigado

Consegui depois de muito trabalho fazer funcionar com o seguinte codigo:

*Notem que eu não criei 2 array, apenas dupliquei os direcionais limitando um de 0 a 4 e outro de 9 a 5, mas isso depois de muitas tentativas empiricas !

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Cria array
int ledDelay; // delay entre as mudanças
int direction1 = 1;
int currentLED1 = 0;
int direction = -1;
int currentLED = 9;
unsigned long changeTime;
int potPin = 2; // pino de entrada do potenciometro
void setup() {
for (int x=0; x<10; x++) { // seleta os pinos como saida
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin); // lê o valor do potenciometro
if ((millis() - changeTime) > ledDelay) { // checa se existe um delay desde a ultima mudança
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x=0; x<10; x++) { // apaga todos os leds
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); // liga o led atual
currentLED += direction; // incrementa o valor direcional
digitalWrite(ledPin[currentLED1], HIGH); // liga o led atual inverso
currentLED1 += direction1;

if (currentLED == 9) {direction = -1;}
if (currentLED == 5) {direction = 1;}
if (currentLED1 == 4) {direction1 = -1;}
if (currentLED1 == 0) {direction1 = 1;}
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço