Pages: [1] 2 3   Go Down
Author Topic: Ajuda com exercicio livro Arduino Basico  (Read 5109 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


O exercício pede para fazer com LED's um efeito de uma bola quicando.

byte ledPin[7] = {8, 9, 10, 11, 12, 13};
int currentLED = 0;
int ledDelay (100);
int direction = 1;
unsigned long changetime;

void setup(){
for(int x=0; x<6;x++){
pinMode(ledPin
  • , OUTPUT);
}
changetime = millis();
}

void loop(){

if ((millis()-changetime) > ledDelay){

changeLED();
changetime = millis();
}
}
void changeLED(){
int y;
for (int x=0; x<6; x++){
digitalWrite(ledPin
  • ,LOW);

}
int currentLED2 = 5-y;

digitalWrite(ledPin[currentLED],HIGH);
currentLED += direction;
if (currentLED == currentLED2){direction = -1;}
if (currentLED == 0) {direction = 1;}
y++;
}


Esse é o código que eu consegui criar, eu pensei em fazer um numero inteiro 'y' aumentar a cada volta do LED, so que não funcionou.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3217
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E o uqe é que o teu código não faz?

Eu, e julgo outros participantes, não estamos aqui para fazer o teu TPC. Se disseres o que o teu código faz e o que pretendes fazer, talvez consigas alguma ajuda. smiley-wink
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá amigo, infelizmente estou no trabalho e não poderei te ajudar muito.

Mas olhando rápido para seu programa, posso apontar alguns erros na função changeLED();

Você declarou as variáveis "y" e "currentLED2" dentro dela, mas quando você sai desta função, esses valores se perdem. Você precisará declara-las globalmente, ou seja, no início do programa, para que elas armazenem os valores fora da função também.

Verifique também se toda vez que chamar a função será necessário mesmo fazer "currentLED2 = 5-y" e "y++". Talvez será necessário fazer isso apenas quando currentLED == currentLED2. Eu disse TALVEZ> Não analisei seu programa a fundo.

Você tinha delcarado inicialmente "int y" e depois mandou fazer o cálculo "int currentLED2 = 5-y", mas qual o valor de y? Não sei se por padrão o arduino considera como "0", mas seria melhor declarar já atribuindo um valor para evitar surpresas.

Faça seu algoritmo passo a passo no papel para ver o resultado.

Abraços

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O obejtivo do programa é com led em sequencias dessem um efeito de uma bola quicando no chao e perdendo velocidade a cada volta( ou seja a cada volta menos um led ira acender).


Eu vou por um valor no y, mas como eu faço para que cada vez que a iluminaçao do led va e volte aumente o valor do y em 1. Pois aumentando o ultimo currentled iria diminuir a cada passada.
« Last Edit: September 04, 2012, 04:39:55 pm by giovannimundim » Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

giovannimundim,

Gostei da brincadeira, amanhã vejo com calma teu código (estou no tabalho agora), mas como nosso amigo Filantropic comentou, você precisa armazenar em uma variável global o número de leds da próxima rodada (olhando o código Y será sempre zero e currentLED2 será sempre 5, afinal 5 - 0 = 5).

Com a variável global, a cada loop você terá a referência de quantos leds você quer acender e poderá reduzir o número para a próxima "rodada".

Boa sorte ai!
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fala ai giovannimundim!

Como prometi, parei para dar uma olhada no teu código ^^

Pelo que entendi você quer o efeito de uma bola quicando, então a direção inicial seria -1 e o led seria o cinco.

1) Então a bola cai:
a direção caindo (direction = -1)
de cima para baixo (currentLED = 5)
a referencia da altura é a que a bola foi solta (y = 5)
a cada loop adicionamos - 1 (currentLED += direction)
gerando o efeito led 5, led 4, led 3, led 2, led 1, led 0

2) A bola chega ao chão (led 0):
neste momento podemos determinar a ação da gravidade, ou seja, a bola só chegará até a altura 4 (y = y -1, ou y--)
a bola quica, mudamos a direção (direction = -1)
a cada loop adicionamos +1 (currentLED += direction)
gerando o efeito led 0, led 1, led 2, led 3, led 4
então a bola perde a força e cai (e o loop continua de 4 até 0, 0 até 3, 3 até 0, 0 até 2, 2 até 0, zero até 1 e começa novamente)

Veja como ficou o código com a lógica acima:

byte ledPin[] = {8, 9, 10, 11, 12, 13};
int currentLED = 5;
int y = 5;
int ledDelay = 100;
int direction = -1;
unsigned long changetime;

void setup(){
  for(int x=0; x < 6;x++){
    pinMode(ledPin
  • , OUTPUT);
  }
  changetime = millis();
}

void loop(){
  if ((millis() - changetime) > ledDelay){
    changeLED();
    changetime = millis();
  }
}

void changeLED(){
  for (int x=0; x < 6; x++){
    digitalWrite(ledPin
  • , LOW);
  }
 
  currentLED += direction;
  digitalWrite(ledPin[currentLED], HIGH);
 
  if (direction == 1)
  {
    if (currentLED == y){direction = -1;}
  }
  else //direction == -1
  {
    if (currentLED == 0){
      direction = 1;
      y--;
      if (y == 0)
        y = 5;
    }
  }
}

