Ayuda con Pointers

Hola buen día, ya tiene rato que pongo preguntas por aca...
Larga historia corta, estoy haciendo un datalogger con 4 sensores de temperatura y dos de humedad, de hecho ya los sensosores y lo demas ya funciona, asi que en ese aspecto no hay problema.

Recientemente he querido agregarle una pantalla, para lo cual cuento con una 128x64 y etoy haciendo pruebas de texto estatico y caben 4 lineas de texto con 4 datos cada una algo asi;

12.0 15.1 20.1 12.0
12.0 13.0 21.1 15.1
12.0 15.1 20.1 12.0
12.0 13.0 21.1 15.1

Y bueno, obviamente agregare un RTC para tomar la fecha y hora de la lectura

Ahora bien, teniendo en cuenta lo anterior, me busque un codigo que hiciera algo similar
y enconte este;

Donde se imprimen las renglones con ayuda de un pointer...

char line0[3] = { 'a', 'b', 'c' };
char line1[3] = { 'd', 'e', 'f' };
char line2[3] = { 'g', 'h', 'i' };
char* lines[4];
char* column;
 
void setup() {
  lines[0] = line0;
  lines[1] = line1;
  lines[2] = line2;
  Serial.begin(9600);
}
 
void loop() {
  int i,j;
  for(i=0;i<3;i++)
  {
    column = lines[i]; // get the array address
    for(j=0;j<3;j++)
    {
      Serial.print(*column++); // print the element, then increment the index
    }
    Serial.println(); // line break
  } 
  while(1); // infinite loop to stop the program
}

Bueno lo he probado y funciona, ahora quiero hacer lo inverso:
Quiero tomar 4 datos de los 4 sensores, ponerlos en un renglon a la vez y continuar, de manera que conforme se llenen los datos en la pantalla, se "recorran a los mas nuevos", obviamente grabare renglon por renglón y la fecha y hr ira impresa pero no se mostrara en la LCD.

Esto es lo que hice para modificar el codigo;
Me genera uno o dos numero pero luego aparecen ( ) &%? simbolos, y bueno creo que es un buen ejercicio, espero que me puedan ayudar con algo.

byte line0[3];
byte line1[3];
byte line2[3]; 
char* lines[4];
char* column;
 
void setup() {
  Serial.begin(9600);
}
 
void loop() 
{
  int i,j = -1;
  for(i=0;i<3;i++)
  {
      column = lines[i]; // get the array address
  
              for(j=0;j<3;j++)
              {
                *column = random(0,60);
                Serial.print(*column);Serial.print(" "); // print the element, then increment the index
              }
              Serial.println(); // line break
  } 
  delay(5000);
}

Las temperaturas que quiero medir son floats, pero no le veo mucho cambio a bytes, por el momento me quiero concetrar mas es saber como funcionan los pointers....
Hasta lo que he leido... apuntan a una variable del mismo tipo, en este caso, seria algo asi como;
anota en renglon 1... despues anota en renglon 2.... etc...

De ser asi, podria tomar todos los datos necesarios y ponerlos en una sola linea de texto usando sprintf para cada linea en, lugar de tener que reocuparme por si le falta agregar o no un 0...

Gracias.
-Alex.

si haces : *column = random(0,60); es como si hicieras lines[random(0,60)]; y luego sigues leyendo incrementando... no tiene mucho sentido o no te estoy pillando pero si accedes a posiciones de memoria aleatorias obtendrás resultados aleatorios

