Go Down

Topic: Separar números por decenas, centenas, millares...etc (Read 11627 times) previous topic - next topic

AlexPocholo

Como puedo hacer para que el lcd para hacer una suma separada me Arduino los números en decenas, centenas, etc ...?. Yo quiero que aparezca bien 999.999.999, separados por puntos o comas. He intentado varias cosas y tal, pero no consigo sacarlo. ¿Alguien podría ayudarme?

Serian los números de abajo en la foto, que es el marcador de un Pinball

noter

Prueba algo así:
Code: [Select]

  char buffer[15];
  unsigned long numero = 35000000;
  sprintf(buffer, "%02d,%03d,%03d", numero / 1000000, (numero%1000000)/1000, numero%1000);
  Serial.print(buffer);

GO_zalo

Lo tendria que comprobar, pero me parece mucho mas rápido para el procesador hacer

Code: [Select]

sprintf(buffer, "%d", numero);



Y luego recorrer el buffer del revés (desde las unidades), y cada tres caracteres intercalar un '.' pasándolo todo al buffer final.

no tengo el compilador aqui y el compilador online no me funciona así que no lo puedo probar

perrociego

#3
Feb 15, 2015, 12:01 pm Last Edit: Feb 15, 2015, 12:02 pm by perrociego
Estimado noter y  GO_zalo:

Los felicito por el código y el manejo de texto. Yo cuando vi que se quería pensé que en 10 o 20 lineas de código lo podía resolver. Pero noter lo hizo en una sola !!!  :D . A mi me pareció inmejorable, pero luego GO_zalo ve una manera de optimizarlo (a mi no me hubiera preocupado, prefiero que el código este correcto y elegante antes que optimo) y esta mejor.

El iniciador del post, como la mayoría de las veces en este foro en español, desapareció o esta escondido. ¿gasta mucho las teclas escribir gracias, solucionado, etc?

Saludos.

GO_zalo

perrociego gracias por la felicitación, ya que no lo hace el iniciador del post jajaja

yo estoy acostumbrado a andar al limite de los recursos por eso siempre pienso en optimizar, el tema de que efectivamente se vuelve menos elegante i menos legible, se puede solucionar con unos buenos comentarios a parte de evidentemente un correcto tabulado

dabidoom

Hola buenas antes de todo agradecer a este foro por su ayuda y sus extensos foros , yo tengo el mismo problema que menciona el amigo "AlexPocholo"necesito mostrar en un display sumas de millones, las cuales estén separadas correctamente por comas o puntos, y las elevadas cifras de ceros de los millones no amontonen la vision del lcd...

http://forum.arduino.cc/index.php?action=dlattach;topic=300069.0;attach=114105;image

Un saludo y desde ya gracias!
Estaré atento al foro :D

surbyte

Y porque no usas la solución planteada?
Recuerda usar tags cuando pongas imagenes, links o códigos.
Tu imagen debe verse asi

AlexPocholo

Prueba algo así:
Code: [Select]

  char buffer[15];
  unsigned long numero = 35000000;
  sprintf(buffer, "%02d,%03d,%03d", numero / 1000000, (numero%1000000)/1000, numero%1000);
  Serial.print(buffer);

