Primeiro post. Alguém sabe oq está acontecendo nesse código?

A função reverte funciona dentro da função, os valores aparecem certos, porém quando retorna os valores parecem aleatórios.

bool debug=1;

void printDebug(String frase){
  if(debug){
    Serial.println(frase);
  }
}

String escreveLista(byte lista[],byte tamanho){
  String retorno="[";
  for(byte i=0;i<tamanho;i++){
      retorno+=String(lista[i])+(i<tamanho-1?',':']');
    }
    return retorno;
}

byte* reverte(byte lista[],byte tamanho){
  byte listaReversa[tamanho];
  for(byte i=tamanho;i>0;i--){
    listaReversa[i-1]=lista[tamanho-i];
  }
  printDebug("Lista: "+escreveLista(lista,8)+", reversa: "+escreveLista(listaReversa,8)+'.');
  return listaReversa;
}

void Escada(byte primeirosLeds[],byte segundosLeds[],int tempo,bool estado,byte tamanho){
  printDebug("Escada dos leds: "+escreveLista(primeirosLeds,tamanho)+" e "+escreveLista(segundosLeds,tamanho)+" para: "+Estado(estado)+'.');
  for(short i=0;i<tamanho;i++){
    printDebug("\tColocando portas: "+String(primeirosLeds[i])+" e "+String(segundosLeds[i])+" para: "+Estado(estado)+'.');
    digitalWrite(primeirosLeds[i],estado);
    digitalWrite(segundosLeds[i],estado);
    Espera(tempo);
  }
}

void setup(){
  byte leds[]={13,12,11,10,9,8,7,6,5,4,3,2,22,24,26,28,30,32,34,36,37,39,41,43,45,46,47,48,50,52};
  for(byte i=0;i<sizeof(leds);i++){
    pinMode(leds[i],OUTPUT);
  }
  Serial.begin(115200);
}

byte ledsAmarelos2[]={22,24,26,28},
     ledsAmarelos3[]={30,32,34,36},
     ledsAmarelos4[]={39,41,43,45},
     ledsAmarelos1[]={46,48,50,52},
     todosAmarelos[]={46,48,50,52,22,24,26,28,30,32,34,36,39,41,43,45,46,48,50,52},
     primeiraMetadeAmarelos[]={46,48,50,52,22,24,26,28},
     segundaMetadeAmarelos[]={30,32,34,36,39,41,43,45,46,48,50,52}

void loop(){
  byte* reverso=reverte(segundaMetadeAmarelos,8);
  printDebug("Lista Reversa: "+escreveLista(reverso,8));
  Escada(primeiraMetadeAmarelos,reverso,500,0,8);
}

Funcoes.ino (4.42 KB)

FuncoesListas.ino (467 Bytes)

re-aprendendo.ino (2.74 KB)

a variável listaReversa existe apenas dentro da função reverte... quando envias um apontador para essa variável, o apontador fica essencialmente a apontar para o vazio.

O que é que pretendes fazer ao certo?

Pretendo fazer uns light shows simples, a função escada deveria ascender uma lista com leds em sequencia, como eu faço a função retornar a lista e não o apontador?

Já pensaste que o teu problema pode ser mais simples de resolver?

void Escada(byte primeirosLeds[],byte segundosLeds[],int tempo,bool estado,byte tamanho, int direccao){
  unsigned char i = 0; 
  if (direccao == 1) {
     for(i=0;i<tamanho;i++){
       digitalWrite(primeirosLeds[i],estado);
       digitalWrite(segundosLeds[i],estado);
       Espera(tempo); // O que é esta função??? 
     }
  } else { 
     for(i=tamanho;i>tamanho;i--){
       digitalWrite(primeirosLeds[i],estado);
       digitalWrite(segundosLeds[i],estado);
       Espera(tempo); // O que é esta função??? 
     }
  }

Será que isto é o que pretendes?

Obrigado pela atenção bubulindo!

bubulindo:
Já pensaste que o teu problema pode ser mais simples de resolver?

void Escada(byte primeirosLeds[],byte segundosLeds[],int tempo,bool estado,byte tamanho, int direccao){

unsigned char i = 0;
  if (direccao == 1) {
    for(i=0;i<tamanho;i++){
      digitalWrite(primeirosLeds[i],estado);
      digitalWrite(segundosLeds[i],estado);
      Espera(tempo); // O que é esta função???
    }
  } else {
    for(i=tamanho;i>tamanho;i--){
      digitalWrite(primeirosLeds[i],estado);
      digitalWrite(segundosLeds[i],estado);
      Espera(tempo); // O que é esta função???
    }
  }




Será que isto é o que pretendes?

Não exatamente, eu queria fazer a função ligar os leds em formato de piramide:
(Os 16 leds, " " sendo apagado, "" como led asceso, t sendo o tempo)
t0: | |
t1: | ** |
t2: | **** |
t3: | ****** |
t4: | ******** |
t5: | ********** |
t6: | ************ |
t7: | ************** |
t8: |
***************|

Realmente esqueci de incluir a função espera, mas ela é só um delay com printDebug:

void Espera(int tempo){
  printDebug("Espera de "+String(tempo/1000,4)+" segundos.");
  delay(tempo);
  printDebug("\tFim espera de "+String(tempo/1000,4)+"!");
}

Ahhh, ok. Não é muito mais difícil de fazer...

#define CRESCENTE  1
#define DECRESCENTE 0
unsigned char Leds[]={46,48,50,52,22,24,26,28,30,32,34,36,39,41,43,45,46,48,50,52};
//20 leds no total.
//leds 9 e 10 é onde começa a contagem. 
unsigned char left = 0;
unsigned char right = 0; 


void Escada(byte primeirosLeds[],byte segundosLeds[],int tempo,byte tamanho, int direccao){
  unsigned char i; 
  unsigned char j;

  if (direccao == CRESCENTE) {
     i = tamanho/2; //10
     j = i-1;  //9
     
     for(;i<tamanho-1; i++, j--){
       digitalWrite(Leds[i], HIGH);
       digitalWrite(Leds[j], HIGH);//nota que é um j aqui... 
       Espera(tempo); 
     }
  } else {
     i = tamanho-1;
     j = 0
     for(;i>tamanho/2;i--, j++){
       digitalWrite(primeirosLeds[i], LOW);
       digitalWrite(segundosLeds[i], LOW);
       Espera(tempo); 
     }
  }

Nota, tamanho é o número de leds que tens. Neste caso 20 para o código dar certo. Desde que aumentes os números de leds de forma par, o código deve funcionar sempre bem supondo que pretendes sempre iniciar do meio.
Eu retirei a variável estado, mas podes querer voltar a colocar dependendo de como tens os LEDs ligados, ou o efeito que pretendes fazer (normal ou negativo).

Experimenta e vê se funciona.