Show Posts
Pages: 1 ... 70 71 [72] 73 74 ... 95
1066  Using Arduino / Programming Questions / Convert float and long to string to complete a LCD I2C library on: August 28, 2011, 05:31:17 pm
Hello, I know there are many convert 'this' to 'this' questions, and I believe I have gone through all of them and yet cant fix my problem, so please excuse yet another post.

I bought this LCD that has I2C to communicate 20 x 4 LCD Module With I2C & Keypad Controller

http://cgi.ebay.es/I2C-Serial-LCD-Display-Module-20-x-4-keypad-Control-/110609652307?pt=UK_BOI_Electrical_Test_Measurement_Equipment_ET&hash=item19c0d95a53

It has a HD44789 Controller and a BV4218 I2C LCD Display Controller.

However their Library is not very complete and as to printing only handles strings and chars.
Code:
// **************************************************************
// sends char
// **************************************************************
void BV4618_I::putch(char c)
{
  Wire.beginTransmission(_i2adr);
  Wire.send(c);
  Wire.endTransmission();
}  

// **************************************************************
// sends string
// **************************************************************
void BV4618_I::puts(char *s)
{
char *sp=s;  
  Wire.beginTransmission(_i2adr);
  // send *s as bytes of date
  while(*sp)
    Wire.send(*(sp++));
  Wire.endTransmission();
}  

I would like to create a function to send a float directly, I have tried this but my program freezes.

Code:
void BV4618_I::putf(float st, int decimales)
{
  static char * sp = "         ";
  sp = dtostrf( st, 4, decimales, sp );
    Wire.beginTransmission(_i2adr);
  // send *s as bytes of date
  while(*sp)
    Wire.send(*(sp++));
  Wire.endTransmission();
}

Any help would be great, I have spend more hours I can count with problems of my program freezing because of this.
plus it would bevery useful for others with the same display.

Thanks a lot

PS:
This is the original library link http://www.practicalmaker.com/library/arduino-byvac-bv4218-complete-library
1067  International / Español / Re: "Machacar" la memoria al declarar mal las variables?¿?¿? on: August 28, 2011, 03:12:04 pm
no si el error ya lo he vivido. El problema es que si no declaras algo asi
int varible = 123.45;
sino que es dentro del programa y durante su ejecución que se llega a esa situación, el compilador no se entera y te deja subir el programa. Y no es hasta que ocurre la asociación que el arduino empieza a hacer cosas raras.

Es por ello que me interesa saber que ocurre dentro del Arduino en estos casos.
Gracias.
1068  International / Español / Re: Uso del chip Shift Register (74HC595) on: August 28, 2011, 03:08:31 pm
esta semana tambien salio este tutorial muy bueno
http://tronixstuff.wordpress.com/2011/08/26/tutorial-maximising-your-arduinos-io-ports/
1069  International / Español / Re: Pasar de un tipo de variable a otro on: August 28, 2011, 03:06:13 pm
La solución mas practica es reescribir la libreria y sobrecargar el metodo en cuestion.
Te pongo un trozo de codigo de la libreria que tengo hecha para mi pantalla.
Code:
void LCD128x64Class::Write(char* st)
{
  Serial1.print(st);
}

void LCD128x64Class::Write(int st)
{
  Serial1.print( st, DEC );
}

void LCD128x64Class::Write(long st)
{
  Serial1.print(st, DEC );
}

void LCD128x64Class::Write(float st)
{
  static char * valor = "         ";
  valor = dtostrf( st, 4, 2, valor );
  Serial1.print(valor);
}

void LCD128x64Class::Write(float st, int decimales)
{
  static char * valor = "         ";
  valor = dtostrf( st, 4, decimales, valor );
  Serial1.print(valor);
}
Lo mismo que yo e sobrecargado el metodo Write tu puedes hacerlo con tu metodo puts(char *s).

Saludos.


Dukatus cuando tienes esa funcion llamada en todos los casos igual, como decide cual tiene que ejecutar cuando es llamada? Que hace mirar lo que estas enviando y en base a eso escoger entre ellas?
cuando llamas a la funcion le indicas el tipo?
LCD.Write(float 123.24)
o solo envias el numero?

