Go Down

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

surbyte

Digo yo porque la gente no pondrá las librerías que usa y sus codigos completos.

Resulta que quiero probarlo y errores porque lalibrería RTC que usa es distinta.

elricho

#16
May 14, 2015, 09:57 pm Last Edit: May 14, 2015, 10:12 pm by elricho
Bueno amigos, no funciona hace lo mismo,  pero bueno la voy a seguir peleando cuando encuentre la solucion se los paso.

Pero aclaro solo falla cuando quiero usar la variable que contiene la hora + evento, si uso el evento solo funciona perfecto !
Code: [Select]

void EventoNuevo( char* QuePaso )
{
    char HorayEvento[128];
    char* Hora = Reloj.Time();   
    for (int Bucle=1; Bucle<16; Bucle++)
    {
      Eventos[Bucle-1]=Eventos[Bucle];
    }
    strncpy(HorayEvento, Reloj.Time(), sizeof(HorayEvento));
    strncat(HorayEvento, QuePaso, (sizeof(HorayEvento) - strlen(HorayEvento)) );

    //Eventos[15]=HorayEvento;   si uso esa variable falla pisando los ult. valores con los miso

    Eventos[15]=QuePaso;  // asi funciona perfecto pero no tiene la hora
}

 

Gracias igual.

noter

¿Seguro que te funciona si sólo asignas el evento? No he visto tu código completo (no lo has puesto), pero supongo que es gracias a que has predefinido las cadenas de los eventos que vas a asignar en variables separadas. Entonces, tu función devuelve respectivamente las cadenas con las que has llamado a la propia función, no la cadena local de la función horayevento. El procedimiento para conseguir lo que estás intentando, sería definir el espacio global para los 16 eventos, y en la función escribir en ese espacio, en lugar de en uno local de dicha función.

elricho

#18
May 14, 2015, 11:36 pm Last Edit: May 15, 2015, 12:06 am by elricho
Lo defini el array antes del setup por lo que entiendo es global sino corregime.
Si quieren hago un programita chiquito ya que son miles de linea y no veo el sentido en postear miles de cosas cuando el problema es tan localizado como lo que les cuento, pero si quieren hago.

El codigo es tan sencillo como lo q mostre no hay mas que eso, una array definido, cuando pasa algo en una rutina lo llamo de la forma que mostre y la rutina mueve los valores mas viejos para arriba, y al ultima posicion del array le asigna el nuevo evento.

Tambien puedo hacer 1 videito corto para que veas como al apretar distintos botones sin usar el campo hora funciona de maravilla, si le agrega la hora chau.

Avisame que preferis y lo hago.

elricho

#19
May 15, 2015, 12:11 am Last Edit: May 15, 2015, 12:12 am by elricho
Fijate esto para que veas combinando eventos con y sin hora lo que pasa.
Notas que si bien los textos de los eventos son correctos le pone a todos la misma hora.

elricho

Y fijate ahora volvi a entrar unos minutos mas tarde y todo se corre perfectamente, pero mira la hora


noter

¿A que no serías capaz de hacer que entren en ese buffer cadenas que le envíes por puerto serie?
Algo así como

Code: [Select]

char bufferRecepcion[64];
void loop() {
  if(Serial.available()){
    int i=0;
    char a;
    do {
      while (!Serial.available()) ;
      a = Serial.read();
      if (a == '\n') a = '\0';
      bufferRecepcion[i++] = a;
    } while (a);
    EventoNuevo(bufferRecepcion);
    imprimeEventos();
  }
}



elricho

