'round the world...
Offline
Edison Member
Karma: 20
Posts: 2308
|
 |
« Reply #15 on: September 12, 2012, 12:35:31 pm » |
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.
|
|
|
|
|
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
Sr. Member
Karma: 4
Posts: 256
|
 |
« Reply #16 on: September 12, 2012, 06:07:09 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #17 on: September 12, 2012, 06:34:20 pm » |
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.
|
|
|
|
« Last Edit: September 12, 2012, 06:36:32 pm by giovannimundim »
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 4
Posts: 256
|
 |
« Reply #18 on: September 12, 2012, 08:13:31 pm » |
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é
|
|
|
|
|
Logged
|
|
|
|
|
'round the world...
Offline
Edison Member
Karma: 20
Posts: 2308
|
 |
« Reply #19 on: September 13, 2012, 12:13:27 am » |
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?
|
|
|
|
|
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
Newbie
Karma: 0
Posts: 1
|
 |
« Reply #20 on: September 13, 2012, 01:46:40 pm » |
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: 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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #21 on: September 14, 2012, 09:38:15 am » |
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.
|
|
|
|
« Last Edit: September 14, 2012, 09:51:52 am by giovannimundim »
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 4
Posts: 256
|
 |
« Reply #22 on: September 14, 2012, 10:35:08 am » |
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 =)
|
|
|
|
|
Logged
|
|
|
|
|
'round the world...
Offline
Edison Member
Karma: 20
Posts: 2308
|
 |
« Reply #23 on: September 14, 2012, 11:16:35 am » |
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. #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.
|
|
|
|
|
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
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #24 on: September 14, 2012, 12:10:07 pm » |
bubulindo coloquei seu codigo e quando fui compilar apareceu esse erro "expected `}' at end of input"
|
|
|
|
|
Logged
|
|
|
|
|
'round the world...
Offline
Edison Member
Karma: 20
Posts: 2308
|
 |
« Reply #25 on: September 14, 2012, 01:40:43 pm » |
#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á.
|
|
|
|
|
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
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #26 on: September 14, 2012, 06:21:29 pm » |
bubulindo acabei de testar seu codigo, nao funcionou, os seis primeiros LED's ficam acesos, e nao muda mais.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 4
Posts: 256
|
 |
« Reply #27 on: September 14, 2012, 06:49:23 pm » |
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;
|
|
|
|
« Last Edit: September 14, 2012, 06:51:49 pm by Mortis »
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 4
Posts: 256
|
 |
« Reply #28 on: September 14, 2012, 08:27:54 pm » |
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 #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
|
|
|
|
|
Logged
|
|
|
|
|
'round the world...
Offline
Edison Member
Karma: 20
Posts: 2308
|
 |
« Reply #29 on: September 15, 2012, 12:16:41 am » |
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: #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
|
|
|
|
« Last Edit: September 15, 2012, 04:21:19 am by bubulindo »
|
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).
|
|
|
|
|