Go Down

Topic: Ajuda com exercicio livro Arduino Basico (Read 5 times) previous topic - next topic

bubulindo

Code: [Select]
#define UP       0
#define DOWN  1

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

void setup() {

//fazer setup dos pinos.
for (int i = 0; i<6; i++) {
  pinMode(ledPin[i], OUTPUT);
}
};

void loop() {
  LEDChange();
  delay(1000); //Nao e bonito... mas e 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;
      }
  }
}
}

Já está.
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).

giovannimundim

bubulindo acabei de testar seu codigo, nao funcionou, os seis primeiros LED's ficam acesos, e nao muda mais.

Mortis

#27
Sep 15, 2012, 01:49 am Last Edit: Sep 15, 2012, 01:51 am by Mortis Reason: 1

 static unsigned char sentido = DOWN;
 static unsigned char LED = 5;
 static unsigned char MaxH = 5;


existe um problema nas variáveis declaradas, pois unsigned char é o mesmo que bit, ou seja de 0 a 255, por isso a variável LED e Max H jamais serão menores que zero ^^

Edit: o ideal seria static int LED = 5;

Mortis

Olá!

Agora a pouco precisei sair ^^

tentei explicar cada passo das alterações, mas estava meio confuso.

Bom, com as alterações abaixo funcionou, mas creio que esteja meio parretado rs

Code: [Select]

#define UP       0
#define DOWN  1

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

void setup() {

//fazer setup dos pinos.
for (int i = 0; i<6; i++) {
  pinMode(ledPin[i], OUTPUT);
}
};

void loop() {
  LEDChange();
  delay(300); //Nao e bonito... mas e 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.
    LED++;
    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
    if (LED == 6)
      digitalWrite(ledPin[0], LOW); //depois de MaxH == 0 o LED é 5, então o zero não é apagado
   
    digitalWrite(ledPin[LED], LOW);   //desliga o anterior
    LED--;
    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 = 6;
        sentido = DOWN;     
      }
    }
  }
}


bubulindo, o que tens a dizer? Marretei demais? rs

bubulindo

#29
Sep 15, 2012, 07:16 am Last Edit: Sep 15, 2012, 11:21 am by bubulindo Reason: 1

existe um problema nas variáveis declaradas, pois unsigned char é o mesmo que bit, ou seja de 0 a 255, por isso a variável LED e Max H jamais serão menores que zero ^^

Edit: o ideal seria static int LED = 5;


My bad. Tens razão. Mas o ideal seria char. -126 a 127.

Segundo o que percebi, alteraste as condicões para nunca testar abaixo de zero e alteraste os decrementos e incrementos para fora da digitalWrite()... algum motivo para isso?

Edit:

Tive um tempinho para brincar com isto no Visual Studio e o meu printout deste código funciona trocando apenas o unsigned char por char.

Se quiserem experimentar num compilador de C para PC:

Code: [Select]

#define UP       0
#define DOWN  1

unsigned char ledPin[] = {8, 9, 10, 11, 12, 13};
//adaptei a digitalWrite do Arduino para PC.... he eh
void digitalWrite(unsigned char* pin, unsigned char state){
    *pin = state;
};

void LEDChange() {
  //alterei estas variáveis....
  static char sentido = DOWN;
  static char LED = 5;
  static char MaxH = 5;
//mas o resto ficou igual.
  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;
      }
  }
}
//adicionei isto para debug na consola.
  printf("LED = %d\n", (int)LED);
  printf("Sentido = %d\n", (int) sentido);
  printf("MaxH = %d\n", (int) MaxH);
}


int main(char argc, char** argv) {
int i;
printf("Hello, world!!\n");
//60 iteracões dá para ver o algoritmo a funcionar...
for (i = 0; i <60; i ++) {
LEDChange();
}
getchar();

return 0;
}

E tirando a parte final em que a bola regressa ao início, o código funciona. :S
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).

Go Up