AlexLPD:
column = lines*; // get the array address*

  • for(j=0;j<3;j++)*
  • {*
    _ *column = random(0,60);_

[/quote]

Gracias por la pista Gonzalo...

Ahora bien...

En este pedazo de codigo;

column = lines[i]; // get the array address
  
              for(j=0;j<3;j++)
              {
                *column = random(0,60);
                Serial.print(*column);Serial.print(" "); // print the element, then increment the index
              }

A lo que entiendo.... se incia un contador i, que comienza en 0, luego se inicia otro contador, (este da 3 espacios a lo que quiero entender el primero es 3 renglones, el segundo 3 espacios por renglon.

Aaaa creo que ya te entiendo...

*column, es una dirección... por ejemplo ; 0,1 y 2 de los arrays... por lo que al hacer;
*column = random(0,60) leo una posición random de la memoria, no estoy asigando un valor random a esta.

Pero entonces.... como puedo ir, espacio por espacio de un array y "poner un numero" ya sea random o de lectura en la casilla. Para completar la linea de texto?

line1[3];
*column = 1; //esto me declara la primera columna o espacio
// como le pongo un valor?

???

No se si me explico.... sencillamente quiero rellenar 3 o cuatro renglones con 3 o cuatro datos... y para eso necesito escribir cada uno de los renglones.

Gracias.
-Alex.

Bueno, me he dado un poco de tiempo y ya lo tengo casi todo funcionando, solo me falta co-rrelacionar las columnas en las que se debe de grabar los datos... Les dejare lo que llevo Y donde me he atorado. Gracias.

//-------arrays to hold the temperature readings 
float line1[4];
float line2[4];
float line3[4]; 

//-------pointers to adress each memory location on arrays
float *lines[3] = {line1, line2, line3};
float *column[4];

//-------char to convert a reding 
char read1[7]; 
char read2[7];
char read3[7]; 
char read4[7];

//-------pointers to adress each read char
char* reads[4]= {read1, read2, read3, read4}; 

//-------char to assembly each data in to a text row to display 
char txt1[45];
char txt2[45];
char txt3[45];

void setup() 
{
lines[0] = line1;
lines[1] = line2;
lines[2] = line3; 

Serial.begin(9600);
Serial.println("Iniciando Programa"); 
}

void loop() 
{
    for(int b=0; b<3; b++)
    {
     lines[b]; 
     
      for(int a=0; a<4; a++)
        {
          line1[a] = (random(0,254)/ random(0,5));
          //column[a] = (random(0,254)/ random(0,5)); 
          Serial.print(line1[a]); Serial.print("  ");
        }
      Serial.print("Float");Serial.println(b);
      if(b == 2)Serial.println("     ");      
    }
    
    delay(1000);
   
   for(int d=0; d<3; d++)
   {
        for(int c=0; c<4; c++)
          {
            //dtostrf(float, widt, precision, buffer);
              dtostrf(line1[c], 5, 2, reads[c]);    
          }
          
          sprintf(txt1, "%s %s %s %s", read1, read2, read3, read4);     
          Serial.print(txt1);    Serial.print("  Texto"); Serial.println(d); 
          
   }    
   Serial.println("    ");
}

Este es mi codigo hasta ahora..
estas son algunas salidas del serial;

Iniciando Programa
10.00  9.00  110.00  20.00  Float0
10.00  -1.00  63.00  80.00  Float1
55.00  124.00  62.00  35.00  Float2
     
55.00 124.00 62.00 35.00  Texto0
55.00 124.00 62.00 35.00  Texto1
55.00 124.00 62.00 35.00  Texto2
    
32.00  75.00  -1.00  35.00  Float0
106.00  7.00  0.00  43.00  Float1
100.00  1.00  -1.00  204.00  Float2
     
100.00  1.00 -1.00 204.00  Texto0
100.00  1.00 -1.00 204.00  Texto1
100.00  1.00 -1.00 204.00  Texto2
    
7.00  64.00  0.00  -1.00  Float0
18.00  33.00  86.00  1.00  Float1
53.00  27.00  44.00  66.00  Float2

Parece que todo esta bien, sin embargo.. no logro co-relacionar filas y columnas de los datos usando los pointers...

Aqui;

for(int b=0; b<3; b++)
    {
     lines[b]; 
     
      for(int a=0; a<4; a++)
        {
          line1[a] = (random(0,254)/ random(0,5));

Lo que hago es iniciar un contador, para ir "llenando" cada uno de los tres renglones... luego incio otro contador, para llenar cada una de las 4 espacios de cada renglon... el detalle surge en line1[a]...
obviamente esto siempre apunta a la linea 1...

Y yo necesito hacer algo que "llene" los 4 espacios de la linea1... y después cambie a linea2...

Por eso tengo un pointer lines[4] que "apunta a cada una de las lineas, y tengo uno que se llama "columns" ... que en teoria deberia servir para añadir un dato en cada espacio.

AAAAA ya lo ando crakeando...

Este codigo... genera coreectamente los numeros y las lineas;

//-------arrays to hold the temperature readings 
float line1[4];
float line2[4];
float line3[4]; 

//-------pointers to adress each memory location on arrays
float *lines[3] = {line1, line2, line3};
float *column[4];

//-------char to convert a reding 
char read1[7]; 
char read2[7];
char read3[7]; 
char read4[7];

//-------pointers to adress each read char
char* reads[4]= {read1, read2, read3, read4}; 

//-------char to assembly each data in to a text row to display 
char txt1[45];
char txt2[45];
char txt3[45];

void setup() 
{
lines[0] = line1;
lines[1] = line2;
lines[2] = line3; 

Serial.begin(9600);
Serial.println("Iniciando Programa"); 
}

void loop() 
{
    for(int b=0; b<3; b++)
    {
     *lines[b]; 
     
      for(int a=0; a<4; a++)
        {
          //line1[a] = (random(0,254)/ random(0,5));
          *column[a] = (random(0,254)/ random(0,5)); 
          Serial.print(*column[a]); Serial.print("  ");
        }
      Serial.print("Float");Serial.println(b);
      if(b == 2)Serial.println("     ");      
    }
    
    delay(1000);
   
   for(int d=0; d<3; d++)
   {
     *lines[d]; 
        for(int c=0; c<4; c++)
          {
            //dtostrf(float, widt, precision, buffer);
              dtostrf(*column[c], 5, 2, reads[c]);    
          }
          
          sprintf(txt1, "%s %s %s %s", read1, read2, read3, read4);     
          Serial.print(txt1);    Serial.print("  Texto"); Serial.println(d); 
          
   }    
   Serial.println("    ");
}

Pero tengo mal la parte en que lo convierte a texto y lo imprime;

Iniciando Programa
10.00  9.00  110.00  20.00  Float0
10.00  -1.00  63.00  80.00  Float1
55.00  124.00  62.00  35.00  Float2
     
 0.00  0.00  0.00  0.00  Texto0
 0.00  0.00  0.00  0.00  Texto1
 0.00  0.00  0.00  0.00  Texto2
    
32.00  75.00  -1.00  35.00  Float0
106.00  7.00  0.00  43.00  Float1
100.00  1.00  -1.00  204.00  Float2
     
 0.00  0.00  0.00  0.00  Texto0
 0.00  0.00  0.00  0.00  Texto1
 0.00  0.00  0.00  0.00  Texto2
    
7.00  64.00  0.00  -1.00  Float0
18.00  33.00  86.00  1.00  Float1
53.00  27.00  44.00  66.00  Float2