INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ausgabe von formatierten Float-Werten auf LCD
09.12.2020, 21:24 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2020 22:06 von Herby007.)
Beitrag #1
Ausgabe von formatierten Float-Werten auf LCD
Hallo zusammen,

ich habe ein Problem mit der formatierten Ausgabe von Float-Werten auf einem LC-Display (16*2, Ansteuerung via I2C).
Bekannt ist ja, dass sprintf(..) nicht mit float-Zahlen funktioniert, also habe ich eine Lösung mit dtostrf(...) realisiert.
Und jetzt kommts:

Der Sketch lässt sich fehlerfrei übersetzen wenn ich einen Arduino UNO als Board ausgewählt habe.

Sobald ich aber das Board ´MKR FOX1200´ auswähle kommt die Fehlermeldung:

´dtostrf´ was not declared in this scope

Da komme ich jetzt nicht weiter.
Oder gibt es eine andere Möglichkeit zur formatierten Ausgabe von Float-Werten?

Vielen Dank
Herby
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2020, 21:26
Beitrag #2
RE: Ausgabe von formatierten Float-Werten auf LCD
Nur geraten: Evtl. ist bei diesem Board sprintf mit float möglich.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2020, 21:34 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2020 21:40 von Herby007.)
Beitrag #3
RE: Ausgabe von formatierten Float-Werten auf LCD
Hallo Tommy,

sprintf(..) wird ohne Fehler übersetzt, aber es funktioniert nicht:

Hier einmal die Kern-Programmzeilen:

float f1;
char text[18];

f1 = 12.345;

sprintf(text,"%4.1f",f1);

lcd.print(text);

lcd.print("ABC"); // funktioniert


Nachtrag:
auch bei Ausgabe über den Seriellen Monitor ist nichts zu sehen:

Serial.println(text); //nichts Sichtbares

Herby
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2020, 22:52
Beitrag #4
RE: Ausgabe von formatierten Float-Werten auf LCD
Ich kenne den MKR FOX1200 nicht, kann also nur raten.
Du könntest vor und Nachkommateil einzeln bestimmen. Bei 1 Nachkommastelle ziemlich einfach (ungetestet):
Code:
float zahl = 123.45;
int temp, vorKomma, nachKomma;
temp = zahl * 10; // eine Nachkommastelle
vorkomma = temp / 10; // Ganzzahlanteil;
nachkomma = temp % 10; // Nachkommastelle
sprintf("%d.%d",vorKomma, nachKomma);

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2020, 09:24 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2020 09:29 von Herby007.)
Beitrag #5
RE: Ausgabe von formatierten Float-Werten auf LCD
Hallo Tommy,
vielen Dank für die schnelle Antwort.

Leider ist mein Problem etwas tiefgründiger:
Ich kann float-Zahlen mit gewünschter Nachkommastellen-Anzahl problemlos auf dem LCD ausgeben mit:

lcd.print(f1,2); // f1 wird mit 2 Nachkommastellen ausgegeben

Dann ergeben sich aber Probleme, da die Ausgabe immer linksbündig erfolgt, z.B.:

Wert f1: 1234.56 ---> Anzeige auf Display: 1234.56 und dann als nächstes:
Wert f1: 1.78 ---> Anzeige auf dem Display 1.78.56

--> die vorherigen Werte bleiben also teilweise erhalten

Ich müsste also eine formatiert Ausgabe realisieren, wie z.B. mit ("%5.1f", f1).
Dazu müsste ich mir zuerst einen String zusammenbauen und ihn dann an das LCD senden.
(Bei anderen µCs und IDEs geht das wunderbar mit sprintf(..), hier aber leider nicht)

Mit ´dtostrf´ funktionierts beim UNO-Board, aber nicht beim MKR FOX1200, dort gibt es ´dtostrf´ scheinbar gar nicht ????

Oder gibt es eine andere Möglichkeit ?

Vielen Dank, viele Grüße

