Seleccionar un vector desde la comunicación serial

saludos, amigos soy nuevo en el foro, y estoy acá en esta ocasión para pedir ayuda... el caso es el siguiente:
imaginemos que tenemos muchos vectores 100o mas, con distintos tamaños EJ:

unit8_t[] ROJO={2,4,5,9,8,9,15,6,22,14,};
unit8_t[]  VERDE={10,9,1,2,20,};
unit8_t[]  AZUL={1,4,5,1,6,12};
              .
              .
              .
unit8_t[]  n ={5,8,4,8,9,5,5,4,7,8}

ahora bien, el programa se ejecuta distintas rutinas con un vector cualquiera digamos el "AZUL", digamos que suma los elementos dentro del vector o los resta o cualquier cosa esto no es lo importante, lo importante es que una vez termina de hacer las distintas rutinas pregunta si hay datos nuevos en el puerto serie, en este caso yo estaría mandando por serial digamos la palabra "VERDE", haciendo referencia al vector con ese nombre ahora lo que quiero es que el programa vuelva a ejecutar las rutinas pero esta vez lo hará con los datos de vector "VERDE"

no se si me entiendan, el programa ya esta echo, claro yo lo inicio con un vector la primera vez, lo que quiero es cambiar el vector por otro vía serial cada ves que deseo...

Puedes plantartelo de varias maneras, la mas simple es usar un arreglo bidimensional, de esa manera siempre estarías trabajando con el mismo arreglo, solo cambiaría el indice, correspondiente al color.

ok, gracias por tu respuesta, dos dudas, primero considerando que son muchoooosss vectores hacerlo bi-dimencional no implica mas uso de memoria que ya de por si esta ajustado a la cantidad de vectores, incluso algunos de ellos tienen mas de 300 elementos en su interior, segundo lo que no conozco bien es la sintaxis y la forma de usar las funciones Serial.xxx mi duda mas grande es como pasar de una palabra enviada por serial ej "VERDE" no se si leerlo y guardarlo en variable tipo string, (o un método mejor) y de allí hacer que el programa busque el vector con ese nombre y empiece a operar...

ok, gracias por tu respuesta, dos dudas, primero considerando que son muchoooosss vectores hacerlo bi-dimencional no implica mas uso de memoria que ya de por si esta ajustado a la cantidad de vectores, incluso algunos de ellos tienen mas de 300 elementos en su interior,

Eso depende de tus vectores, si todos tienen el mismo tamaño, no estarías usando mas memoria, pero si no lo son, estarías utilizando el de mayor tamaño para definir la matriz

Te dije que era la forma mas simple de hacerlo, pero si quieres pasarle directamente el vector por nombre a una función , tendrás que entrar al mundo de los punteros.

Puedes guardar información en la flash usando PROGMEM, investigalo.
Si hablas de necesitar muchos elementos eso te dará mucho espacio.
Recuerda que estas limitado en RAM.

si efectivamente son todos desiguales en tamaño, de todas formas podría dar un ejemplo de como pasar de ese mensaje o string recibido por serial a la búsqueda de un vector especifico... también me llama la atención la búsqueda del vector por puntero

Si usas una matriz lo que vas a terminar seleccionado es una fila. Tu ROJO VERDE AZUL deben coincidir con filas de una matriz de N columnas.
Yo te paso info de la idea de PROGMEM

Si tu idea es seguir eligiendo por colores pues arma un vector de Strings y compara lo recibido por Serial con los elementos de un vector de Strings que contenga los Colores
algo asi

String colores[] = {"ROJO ", "VERDE", "AZUL "};

y luego lo recibido por Serial debidamente armado como ROJO o VERDE o AZUL lo comparas en un ciclo que sale cuando encuentra el indice que se corresponde.
Con dicho indice apuntas a la matriz y obtienes los elementos (columnas) buscados.

super agradecido con las ayudas, pero tengan en cuenta el tamaño de lo que quiero hacer... puse un ejemplo muy soso La verdad con los colores pero es un poco mas complejo y grande de lo que les di a entender,
digamos que tengo una organización por marcas de autos unas 10marcas distintas y en cada marca pues existen 40 modelos, a cada modelo le corresponde un vector con diferencia de tamaño y yo quiero acceder al vector que desee por serial, después que lo ubico pues hago lo quiera con el... lo importante es un método para acceder a dichos vectores.... ej

chevrolet
aveo_2005 (esto a de ser un vector)
aveo_2011 (esto a de ser un vector)
aveo_2012-2016(esto a de ser un vector)
corsa_2005-2009 (esto a de ser un vector)
corsa_2010(esto a de ser un vector)
asi asi asi en mas

