Problem mit Zahlen über 2 Zeilen auf einem 16x2 LCD

Hallo zusammen! Ich befasse mich zur Zeit mit LCD Zahlen die über 2 Zeilen gehen und habe folgenden Code benutzt: https://gist.github.com/ronivaldo/5587355

Diese Drehzahl Anzeige würde ich gerne verwenden um Geschwindigkeiten anzuzeigen. Mein Problem ist das mich die "führende Nullen" stören und ich nicht weiß wie ich das unterbinden kann. Wenn ich sie einfach ausblende wird die letzte Zahl nicht mehr überschrieben und das ganze Display immer wieder zu löschen ist auch keine Lösung. Hat jemand eine Idee?

Gruß

Hallo Scherheinz, lege ein zusätzliches costum an.

void customSpace(int col)
{
  lcd.setCursor(col,0);
  lcd.write("   ");
  lcd.setCursor(col,1);
  lcd.write("   );
}

Dann folgendes anpassen

void printNumber(int value, int col) {
  if (value == 0) {
    custom0(col);
  }//..
else customSpace(col);     
}

Dann muss lediglich noch printRPM angepasst werden. Hier zu einfach m und c einen Wert != 0 zuweisen. Zum Beispiel 11.

  if (number > 999) {
    m = (number - (number % 1000)) / 1000;
    number = number % 1000;
  } else {
    m = 0;
  }  

  if (number > 99) {
    c = (number - (number % 100)) / 100;
    number = number % 100;
  } else {
    c = 0;
  }

Scherheinz: Hat jemand eine Idee?

Erstmal eine Funktion "customSpace" machen, die nur Leerzeichen ausgibt:

void customSpace(int col)
{
  lcd.setCursor(col, 0); 
  lcd.print("   ");
  lcd.setCursor(col, 1); 
  lcd.print("   ");
}

Und dann die Programmlogik so ändern, dass für eine führende Null nicht "custom0()" sondern "customSpace()" aufgerufen wird.

Hallo, wenn der Wert ein "int" ist- und eine 1-zeilige Darstellung gewünscht ist... puhh

char CRPM[6] // für eine 5 stellige Zahl
int rpm

void setup()
{
}
void loop()
{
snprintf(CRPM,sizeof(CRPM),"%" "5d", rpm);// 5 stellig
lcd.setCursor(5, 0);
lcd.print(CRPM);
}

das sollte funktionieren. Gruß und Spaß Andreas

Andreas,

lese dir mal den Quellcode genau durch. Es geht darum, einfache Zeichen (Nummern) auf ein 16x2 Display anzuzeigen, die nicht 1x1 Feld groß sind. Eine Zahl erstreckt sich über 2x2 Felder. Damit die Leute keine Brille brauchen beim Ablesen 8)

Hallo, Nein! Eine "große" Ziffer, dargestellt über 2 Zeilen eines LCD. :blush: habe es geändert. Gruß und Spaß Andreas

Danke für die schnellen Antworten, ihr seits ja Wooaahnsinn! :slight_smile:

@Jurs, sschultewolter
Ich wußte das es so ungefär gemacht werden muss, hab es aber einfach nicht hinbekommen. Ist aber schon umgesetzt und funktioniert.
Danke ihr zwei!

@SkobyMobil:
Deine schlanke Lösung sieht auch gut aus, für einen Laie wie mich aber schwierig nachzuvollziehen. Werde ich aber auch noch bei Gelegenheit austesten, Danke!!

Gruß

nur zur Verdeutlichung:

du meinst nicht "Ziffer" sondern "Zahl" eine Ziffer ist nur ein Zeichen ohne Wert (wie ein Buchstabe ohne weiteren Sinn, der zusammen mit anderen Buchstaben in Wörtern vorkommt) eine Zahl dagegen hat einen Wert, geschrieben mit 1 oder mehreren Ziffern. Steng genommen hat eine Uhr also ein Zahlenblatt, nicht ein so genanntes "Ziffernblatt".

was du also meinst ist: eine Zahl mit sehr vielen Stellen (Ziffern) , die nicht alle in 1 Zeile passen, über 2 Zeilen umbrechen 8)

Hallo,
ich glaube er meinte es so:
Gruß und Spaß
Andreas