Herby
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2020, 10:35
Beitrag #6
RE: Ausgabe von formatierten Float-Werten auf LCD
Q&D:
Code:
if (wert < 10) lcd.print(' ');
if (wert < 100) lcd.print(' ');
if (wert < 1000) lcd.print(' ');
lcd.print(wert,2);

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2020, 17:08
Beitrag #7
RE: Ausgabe von formatierten Float-Werten auf LCD
Hallo Tommy,

vielen Dank für den ´knuffigen´ Trick, er funktioniert !!!

Wenn man nun noch schreibt ´abs(wert)´ dann funktioniert es auch mit negativen float-Zahlen.

Da ich allerdings für meine ursprüngliche Frage nichts gefunden habe, habe ich Arduino einmal angeschrieben, was denn nun mit ´sprintf(..)´ und ´dtostrf(...)´ beim MKR FOX1200er-Board los ist.

Mal schauen, was dabei raus kommt.

Viele Grüße

Herby
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2020, 21:47 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2020 22:03 von Tommy56.)
Beitrag #8
RE: Ausgabe von formatierten Float-Werten auf LCD
Irendwie hat mir das Thema dann doch keine Ruhe gelassen.
Für sinnvolle Wertebereiche und ohne Test auf alle (un)möglichen Fehler habe ich mal eine Variante erstellt, wie Du mit dem normalen sprintf auch Fließkommazahlen darstellen kannst.

Code:
/* Formatiert ein float auf max. Länge des Puffers */

size_t formatFloat(char *puffer, uint8_t pufLen, float wert, uint8_t vorKomma, uint8_t nachKomma) {
uint16_t faktor = 10, ganz, nach;
char format[10] = "%0";
char fnum[2];
  if (nachKomma > 4) {  // unsinnig
    return 0;
  }
  if (vorKomma+nachKomma+2 > pufLen) {  // passt nicht
    return 0;
  }
  for(uint8_t i=0; i < nachKomma-1; i++) faktor *= 10;
  fnum[0] = vorKomma+0x30;
  fnum[1] = '\0';
  strcat(format, fnum);
  strcat(format, "d.%0");
  fnum[0] = nachKomma+0x30;
  strcat(format,fnum);
  strcat(format,"d");
  // Serial.println(format);
  wert *= faktor;
  ganz = wert / faktor;
  nach = (uint16_t)abs(wert) % faktor;
  // Serial.println(ganz);
  // Serial.println(nach);
  sprintf(puffer,format,ganz,nach);
  // Serial.println(puffer);
  return strlen(puffer);
}

char puffer[10];
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  formatFloat(puffer, sizeof(puffer), 11.23,3,1);
  Serial.println(puffer);
  formatFloat(puffer, sizeof(puffer), 11.23,3,2);
  Serial.println(puffer);
  formatFloat(puffer, sizeof(puffer), 11.03,3,2);
  Serial.println(puffer);
  
}

void loop() {}

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Attiny85 Probleme mit Schleifen und Serial-Ausgabe lucki.luke 9 639 07.03.2021 20:55
Letzter Beitrag: Tommy56
  Ausgabe Binärzahlen Karl Stanger 1 377 09.01.2021 12:24
Letzter Beitrag: Tommy56
  Ausgabe auf Serial Monitor vlakvark 8 781 31.12.2020 15:25
Letzter Beitrag: MicroBahner
  Float Werte im EEPROM speichern Kein Progammierer 10 1.019 22.12.2020 21:20
Letzter Beitrag: Tommy56
  Float-Werte mit Bubble-Sort sortieren süffi1234 2 458 25.11.2020 16:36
Letzter Beitrag: süffi1234
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 23 11.270 18.08.2020 11:53
Letzter Beitrag: hotsystems
  Ausgabe auf LCD anstatt in MS Visuals oneill86 10 1.440 03.05.2020 20:42
Letzter Beitrag: hotsystems
  Variable mit Werten von SD-Karte füllen DO3GE 16 2.341 14.04.2020 19:38
Letzter Beitrag: Corvus
  Serielle Ausgabe in Setup streikt Mustermann 2 1.242 10.10.2019 18:26
Letzter Beitrag: Mustermann
  Float array über NRF24L01 senden und empfangen Flo3107 6 1.791 04.09.2019 21:55
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste