Go Down

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

De certeza que arranjas melhores explicações... ;)

Num dos livros que li sobre C, existia um exemplo para demonstrar isso... assim de repente, deve ter sido no do Vitor Damas. Não me lembra se o static estaria na especificação do Kernigan e Ritchie... mas também pode ter sido nesse.
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).

Mortis


De certeza que arranjas melhores explicações... ;)

Num dos livros que li sobre C, existia um exemplo para demonstrar isso... assim de repente, deve ter sido no do Vitor Damas. Não me lembra se o static estaria na especificação do Kernigan e Ritchie... mas também pode ter sido nesse.


As melhores explicações são as mais simples! As vezes nos preocupamos tanto em como explicar que deixamos os "alunos" ainda mais confusos.

#17
Sep 13, 2012, 01:34 am Last Edit: Sep 13, 2012, 01:36 am by giovannimundim Reason: 1
O meu codigo esta baseado ate a parte do exercicio do livro, ou seja eu nao conheço essas funçoes estaticas.

Os leds estao ligados corretamentes.

Mortis


O meu codigo esta baseado ate a parte do exercicio do livro, ou seja eu nao conheço essas funçoes estaticas.

Acabou de aprender xD



Os leds estao ligados corretamentes.

Estranho não funcionar ai, acabei de copiar e colar o código que te passei e funcionou direitinho... Para facilitar a visuaização podes alterar o dalay de cem para duzendos (int ledDelay = 200);

Veja lá no post

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


Fiquei com preguiça de rever o código do bubulindo...

Até


O meu codigo esta baseado ate a parte do exercicio do livro, ou seja eu nao conheço essas funçoes estaticas.

O livro chama-se Arduino Básico... embora não pareca são duas palavras redundantes. O objectivo do Arduino não é ensinar C, nem tão pouco ensinar microcontroladores porque cerca de 90% das pessoas que o usam não sabem como configurar uma porta com registos ou sequer usar um timer. E depois, como se não bastasse não ter como objectivo ensinar C, é básico. E variáveis static não são básicas e precisam de prática para entender. 


Os leds estao ligados corretamentes.

E o exemplo que coloquei, funciona?
Os exemplos restantes funcionam?
Colocaste resistências com os LEDs? 
Colocaste Serial.print() com os valores das variáveis para entenderes o que está errado? Ou pelo menos uma mensagem a dizer que o Arduino acabou de executar o setup para perceberes se ele está a fazer reset?
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).

Oi pessoal,

Acabei de me registrar aqui no forum só pra dizer que, eu estava com o mesmo problema do giovannimundim, mesmo livro, mesmo exercício, e o código que o Mortis passou funcionou direitinho, e, acredito que eu entendi a lógica de funcionamento dele (talvez não conseguisse fazer de novo sozinha... mas, por enquanto tá bom!). Na verdade eu usei só a parte final da função changeLED.

Vou colocar aqui como ficou, talvez ajude alguém:

Code: [Select]

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array  para os pinos LEDs
int ledDelay; //intervalo entre as alterações
int direction = 1;
int currentLED = 0;
int LEDquique = 9;
unsigned long changeTime;
int potPin = 2; // seleciona o pino de entrada para o potenciômetro

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

void loop(){
  ledDelay = analogRead(potPin); // lê o valor do potenciômetro
  if ((millis() - changeTime) > ledDelay){ // verifica se ja 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(ledPin[x], LOW);
  }
  digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
  currentLED += direction; // incrementa de acordo com o valor direction

  if (direction == 1)
  {
    if (currentLED == LEDquique){direction = -1;}
  }
  else //direction == -1
  {
    if (currentLED == 0){
      direction = 1;
      LEDquique--;
        if (LEDquique == 0){LEDquique = 9;}
    }
  }
}


obs: no meu caso estou usando os 10 pinos digitais para os leds, e a variável y do Mortis aqui é LEDquique

#21
Sep 14, 2012, 04:38 pm Last Edit: Sep 14, 2012, 04:51 pm by giovannimundim Reason: 1
Nao sei porque, testei agora o codigo do mortis e funcionou;

Muito obrigado

Também testei o programa do bubulindo, mas na hora de compilar esta dando um erro.

Mortis

Olá Erica, sou novo por aqui também rs

É muito legal compartilhar, valeu pelo código, certamente ajudará outras pessoas.


talvez não conseguisse fazer de novo sozinha...

Consegue sim! Mesmo que não seja na primeira, quando persistimos conseguimos! Tudo é difícil enquanto nós não sabemos como funciona, depois fica fácil ;)


Nao sei porque, testei agora o codigo do mortis e funcionou;

Muito obrigado

Também testei o programa do bubulindo, mas na hora de compilar esta dando um erro.


giovannimundim, Obrigado pela confirmação, eu estava sem saber como te ajudar.

o código do bubulindo precisa de uma pequena revisão, se der no final de semana eu testo e posto o revisado.

Eu uso pouco as variáveis estáticas, pois, até o momento, minha variáveis globais são usadas em mais de um bloco (método/função), mas é sempre bom sabermos o maior número de recursos.

Sou novato também, mas estamos aqui =)


Também testei o programa do bubulindo, mas na hora de compilar esta dando um erro.


É bom saber que sou humano de vez em quando. :)

Code: [Select]

#define UP       0
#define DOWN  1

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

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;
      }
  }
}


Estee tinha um pequeno erro... vê se funciona. :) Agora estou curioso.
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).

bubulindo coloquei seu codigo e quando fui compilar apareceu esse erro "expected `}' at end of input"

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

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

#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