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;}
}
Tags:
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!
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;}
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por