acabo de ver que usas "dtostrf", a ver si puedo adaptar mi libreria y hacer lo mismo y asi no tengo que hacer cosas como esta en el codigo del programa.
Code:
float coste;
      coste = (emon.sumakw/1000)*preciokwh;    // por decidir donde lo meto
      int costedecimales = (coste - (int)coste) * 100;
      sprintf(coste_data,"%0d.%02d E  ",(int)coste,costedecimales);  //d - el argumento es tratado como un integer y presentado como un número decimal (con signo).
      di.puts(coste_data);

seria pillar esto y adaptarlo,no?
Code:
// **************************************************************
// sends char
// **************************************************************
void BV4618_I::putch(char c)
{
  Wire.beginTransmission(_i2adr);
  Wire.send(c);
  Wire.endTransmission();


// **************************************************************
// sends string
// **************************************************************
void BV4618_I::puts(char *s)
{
char *sp=s; 
  Wire.beginTransmission(_i2adr);
  // send *s as bytes of date
  while(*sp)
    Wire.send(*(sp++));
  Wire.endTransmission();

1070  International / Español / "Machacar" la memoria al declarar mal las variables?¿?¿? on: August 28, 2011, 02:53:19 pm
Hola, a raiz de este post que sigo investigando pero que parece que igual ya he visto la luz...
http://arduino.cc/forum/index.php/topic,70532.0.html

Me gustaria entender mejor como trabaja internamente el Arduino en estos casos y no se como se denomina este problema como para buscarlo por la red especificamente para Arduino.

Si declaras una variable tipo INT y despues durante tu programa le intentas meter un valor mayor por ejemplo un float?

he visto que en ocasiones funciona el programa (cuando este es sencillo), pero en programas mas extensos al final acaba bloqueandose.

como responde Arduino a este tipo de conflictos?
cosas como
Declaras una variable INT (2bytes) y le intentas guardar un float (4 bytes)
Declaras una variable LONG (4bytes) y le intentas guardar un float (4 bytes) pero con decimales y un rango distinto.
Declaras una variable byte (1bytes) y le intentas guardar un float (4 bytes) o lo que sea
etc etc.
ah y tambien, si declaras un char varible[4]; y luego le quieres meter mas bytes de los que has declarado

Igual entendiendo como responde Arduino a esto, consigo terminar de depurar mi programa.
Muchas gracias !!
1071  International / Español / Re: Duda I2C on: August 28, 2011, 02:42:20 pm
Yo si no fuera por los gastos de envio pediria mas cosas ... pero es que 10 eur lo veo desproporcional. y para algo que vale 2 eur.
tendré que seguir esperando a necesitar mas cosas, para un pedido de unos 60 eur no está tan mal la cosa y ademas lo traen a casa.

tengo el quadcopter parao porque pedir las palas me salen 18 eur en casa 4 trozos de plastico.  pero bueno ..

es que vaya pasada 10 euros de envio.

yo cada vez mas intento comprar las cosas de hong kong, esta claro que hay cosas que es imposible, pero vamos que prefiero esperar unas semanas y ya no solo por los 10euros. a ver si asi se les baja los humos y ponen gastos de envio reales. que lo que hacen ahora es, me da igual lo que pidas, me voy a llevar 6 euritos de ti "porque si".
1072  International / Español / Re: Pasar de un tipo de variable a otro on: August 26, 2011, 10:01:00 am
lo que has dicho curro de machacar la memoria me ha llevado a comentar todo el codigo que menciono en mi primer mensaje de "funciona pero no se porque"
y ahora el tema de las horas ya funciona,
voy a seguir investigando pero puede que tuviese un codigo que "funcionaba" pero que estropeaba cosas por dentro de la memoria y hace que el programa se bloquee en otros trozos de codigo
no se si me explico.
1073  International / Español / Re: Pasar de un tipo de variable a otro on: August 26, 2011, 09:46:38 am
Pregunta...
Es posible que a lo largo del programa cuando he utilizado código tipo el siguiente, este "dañando" la memoria y que luego aunque haga una conversión bien, falle ????

Code:
double apparentPower;
char time_str[4];  // Define as a string (4 bytes)
...
      di.rowcol(2,1);
      di.puts(ltoa(apparentPower, time_str, 10));   di.puts(" Watts ");


Tengo el proyecto al 99% a falta de tan solo imprimir en el LCD una linea con el tiempo que lleva el arduino encendido (uptime).
y de paso a ver si aprendo a hacer bien las conversiones y sacarlas por LCD.

os agradezco mucho la ayuda.
1074  International / Español / Re: Pasar de un tipo de variable a otro on: August 26, 2011, 09:35:50 am
La solución mas practica es reescribir la libreria y sobrecargar el metodo en cuestion.
Te pongo un trozo de codigo de la libreria que tengo hecha para mi pantalla.

Lo mismo que yo e sobrecargado el metodo Write tu puedes hacerlo con tu metodo puts(char *s).

Saludos.


sin duda creo que esa es la solución final, pero ahora mismo me viene un poco grande hacer eso ya que si estoy teniendo tantos problemas con unas conversiones y mostrarlo en pantalla, todavia no me veo reescribiendo la libreria.
en el enlace este dicen que van a hacerlo en el futuro, pero no cuento con ello ya que lo pusieron hace mucho tiempo. http://doc.byvac.com/index.php5?title=Talk:Arduino_BV4618

adjunto la libreria, no para que me la reescribas sino por si hay algo que yo no veo y hace que no funcione el programa, aunque creo que tengo un lio absoluto en las conversiones.

gracias por vuestra ayuda
1075  International / Español / Re: Pasar de un tipo de variable a otro on: August 26, 2011, 09:31:34 am


Hola,
Creo que estás machacando memoria, y eso origina resultados imprevisibles:
Code:
char uptime_data[4];          
sprintf(uptime_data,"T: %0d  ",horass);
defines una  cadena char uptime_data[4] de 4 bytes (3 caracteres + null), y luego le estás metiendo una 'T', un ':', un espacio, uno o dos caracteres de la hora y dos espacios, en total  6 o 7 caracteres!
Prueba definiendo
char uptime_data[10];  


mm... bien visto, sin duda eso puede ser uno de los problemas. pero sigue sin funcionar.

Code:
int horas;
                horas = (int)((float)currentMillis/3600000.0);
char uptime_data[10];
                sprintf(uptime_data,"%d%d",(int)horas,(int)horas);
                di.puts(uptime_data);

he dejado al margen iminutos a ver si consigo que al menos me aparezca 2 veces hora.
1076  International / Español / Re: Pasar de un tipo de variable a otro on: August 26, 2011, 08:56:36 am
por lo que veo si intento realizar muchos calculos en una misma linea me da mas problemas, ahora lo he pasado a esto y por serial me aparece bien, pero al descomentar la linea que lo envia al LCD se bloquea

Code:
             int horas;
                    horas = (int)((float)currentMillis/3600000.0);
              long minutos;
                   minutos = (int)horas*3600000;  
                   minutos = currentMillis - minutos;
                   minutos = (int)((float)minutos / 60000.0);
              int iminutos = (int)minutos;    
              Serial.print(horas);Serial.print(":");Serial.print(iminutos);Serial.println();

                sprintf(uptime_data,"T: %0d  ",(int)horas);
                di.puts(uptime_data);


si quito:
Code:
               sprintf(uptime_data,"T: %0d  ",(int)horas);
                di.puts(uptime_data);

por serial me aparece bien, pero si se lo envio al LCD se bloquea, y eso que solo estoy enviado "horas"
importante: creo que es el sprintf lo que falla ya que si comento esa linea si que funciona.
lo que no enteindo es que en principio estoy haciendo lo mismo que en los ejemplos anteriores,no?
1077  International / Español / Pasar de un tipo de variable a otro on: August 26, 2011, 08:46:53 am
Hola, me gustaria abrir este post para analizar los metodos de pasar de un tipo de variable a otro.
Estoy teniendo muchos problemas con mi pantalla LCD ya que cuando le envio datos para mostrar si no tengo las variables perfectamente definidas y segun espera la libreria, me cuelga el programa.
Le he metido muchiiiiiisimas horas y algo he avanzado, a ver si entre todos me ayudais a terminar de pulirlo porque sigue dandome problemas
El titulo del post no menciona nada de LCD porque en principio este post deberia servir para cualquier caso.
Al tema...

La libreria de mi pantalla LCD I2C realiza esta función.
Code:
// **************************************************************
// sends string
// **************************************************************
void BV4618_I::puts(char *s)
{
char *sp=s;  
  Wire.beginTransmission(_i2adr);
  // send *s as bytes of date
  while(*sp)
    Wire.send(*(sp++));
  Wire.endTransmission();
}  


Esto funciona sin problemas ya que es un simple string y es el ejemplo mas sencillo.
Code:
di.puts("Hello World");

A partir de ahi empiezan los problemas cuando la sentencia que le envio no es como quiere.
Esto funciona, no entiendo porque ya que si currentMillis es 12345 el resultado de la división es 12.345 que es un float en lugar de un long ????¿?¿?¿?
Code:
unsigned long currentMillis;
char time_str[4];  // Define as a string (4 bytes)
currentMillis = millis();

di.puts(ltoa (currentMillis/1000, time_str, 10));

Esto funciona y tampoco entiendo porque, ya que apparentPower es un double y no un long para usar ltoa
Code:
double apparentPower;
char time_str[4];  // Define as a string (4 bytes)
...
      di.rowcol(2,1);
      di.puts(ltoa(apparentPower, time_str, 10));   di.puts(" Watts ");

Esto lo aprendi ayer y me ha ayudado mucho ya que esto me funciona en un programa por separado donde solo haya este codigo.
Code:
char lcd_data[70];
  di.rowcol(1,1);
  
float horas = time/3600000;
long segminuto = ((time - (int)horas*3600000));
int minutos = (segminuto / 60000);
int segundos = ((segminuto - minutos*60000) / 1000);
// coge todos los segundos y le resta los segundos correspondientes a las horas de "horas"
// de esta resta nos quedan los segundos sin contar las horas (es decir los segundos hacia
// la proxima hora completa

  sprintf(lcd_data,"Time: %0d:%02d:%02d",(int)horas,minutos,segundos);
  di.puts(lcd_data);

En cambio ahora quiero hacer eso mismo en un proyecto y se me bloquea el programa. Si descomento estas lineas el programa entero funciona perfecto.
Code:
char uptime_data[4];

              float horas;
                    horas = ((float)currentMillis/3600000.0);
              long minutos;
                   minutos = currentMillis - (int)horas*3600000;  
                                     
              int horass;
                  horass = (int)horas;
              
                sprintf(uptime_data,"T: %0d  ",horass);
                di.puts(uptime_data);

He leido mucho de tipos de variables pero no termino de saber que pasa.
Se que hay mucho aquí, pero si alguien tiene alguna sugerencia igual puede ayudarme.
gracias
1078  International / Español / Re: dronesizer on: August 26, 2011, 07:23:28 am
al definir las array las termina con
Code:
,  }

segun http://arduino.cc/es/Reference/Array
deberia acabar con el ultimo elemento de la lista
int myArray[10]={9,3,2,4,3,2,7,8,9,11};

Code:
float sinC[3][SINC_LENGTH] = {
  {//sinus
    0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008 }
  ,
  {//saw
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
  ,
  {//tri
    0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0 }
};

prueba a ver si el numero de errores se reduce o igual hay algo que yo no se.
1079  International / Español / Re: [SOLUCIONADO] Donde esta la librería de la funcion Pinmode? on: August 26, 2011, 06:31:04 am
1080  International / Español / Re: [SOLUCIONADO]puertos arduino mega rs-485 on: August 26, 2011, 06:29:21 am
Sin duda la firma de Heke cada vez se reafirma mas....
Pages: 1 ... 70 71 [72] 73 74 ... 95