No muestra nada por pantalla con tu loop. :(

elricho

#23
May 15, 2015, 01:47 am Last Edit: May 15, 2015, 01:47 am by elricho
Aca te hice un ejemplo mas basico a ver si me pueden entender le problema, muy raro...

Les dejo el codigo
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[16] ={"uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","cartoce","quince","dieciseis"};
RelojDS1307Class Reloj; //Declaración de la variable del Rejoj

void setup()
{
}

void loop() {
     EventoNuevo(strcat(Reloj.Time()," Evento 1"));
     imprimeEventos();
   
     EventoNuevo(strcat(Reloj.Time()," Evento 2"));
     imprimeEventos();

     EventoNuevo(strcat(Reloj.Time()," Evento 3"));
     imprimeEventos();
}

void imprimeEventos()
{
  delay(5000);
  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 < 16; Renglon++ )
     {   
     if (Renglon<8)
     {
        u8g.drawStr(1, 21+(Renglon*6), Eventos[Renglon]);
     }
     else
     {
        u8g.drawStr(61, 21+((Renglon*6)-48), Eventos[Renglon]);
     }
    }
   
    delay(200);
    }
    while( u8g.nextPage() );
    delay(5000);
 



///////////////////////////////////////////////////////////////////////////////////////// Ultimos Eventos
void EventoNuevo( char* QuePaso)
{
    for (int Bucle=1; Bucle<16; Bucle++)
    {
      Eventos[Bucle-1]=Eventos[Bucle];
    }
    Eventos[15]=QuePaso;
}




Ese codigo hace lo siguiente les subo el video ! hagan click va a youtube

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

Asi pueden interpretar facilmente el problema, ahora si me piden que cambie y pruebe lo que me pidan, ya que este ejemplito es super facil de entender.


elricho

Digo yo porque la gente no pondrá las librerías que usa y sus codigos completos.

Resulta que quiero probarlo y errores porque lalibrería RTC que usa es distinta.

Ahi subi algo mas pequeño y facil de entender.

noter

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

Ambas cambian sustancialmente.

_jose_

#27
May 15, 2015, 12:25 pm Last Edit: May 15, 2015, 12:29 pm by _jose_
Ambas cambian sustancialmente.
Me refiero a las que puso el anteriormente.Borro el anterior post y lo pongo mejor.

_jose_

#28
May 15, 2015, 12:27 pm Last Edit: May 15, 2015, 12:30 pm by _jose_
Aca te hice un ejemplo mas basico a ver si me pueden entender le problema, muy raro...

Les dejo el codigo
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[16] ={"uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","cartoce","quince","dieciseis"};
RelojDS1307Class Reloj; //Declaración de la variable del Rejoj

void setup()
{
}

void loop() {
     EventoNuevo(strcat(Reloj.Time()," Evento 1"));
     imprimeEventos();
   
     EventoNuevo(strcat(Reloj.Time()," Evento 2"));
     imprimeEventos();

     EventoNuevo(strcat(Reloj.Time()," Evento 3"));
     imprimeEventos();
}

void imprimeEventos()
{
  delay(5000);
  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 < 16; Renglon++ )
     {   
     if (Renglon<8)
     {
        u8g.drawStr(1, 21+(Renglon*6), Eventos[Renglon]);
     }
     else
     {
        u8g.drawStr(61, 21+((Renglon*6)-48), Eventos[Renglon]);
     }
    }
   
    delay(200);
    }
    while( u8g.nextPage() );
    delay(5000);
 



///////////////////////////////////////////////////////////////////////////////////////// Ultimos Eventos
void EventoNuevo( char* QuePaso)
{
    for (int Bucle=1; Bucle<16; Bucle++)
    {
      Eventos[Bucle-1]=Eventos[Bucle];
    }
    Eventos[15]=QuePaso;
}




Ese codigo hace lo siguiente les subo el video ! hagan click va a youtube

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

Asi pueden interpretar facilmente el problema, ahora si me piden que cambie y pruebe lo que me pidan, ya que este ejemplito es super facil de entender.


La funcion EventoNuevo parece correcta ,a lo mejor podria ser la funcion imprimeEvento la que no esta bien.

elricho

Cuando llego a casa pruebo noter , un millon de gracias a todos x querer ayudarme.

Jose no entiendo x q dices que esta mal la funcion de mostrar, es muy sencilla solo un bucle q muestra los datos, no hay ningun manejo de variables si miras.


Despues les cuento.

Go Up