Otimização de código

Resolvi um exercício o qual é solicitado a simulação de uma bola quicando atraves de uma sequencia de leds posicionados verticalmente.

o código é o seguinte

byte ledpin[]={13,12,11,10,9,8,7};
int aux=6,cont=0,resgate;

void setup()
{  for(int x=0;x<=6;x++)
     {pinMode(ledpin[x],OUTPUT);}
                                      }

void piscaS()  //Pisca os leds em sequencia ascedente
{  
   
   for(int y=0;y<=aux;y++)
   { digitalWrite(ledpin[y],HIGH);
     delay(250);
     digitalWrite(ledpin[y],LOW);  
                            resgate=aux;}  //armazena auxiliar
}

void piscaD()  //Pisca os leds em sequencia descedente
{  
   for(aux;aux>=0;aux--)
   { digitalWrite(ledpin[aux],HIGH);
     delay(250);
     digitalWrite(ledpin[aux],LOW);  }   
    aux=resgate;  //devolve o valor da variavel auxiliar
    aux--;    //decrementa auxiliar p acender a sequencia              
}            //de leds com exceção do ultimo,penultimo,antipenultimo...

void loop()
{ 
   digitalWrite(ledpin[0],HIGH);  //primeiro led inicia aceso
   delay(1000);
   digitalWrite(ledpin[0],LOW);
   
   while(cont!=6)  //repete o ciclo piscaS e piscaD 7x

  { piscaS();
    piscaD();
    cont++;     }
    
    cont=0;//Reinicia a variavel 
    aux=6; //Reinicia a variavel 
}

Gostaria de saber se há uma maneira de aprimorar o código.

Mudar as variaveis int para unsigned char ou char... quando aplicavel.

Nao usar a funcao delay...

O loop e um ciclo... logo nao faz sentido usares mais um while dentro dele quando o programa nao faz mais nada.

fazer uso de #define para definir constantes.

Nao usar duas variaveis globais para fazer o trabalho de uma.

Usar a mesma instrucao para ligar e desligar os pinos em vez de definir um caso especifico para a posicao zero do vector... podes sempre criar uma excepcao para essa posicao com um if dentro da funcao... ou loop.

Este post e bastante similar a outro no forum: http://forum.arduino.cc/index.php?topic=284401.0

Nao poderas falar com este teu colega para ver como ele resolveu o problema?

-pq trocar ,nesse codigo, variavel inteira por caractere?

-se eu nao usar o while a “bola” so sobe ate altura maxima e desce sem quicar nao vi outra soluçao se tiver favor quero saber

-No codigo nao vejo onde cabe constantes

-Favor nao sei qual as variaveis posso elimiinar

-onde eu poderia inserir “if”

Comecei arduino semana passada ,sozinho, perdoe a ignorância

Vou começar pelo fim, respondendo à questão:

-No código não vejo onde cabe constantes

aqui:

int aux=6,cont=0,resgate;
{  for(int x=0;x<=6;x++)
   while(cont!=6)  //repete o ciclo piscaS e piscaD 7x
    aux=6; //Reinicia a variavel

Mas por onde eu começava mesmo era por organizar melhor o código. No IDE há uma opção no menu ferramentas, que é a opção “Autoformat”.

Mais umas constantes

delay(250); delay(1000);

Para não usares o delay, procura pelo exemplo blink without delay.

Como eu disse, a função loop é um while que está sempre a correr. Logo, um while dentro dum while não faz sentido neste caso.

Trocar o int por unsigned char é uma boa prática de programação. Tu pediste para aprimorar o código e alguém usar unsigned char em vez de int correctamente é uma boa indicação.

Tanto aux e resgate são variáveis globais aux=resgate

Logo isto não faz muito sentido.

Não estás a ir no mau sentido, mas como disse os delays não devem ser usados e deves tentar diminuir o código que usas. Vê o que é repetido e como podes combinar as instruções.

Dê uma olhada: http://arduino.cc/en/Reference/UnsignedChar

Essa parte achei interessante:

For consistency of Arduino programming style, the byte data type is to be preferred.

http://arduino.cc/en/Reference/char

Isso da consistencia e um argumento falso... Nao tem puto a ver com consistencia uma vez que apenas o Arduino e que usa a designacao de byte.

Se vamos falar em consistencia com programacao para AVR (principalmente com o compilador que eles usam), entao estariamos a falar de:

uint8_t uint16_t int8_t int16_t etc, etc...

Ja que e essa a nomenclatura que e usada por quem normalmente desenvolve em cima do AVR-GCC sem as bibliotecas do Arduino.

Como a vasta maioria do codigo que aqui aparece com problemas e especifico para processadores de 8 bits ou AVRs, eu nao vejo o interesse em usar qualquer um destes tipos (excepto em algumas funcoes muito especificas). Dai usar o unsigned char... claro que, para quem quiser poupar o teclado, pode usar o tipo byte... mas se o objectivo e esse, porque nao definir o tipo b?

typedef unsigned char b