P.S.
bevor das hier wieder los geht…
Zahl:
http://web.archive.org/web/20071228215045/lexikon.meyers.de/meyers/Zahl_(Zahlen)
Ziffer:
http://web.archive.org/web/20080203171949/http://lexikon.meyers.de/meyers/Ziffer

th.jpg

So wie Andreas das zeigt soll das ;)

ach so, also einzelne Ziffern in einer Art “großem Font” über die komplette Displayhöhe hinweg darstellen :fearful:

das hatte ich so allerdings gar nicht verstanden 8)

Aus der Frage heraus war es auch nicht eindeutig. Jedoch so bald man sich den Code dazu angeschaut hatte, wurde mir klar, was Scherheinz vor hat.

sschultewolter: Aus der Frage heraus war es auch nicht eindeutig. Jedoch so bald man sich den Code dazu angeschaut hatte, wurde mir klar, was Scherheinz vor hat.

Ähm ja geht auf meine Kappe. Wenn man sich zu sehr auf ein Thema einschießt vergisst man schnell dass Außenstehende den Ansatz nicht kennen. Ich gelobe Besserung :cold_sweat:

Ich glaube das Ganze nennt man "big font".

übrigens, um Zahlen als String auszugeben, formatiert ohne führende Nullen, würde ich immer sprintf verwenden - die Funktion kopiert eine Zahl in einen formatierten Zeichenstring:

sprintf(outputstring, formatstring, list_of_numbers)

list_of_numbers kann aus 1 oder mehr Zahlen bestehen (durch Kommata getrennt). Beispiel:

float Zahl1 = 98.7 sprintf(outputstring, "%f", Zahl1);

soll immer mit 2 Vorkomma- und 1 Nachkommastelle linksbündig ausgegeben werden, heißt es sprintf(outputstring, "%-4.1f", Zahl1); // 4 Stellen inkl. Dezimalpunkt, davon 1 Nachkommastelle

Formatstring: Parameter identisch mit fprintf , s.d.! http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf

natürlich setzt das vorraus, dass überhaupt ein "big font" für Zeichen-/Stringausgabe existiert.

Dazu solltest du erwähnen, dass das standardmäßig auf dem Arduino nicht mit Floats funktioniert. Um Floats zu formatieren gibt es dtostrf(): http://www.mikrocontroller.net/topic/86391 http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42 Kann man auch linksbündig machen:

width is signed value, negative for left adjustment.

In dem gegebenen Code funktioniert die big font Geschichte geht aber nicht auf String Basis. Dazu wird die Zahl in Ziffern aufgeteilt und dann für jede Ziffer ein vordefiniertes Zeichen ausgeben. Man könnte natürlich danach über den erstellten String iterieren um das Zeichen für jede Stelle zu bekommen.

das stimmt mit dem "standardmäßig keine Floats" für Arduino Sketch ntl - vergesse ich immer, weil bisher immer standardmäßig bei mir flaots möglich waren - und ich inzwischen die float-lib für Sketch installiert habe ;)

ziffern-/ stellenmäßig iterieren ist ntl äußerst kompliziert. Vllt könnte mal wer als "Forumsprojekt" einen font.h header schreiben ? 8)

Hab nichts verstanden, bin aber dafür 8)

Gruß

Was ist daran kompliziert? Oder gar "äußerst"?

Wobei es in dem Code gar nicht im Floats geht. Sondern Integer. Da kann man die Ziffern einfach durch wiederholte Division und Modulo bestimmen. Und wie man führende oder nachfolgende Leerzeichen macht wurde schon erklärt.

@Scherheinz: in wenigen Worten, was ich meinte:

was ein Font ist weißt du sicher (notfalls googeln!)

es sollte eine Funktion geben, die etwa so heißen könnte:

putstring(x,y,outstring, fontname, fontsize)

outstring: dein string, den du schreiben willst x,y: deine Display-Koordinaten, an der die Ausgabe beginnen soll (oben links = (0;0) ) fontname: z.B. FixedFont, PropFont fontsize: Höhe eines vollen Zeichens ohne Unterlänge, z.B. 8 oder 16

putstring(0,15, "123.78", FixedFont, 16)

schriebe also deinen Zahlen-String 123.78 in einer 16-Punkt-hohen Schrift formatfüllend auf dein Display.

Hawe, was du da schreibst passt für TFT Displays, nicht aber für LCD Displays. LCD Displays sind anders aufgebaut.