Go Down

Topic: Ayuda con variables. [SOLUCIONADO POR NOTER] (Read 3092 times) previous topic - next topic

elricho

#30
May 15, 2015, 11:20 pm Last Edit: May 15, 2015, 11:30 pm by elricho
Bueno le hice 1 pequeña modificación para que solo muestre 8 lineas y no salga en dos columnas.
Y le agrege el '0' para ver si da final a la cadena, estamos mas cerca, pero sigue sin funcionar.
Arranca bien al principio y despues se vuelve loco. :smiley-confuse:
Video de lo que hace ahora.

https://www.youtube.com/watch?v=eIugvjWd2rs


Code: [Select]
#include <U8glib.h>
#include <RelojDS1307.h>
#include <Wire.h>

U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
char* Eventos[8] ={"12345678901234567890","dos","tres","cuatro","cinco","seis","siete","ocho"};
RelojDS1307Class Reloj; //Declaración de la variable del Rejoj
int currEvent = 0;
int bucle=0;
static char tmp[25];

void setup()
{
}

void loop() {
     bucle ++;
     sprintf(tmp,"Evento %d",bucle);
     EventoNuevo(strcat(Reloj.Time(),tmp));
     imprimeEventos();
}

void imprimeEventos()
{
  u8g.firstPage();
  do{
    u8g.setFont(u8g_font_tpss);
    u8g.drawStr(30, 12, "Ult.Eventos");
    u8g.drawFrame(28,0,60,15);//recuadro
    u8g.setFont(u8g_font_micro);
    for (int Renglon = 0; Renglon < 8; Renglon++ )
     {    
        u8g.drawStr(1, 21+(Renglon*6), Eventos[Renglon]);
     }
    }
    while( u8g.nextPage() );  
}  

///////////////////////////////////////////////////////////////////////////////////////// Ultimos Eventos
void EventoNuevo( char* QuePaso)
{
  sprintf(Eventos[currEvent], "%s", QuePaso+'\0');
  currEvent++;
  currEvent %= 8;
  delay(5000);
}

elricho

Prueba a cambiar tus funciones implementando algo así.

Code: [Select]

// Variables globales
char eventos[16][20] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"};
int currEvent = 0;

// Push a la cola de eventos
void EventoNuevo( char* QuePaso )
{
  sprintf(eventos[currEvent], "%s", QuePaso);
  currEvent++;
  currEvent %= 16;
}

// Impresión cola de eventos
void imprimeEventos() {
  int i = currEvent + 1;
  i %= 16;
  do {
    Serial.println(eventos[i]);
    i++;
    i %= 16;
  } while (i != currEvent);

}


Y me cuentas ;)
Noter,

 no entiendo bien que haces en la rutina de asignacion, osea sumas  1 currevent, y despues   currEvent %= 8; que haria ? cual es el proposito de eso ?
gracias


sprintf(Eventos[currEvent], "%s", QuePaso+'\0');
  currEvent++;
  currEvent %= 8;

noter

Es el operador resto de división o módulo. Puedes poner en su lugar
if(currEvent==8) currEvent=0;
Y causa el mismo efecto.

elricho

Bueno despues de mirar un par de video de c de manejo de array, cambie la forma de manejar y logre hacer andar todo como estaba en 1 principio, la falla a mi ver es que no le gustaba los punteros, asi que cambie la forma de declarar el  array y santo remedio.
La verdad me volvio loco, por suerte anda de maravilla. Gracias y en especial noter por tu ayuda. Ya lo habias puesto en tu ejemplo y no me habia dado cuenta ya que no copie tu codigo completo donde estaba la declaracion del array, por eso me seguia fallando porque tenia char* Eventos[8]  hasta que me di cuenta viendo unos videos.

Caso cerrado !

noter

#34
May 16, 2015, 11:25 am Last Edit: May 16, 2015, 03:16 pm by noter
Sería interesante que pusieras el  código que te funciona para que pueda servir de ayuda a otros y editar el asunto del primer post y agregar [SOLUCIONADO].
En la declaración del array tienes que poner la segunda dimensión de suficiente tamaño como para que quepa la cadena más larga que vayas a usar más un carácter extra del terminador. Osea cuenta caracteres y añade uno a la cuenta, para evitar que los datos de una cadena desborden e invadan la siguiente.
Saludos.

elricho

#35
May 16, 2015, 03:56 pm Last Edit: May 16, 2015, 04:19 pm by elricho
Noter ningun problema, pero el codigo es el tuyo, osea cambiando la declaracion del array se soluciono.


noter

Veo que borraste tu último post, en el que hacías referencia a cómo mostrar el último evento como más reciente y que se borrara el más antiguo. Como habrás podido comprobar, la función muestraEvento "falsea" el array para recorrerlo desde la posición siguiente al agregado, volver al principio y seguir mostrando hasta llegar al recién ingresado, de manera que logramos ese efecto. Se conoce como un array circular o en anillo. En lugar de mover todos los punteros para que el 0 continúe siendo el primero y el 7 el último, vamos avanzando un índice que indica cuál es el último añadido y si, por ejemplo es el 5, mostraremos en orden 6, 7, 0, 1, 2, 3, 4 y 5, y la próxima vez que agreguemos será en el 6. ¿Entiendes más o menos el mecanismo?

surbyte


elricho

#38
May 17, 2015, 08:53 pm Last Edit: May 17, 2015, 08:54 pm by elricho
Veo que borraste tu último post, en el que hacías referencia a cómo mostrar el último evento como más reciente y que se borrara el más antiguo. Como habrás podido comprobar, la función muestraEvento "falsea" el array para recorrerlo desde la posición siguiente al agregado, volver al principio y seguir mostrando hasta llegar al recién ingresado, de manera que logramos ese efecto. Se conoce como un array circular o en anillo. En lugar de mover todos los punteros para que el 0 continúe siendo el primero y el 7 el último, vamos avanzando un índice que indica cuál es el último añadido y si, por ejemplo es el 5, mostraremos en orden 6, 7, 0, 1, 2, 3, 4 y 5, y la próxima vez que agreguemos será en el 6. ¿Entiendes más o menos el mecanismo?
Si gracias Noter, queda clarisimo.

Go Up