luego tengo ford
fietas_2001_aut(esto a de ser un vector)
fiesta_2002-2009(esto a de ser un vector)
f150_2010(esto a de ser un vector)
asi
asi
asi
luego otra marca-....

Ten presente el tamaño de la flash y algo mas, no desarrolles un tema y a cada paso le vas agregando tonalidades. Comienza explicando todos desde el inicio para que no perdamos tiempo ni tu ni nosotros.
Aunque la flash tiene sus limites son importantes.
Asi que cuantifica para ponernos mas en tema.
10x40 = 400 modelos diferentes. Y por cada modelo qué? esas cantidad de elementos que has puesto como ROJO, VERDE, etc?
O sea multiplico x 10 estamos en 4000. Eso es nada, no preocupa ni a un UNO usando lo que te he sugerido.

tienes razón me disculpo

si la cantidad de elementos dentro de cada modelo o mejor dicho cada vector pueden ir desde 10 hasta 400... el tema de espacio dices que un UNO va bien, de todas formas e pensado también el uso de un ESP8266 o ESP32

el tema de las memoria dispuestas en un Arduino o una ESP me confunde un poco es que yo vengo del mundo de PIC y Assembler... :slight_smile:

Estoy de acuerdo con Surbyte, plantea el problema claramente . De hecho lo que que acabas de postear es el clásico ejemplo que se utiliza para explicar clases en programación orientada a objetos. Se crea una clase llamada automovil con diferentes propiedades, como marca modelo, fabricante, patente, color, etcétera.

Si estas hablando de 400 x elemento ya las cosas se apartan del UNO.
400x400= 160000 bytes es demasiado.
Un ESP32 viene con 4/8/16MB asi que ahi estarás bien, incluso con un ESP8266 puedes ir de 1 a 4MB.
Yo le veía al tema cosas conocidas como de matrices de longitud variable. Tranquilamente podría resolverse así. El enfoque de usar matrices es mas simple que con punteros pero con punteros tienes la libertad de no desaprovechar memoria.
Ahora si hablamos de algo tan grande... hay que enfocarse en otro medio.
Directamente será flash o tmb puede ser una SD.

me compre un ESP8266, supongo que el tema memoria esta cubierto, tendrás algún código ejemplo para lo que quiero hacer?

post#7

Si te interesa puedes utilizar ficheros en el ESP8266. Uno por cada vector.
Lo normal es que un ESP8266 tenga 4MB para ficheros. Los hay con más aún, creo que 16Mb es el máximo.
Puedes crear los ficheros de vectores en el PC y subirlos por FTP al ESP8266.
Después por el puerto serie cuando recibas una línea buscas si existe ese fichero y te pones a calcular lo que quieras leyendo de línea en línea.
Y vuelves a devolver por puerto serie.
Eso sí, no tiene la velocidad de lectura de variables en memoria pero no va lento.

me gustaría intentar con punteros, de echo ya intente algunas cosas en el programa y es que cargo el vector en un puntero y luego llamo al puntero en la función y va bien, el tema q aun no resuelvo (y seguro q les debe parecer tonto), no se como pasar del string q recibo desde serial, con el nombre del vector, al vector propiamente

les dejo una simplificación del código

#define led    D1
#define led2   D2
#define ON      1
#define OFF     0

 uint8_t  *PTR = NULL;
 uint16_t VECES = 0;
 uint8_t   I = 0, OUT = 0;

 uint8_t   WHEEL_rojo_[] = {40, 2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,
                                2,0,1,0,1,0,1,0,1,0,1,0,2,0,1,0,1,0,0,0};

 uint8_t   WHEEL_azul_[] = {32, 1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,
                                1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0};

                            
 uint8_t   WHEEL_verde_[] = {36, 2,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,1,
                                 2,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,1};                             



void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  _run();
  if (Serial.available()) SERIAL_event();
}

void _run(){ 
  
  PTR = &WHEEL_rojo_[0]; /// aca es que quiero poder cambiar el vector via serial
  
  VECES = *PTR;
  for(I=0; I<VECES; I++){
    PTR ++;
    OUT = *PTR;
    switch(OUT){
      case 0:
        digitalWrite(led, OFF);
        digitalWrite(led2, OFF);
        break;
      case 1:
        digitalWrite(led, ON);
        digitalWrite(led2, OFF);
        break;
      case 2:
        digitalWrite(led, ON);
        digitalWrite(led2, ON);
        break;
    }
    delay(100);
  }
}

void SERIAL_event(){
  
} 

me gustaría saber mas de esto de los ficheros suena interesante, no consigo información sobre eso