perdonad por no haber contestado, pense que no se habia subido el hilo. Acabo de probar eso y no consigo nada, siguen viendose los numeros seguidos sin estar separados :(

noter


AlexPocholo

Lo tendria que comprobar, pero me parece mucho mas rápido para el procesador hacer

Code: [Select]

sprintf(buffer, "%d", numero);



Y luego recorrer el buffer del revés (desde las unidades), y cada tres caracteres intercalar un '.' pasándolo todo al buffer final.

no tengo el compilador aqui y el compilador online no me funciona así que no lo puedo probar
No entiendo muy bien lo que me dices, nunca he usado buffer

AlexPocholo

Pon tu código y lo revisamos.
Aquí tenéis, espero que podamos sacarle solución. Es lo único que me falta para acabar.

Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

long contador = 0;
long cuenta = 0;
long palabra = 0;
long alex = 0;
long rampa = 0;
long giros = 0;
long sixuno = 0;
long sixdos = 0;
long sixtres = 0;
long calavera = 0;
long supercombo = 0;






int pinA0 = A0;
int pinA1 = A0;
int pinA2 = A2;
int pinA3 = A3;
int pinA4 = A4;
int pinA5 = A5;
int led = 0;
int led1 = 1;
int led6 = 6;
int led7 = 7;
int pin8 = 8;
int led9 = 9;
int pin10 = 10;
int pin13 = 13;

void setup()
{
 
 
  pinMode(A0, INPUT); //altavoz
  pinMode(A1, INPUT); //altavoz
  pinMode(A2, OUTPUT); //DIANAS VERDES
  pinMode(A3, OUTPUT); //DIANAS ROJAS
  pinMode(A4, OUTPUT);//RAMPA SECUNDARIA
  pinMode(A5, OUTPUT); //RESET
  pinMode(led, OUTPUT); //LED JACKPOT
  pinMode(led1, OUTPUT); //LED CALAVERA
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(pin8, OUTPUT); //COMBO 1
  pinMode(led9, OUTPUT);
  pinMode(pin10, OUTPUT);  //COMBO 2
  pinMode(pin13, OUTPUT); //RAMPA PRINCIPAL
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL");
   tone (A0, 1000, 100);
   delay(100);
   tone (A1, 500, 400);
   delay(400);
   tone (A0, 700, 400);
   delay(400);
   tone (A1, 1400, 400);
   delay(400);
 


 
 
}

 

void loop()
{
 
 
digitalWrite(led, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led9, HIGH);
 
 lcd.setCursor(0, 1);
 lcd.print(contador);
 
 
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------

 
 
 
 
 if (digitalRead (A5) ==HIGH) //RESET
{
if (contador<100)
{
  lcd.setCursor(0, 0);
  lcd.print("                                       ");
  lcd.setCursor(0, 0);
  lcd.print(" MUCHAS GRACIAS ");
 
 
  tone(A0, 293.66, 450);
  delay(450);
  tone(A1, 440.00, 250);
  delay(250);
  tone(A0, 293.66, 250);
  delay(250);
  tone(A1, 293.66, 400);
  delay(400);
  tone(A0, 440.00, 300);
  delay(300);
  tone(A1, 293.66, 350);
  delay(350);
  tone(A0, 349.23, 300);
  delay(300);
  tone(A1, 392.00, 350);
  delay(350);
  tone(A0, 349.23, 300);
  delay(300);
  tone(A1, 392.00, 350);
  delay(350);
  /*
  tone(pin7, 329.63, 300);
  delay(300);
  tone(pin13, 392.00, 300);
  delay(300);
  tone(pin7, 329.63, 400);
  delay(400);*/
 
 
 
 
 
  lcd.setCursor(0, 0);
  lcd.print(" METAL  PINBALL "); 
 
}
}


//----------------------------------------------------------------------------------------------------

  if (digitalRead (A5) ==HIGH) //RESET
{
if (contador>100)
  {
    tone(A0, 1500, 200);
    delay(200);
    tone(A1, 1800, 200);
    delay(200);
    contador =0;
    cuenta =0;
    palabra =0;
    alex =0;
    giros =0;
    rampa =0;
   
    lcd.setCursor(0, 1);
    lcd.print("                                    ");
    lcd.setCursor(0, 0);
    lcd.print("                                 ");
   
   
   lcd.setCursor(2, 0);
   lcd.print("R");
   delay(150);
   lcd.setCursor(3, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(4, 0);
   lcd.print("S");
   delay(150);
   lcd.setCursor(5, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(6, 0);
   lcd.print("T");
   delay(150);
   lcd.setCursor(7, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(8, 0);
   lcd.print("A");
   delay(150);
   lcd.setCursor(9, 0);
   lcd.print("N");
   delay(150);
   lcd.setCursor(10, 0);
   lcd.print("D");
   delay(150);
   lcd.setCursor(11, 0);
   lcd.print("O");
   delay(150);
   lcd.setCursor(12, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(13, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(14, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(2, 0);
   lcd.print("                       ");
   delay(150);
   lcd.setCursor(2, 0);
   lcd.print("RESETEANDO");
   tone(A0, 1340, 200);
   delay(200);
   lcd.setCursor(2, 0);
   lcd.print("                       ");
   delay(200);
   lcd.setCursor(2, 0);
   lcd.print("RESETEANDO");
   tone(A1, 1600, 200);
   delay(200);
   
   
   lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL ");
   
   
   
   
    tone(A0, 43.066406, 10);
   delay(10);
   tone(A1, 86.132813, 10);
   delay(10);
   tone(A0, 129.199219, 10);
   delay(10);
   tone(A1, 172.265625, 10);
   delay(10);
   tone(A0, 215.332031, 10);
   delay(10);
   tone(A1, 301.464844, 10);
   delay(10);
   tone(A0, 344.531250, 10);
   delay(10);
   tone(A1, 387.597656, 10);
   delay(10);
   tone(A0, 430.664063, 10);
   delay(10);
   tone(A1, 473.730469, 10);
   delay(10);
   tone(A0, 516.796875, 10);
   delay(10);
   tone(A1, 559.863281, 10);
   delay(10);
   tone(A0, 602.929688, 10);
   delay(10);
   tone(A1, 645.996094, 10);
   delay(10);
   tone(A0, 689.062500, 10);
   delay(10);
   tone(A1, 732.128906, 10);
   delay(10);
   
   
   
 }
 
}

//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------


 if (digitalRead (13)==HIGH) //RAMPA PRINCIPAL
 {
   contador=contador+1000;
   tone(A1, 86.132813, 10);
   delay(10);
   tone(A0, 172, 10);
   delay(10);
   tone(A1, 258, 10);
   delay(10);
   tone(A0, 344, 10);
   delay(10);
   tone(A1, 430, 10);
   delay(10);
   tone(A0, 516, 10);
   delay(10);
   tone(A1, 602, 10);
   delay(10);
   tone(A0, 689, 10);
   delay(10);
   tone(A1, 775, 10);
   delay(10);
   tone(A0, 861, 10);
   delay(10);
   tone(A1, 947, 10);
   delay(10);
   tone(A0, 1033, 10);
   delay(10);
   tone(A1, 1119, 10);
   delay(10);
   tone(A0, 1205, 10);
   delay(10);
   tone(A1, 1291, 10);
   delay(10);
   tone(A0, 1378, 10);
   delay(10);
   tone(A1, 1464, 10);
   delay(10);
   tone(A0, 1550, 10);
   delay(10);
   lcd.setCursor(0, 1);
   lcd.print(contador);
   lcd.setCursor(0, 0);
   lcd.print("                               ");
   lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL ");
   giros=0;
 
   



No me cabe el codigo entero, he puesto solo una pequeña parte

noter

Veo que no te has aclarado mucho de qué iba el código que puse  ::) . Con sprintf lo que hago es escribir los caracteres en una cadena en memoria. Esa cadena es la que luego mostramos por serial o por lcd. Debes sustituir un par de cosillas para adaptarlo a lo tuyo. Donde has puesto lcd.print(contador) deberías poner

Code: [Select]

  char buffer[15];
  sprintf(buffer, "%02d,%03d,%03d", contador / 1000000, (contador%1000000)/1000, contador%1000);
  lcd.print(buffer);

AlexPocholo

Veo que no te has aclarado mucho de qué iba el código que puse  ::) . Con sprintf lo que hago es escribir los caracteres en una cadena en memoria. Esa cadena es la que luego mostramos por serial o por lcd. Debes sustituir un par de cosillas para adaptarlo a lo tuyo. Donde has puesto lcd.print(contador) deberías poner

Code: [Select]

  char buffer[15];
  sprintf(buffer, "%02d,%03d,%03d", contador / 1000000, (contador%1000000)/1000, contador%1000);
  lcd.print(buffer);

Vale, algo he avanzado con esto, pero no me funciona muy bien. ¿Deberia de poner eso en todos los lcd.print(contador) que tenga? Es decir, borrar lcd.print(contador) y poner eso.

noter

Sí.
Aunque otra opción, es meter esos comandos en una función (por ejemplo imprimepuntuacion()) y sustituir todos los lcd.print(contador) por imprimepuntuacion(). Si además del contador estás pintando el resto de la pantalla de la misma forma siempre, puedes incluir en la función los demás pasos del pintado en una función pintarpantalla() que haga todo, en lugar de repetir los mismos pasos una y otra vez.

AlexPocholo

Sí.
Aunque otra opción, es meter esos comandos en una función (por ejemplo imprimepuntuacion()) y sustituir todos los lcd.print(contador) por imprimepuntuacion(). Si además del contador estás pintando el resto de la pantalla de la misma forma siempre, puedes incluir en la función los demás pasos del pintado en una función pintarpantalla() que haga todo, en lugar de repetir los mismos pasos una y otra vez.

Ya he conseguido avanzar, me llega perfectamente a 999,000 con su coma y tal. Hasta ahi perfecto. A la hora de pasar al millón se me queda así "1000,000" ¿que puedo hacer para que se quede así "1,000,000"?

lo que he usado para ello ha sido lo que me pusiste de sprintf y buffer, he puesto esto:

Code: [Select]
char buffer[15];
  sprintf(buffer, "%01d,%03d", contador / 1000, (contador%1000)/1000);
  lcd.print(buffer);[code]
[/code]

Go Up