Repare que o que faltava no teu código era:
1) colocar o y como variável global
2) considerar que o y só muda quando a bola bate no chão (direction -1 e currentLED = 0) e não cada vez que ocorre o loop()

com as duas considerações acima foi só acertar o código.

Eu to com preguiça, então rodei o código em um emulador (Virtual Breadboard), se não funcionar no arduíno você me fala rs

Até +
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu testei o código no Arduíno só que não funcionou.

os LEDs não tem uma sequencia ficam acendendo aleatoriamente.

e outra duvida, como eu estou começando com programação agora eu não entendo muito e essa parte
  if (direction == 1)
  {
    if (currentLED == y){direction = -1;}
  }
  else //direction == -1
  {
    if (currentLED == 0){
      direction = 1;
      y--;
      if (y == 0)
        y = 5;
    }
  }
}

você poderia me explicar o 'else'.
« Last Edit: September 10, 2012, 10:01:48 am by giovannimundim » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
if (direction == 1)

Esta parte de cima significa: Se direction for igual a 1, faça isso:
Quote
 {
    if (currentLED == y){direction = -1;}
  }

Quote
 else //direction == -1
Esta parte de cima significa: caso não for então faça isso:
Quote
{
    if (currentLED == 0){
      direction = 1;
      y--;
      if (y == 0)
        y = 5;
}

Algumas observações:
O else significa-> se o que está no if for falso, então faz o que eu estou falando. No caso acima, se directions for diferente de 1, ele vai fazer o "else".

É importante observar que existem dois "if" seguidos. O else é referente apenas ao primeiro if, pois ele está imediatamente após ao fechamento da chave que pertence ao primeiro "if".
Por consequencia disso, se o primeiro "if' for satisfeito mas o segundo "if" não, ele não executará o "else", pois este "else" é referente ao primeiro "if".

No else existe o termo //direction == -1. Este termo é apenas um comentário, que não influencia no programa.


Espero que tenha entendido.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muito obrigado pela explicaçao, só que o programa ainda nao funcionou. Os LEDs nao tem sequencias, ficam acendendo aleatoriamente.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3217
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ligaste os LEDS nos portos correctos?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim, o leds estao ligados corretamente.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3217
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu nem sequer compilei... mas deve ser isto que pretendes, não?

Code:
#define UP    0
#define DOWN  1

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

void loop() {
 
  LEDChange();
  delay(1000); //N~o ´ bonito... mas ´ para demonstrar.
 
}


void LEDChange() {
 
  static unsigned char sentido = DOWN;
  static unsigned char LED = 5;
  static unsigned char MaxH = 5;
  if (sentido == UP) {
    digitalWrite(ledPin[LED] LOW); //desliga o que estava.
    digitalWrite(ledPin[LED++]; HIGH); //liga o próximo.
    if (LED > MaxH) { //se atingimos a altura máxima...
      sentido = DOWN; //vamos para baixo.
      LED = MaxH;  //mas começamos de MaxH
    } 
  } else { //sentido = DOWN
    digitalWrite(ledPin[LED], LOW);   //desliga o anterior
    digitalWrite(ledPin[LED--], HIGH);  //liga o próximo
    if (LED < 0) {  //se chegamos ao chão
      LED = 0;   // não vamos abaixo
      sentido = UP;  //vamos para cima
      MaxH--;   // mas não chegamos tão alto quanto antes.
      if (MaxH < 0) { // Se atingimos repouso
        MaxH = 5;  // VOLTAMOS AO InÍCIO.
        LED = 5;
        sentido = DOWN;
      }
  }
}

Vê se funciona. A melhor maneira de fazer troubleshoot disto é colocar um Serial.print com os valores das variáveis para perceberes que bocado de código está a falhar.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Filantropic:
Valeu pelos comentários, muito bem explicado rs

bubulindo:
Teu código ficou bem simples, só acho difícil explicar para novatos a variável do tipo static dentro de um método.
Eu tentei não fugir do código original, apenas adequá-lo, nem me atentei ao loop desnecessário smiley-wink

giovannimundim: Os leds estavam ligados na sequencia correta (led1 na porta 8, led2 na porta 9, etc)?

Se não funcionar me avisa e eu tento tirar o arduino da gaveta à noite, agora estou no trabalho ^^
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3217
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bubulindo:
Teu código ficou bem simples, só acho difícil explicar para novatos a variável do tipo static dentro de um método.
Eu tentei não fugir do código original, apenas adequá-lo, nem me atentei ao loop desnecessário smiley-wink

Uma variável static e uma variável global, na realidade não têm muita diferenca... mas quando fazes um programa com umas quantas linhas, colocar a variável static dentro da funcão em que vai ser usada em vez de ficar perdida dentro dum ficheiro ajuda imenso na leitura do código e evitar problemas com a variável global.

Para ensinar como funciona, nada como:

- Explicar porque é que é má política usar variáveis globais.
- Dar um exercício onde é preciso uma variável global para fazer uma funcão simples.
- Dizer que se usarem o static, a variável passa a ser global (no sentido em que fica na memória), mas apenas acessível dentro daquela funcão.

podes usar o termo global_local se fizer mais sentido... smiley-razz
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bubulindo:
podes usar o termo global_local se fizer mais sentido... smiley-razz

Esse termo é mais simples kkk

Muito bem explicado, to até anotando para quando me perguntarem smiley-grin

o/
Logged

Pages: [1] 2 3   Go Up
Jump to: