I2C-Ausgabe formatieren

Hallo,
Ich möchte auf meinem Mega2560 mit I2C-Display einen Integerwert formatiert auf 3 Vorkommastellen anzeigen. Ohne Formatierungswerte schreibt die Anzeige nach einem 3-stelligen Wert den einstelligen Folgewert über die vorgehende Anzeige ohne diese zu löschen. Deshalb mein Wunsch nach Formatierung. Mein Problem liegt offensichtlich im geschriebenen Code. Der Compiler reklamiert eine fehlende Klammer (.
Einfügen an verschiedenen Stellen war erfolglos. Die Suche in den Unterlagen ebenfalls. Deshalb meine Frage. Die fragliche Stelle befindet sich am Ende des Sketch vor der Textpassage.

Motorsteuerung.ino (5.03 KB)

du könntest einen kleinen Buffer machen und in diesen Buffer mit sprintf formatiert schreiben und dann den buffer am LCD darstellen.

in etwa so

  char buffer[16+1];
  sprintf(buffer, "Re:%3d   Li: %3d", motre, motli);
  lcd.print(buffer);

google nach sprintf was es mit den % auf sich hat und wie man es richtig anwendet. Warnung Vorweg, floats gehen so am Uno/Nano/Mega nicht (einfach), aber Integers schaffst du damit problemlos.

Apropos Integers, VIELE deiner Variablen sind int. Mach dir auch die richtige Verwendung von Variablentypen bewusst: Arduino - VariableDeclaration

Und wenn du schon dabei bist, mache const was const sein kann (z.B. alle deine PIN Definitionen)

Hallo,

für float könnte man dtostrf verwenden.

float input = 0.0; 
char output[10];

// float Formatierung
dtostrf(input, 5, 2, output);  // Input, Gesamtstellen inkl. Komma, Nachkommastellen, Output

// bei Bedarf
Zeichen_in_charArray_ersetzen(output, '.', ',');


void Zeichen_in_charArray_ersetzen (char* zeichenkette, char search, char replace)
{
  unsigned int i = 0;
  while ( zeichenkette[i] != '\0') {
    if ( zeichenkette[i] == search )  {   // suche nach Zeichen 'search' und
      zeichenkette[i] = replace;          // ersetze es durch 'replace'
    }
    i++;
  }
}

Integerwert formatiert auf 3 Vorkommastellen

Was jetzt?

Man kann auch einfach sowas machen

void formatInt(unsigned int value)
{
   if (value < 100) lcd.print(' ');
   if (value < 10) lcd.print(' ');
   lcd.print(value);
}

Negative Zahlen müsste man noch extra berücksichtigen

Danke!
Werde das gleich mal ausprobieren.
Aber noch mal die Frage: Habe ich da was falsch geschrieben? Warum mault der Compiler?

weil das fasch ist

lcd.print(motre.3,0);

wie kommst denn auf so was?

Aber noch mal die Frage: Habe ich da was falsch geschrieben? Warum mault der Compiler?

Wieso behebst du den Fehler nicht?
Der Compiler zeigt doch direkt drauf!
Tipp: Meldungen aufmerksam lesen und die Fehler beheben.

E:\Programme\arduino\portable\sketchbook\sketch_aug21b\sketch_aug21b.ino: In function 'void loop()':

E:\Programme\arduino\portable\sketchbook\sketch_aug21b\sketch_aug21b.ino:63:48: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

   if (pulslaenge1 >= midp){ if (uflagre = (LOW)){ delay (pause); digitalWrite(bremsre, LOW); delay(pause); digitalWrite(drehrire, HIGH); digitalWrite(bremsre, HIGH);}} // Umschaltpause bei Drehrichtungswechsel rechter Motor

                                                ^

E:\Programme\arduino\portable\sketchbook\sketch_aug21b\sketch_aug21b.ino:64:47: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

   if (pulslaenge1 < midp){ if (uflagre = (HIGH)){ delay (pause); digitalWrite(bremsre, LOW); delay(pause); digitalWrite(drehrire, LOW); digitalWrite(bremsre, HIGH);}}

                                               ^

E:\Programme\arduino\portable\sketchbook\sketch_aug21b\sketch_aug21b.ino:67:48: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

   if (pulslaenge2 >= midp){ if (uflagli = (LOW)){ delay (pause); digitalWrite(bremsli, LOW); delay(pause); digitalWrite(drehrili, HIGH); digitalWrite(bremsli, HIGH);}}  //  Umschaltpause bei Drehrichtungswechsel linker Motor

                                                ^

E:\Programme\arduino\portable\sketchbook\sketch_aug21b\sketch_aug21b.ino:68:47: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

   if (pulslaenge2 < midp){ if (uflagli = (HIGH)){ delay (pause); digitalWrite(bremsli, LOW); delay(pause); digitalWrite(drehrili, LOW); digitalWrite(bremsli, HIGH);}}

                                               ^

sketch_aug21b:75:18: error: expected ')' before numeric constant

   lcd.print(motre.3,0);

                  ^

sketch_aug21b:77:18: error: expected ')' before numeric constant

   lcd.print(motli.3,0);

                  ^

error: expected ')' before numeric constant

Das kommt aber auch nur weil der Compiler mit dieser unsinnigen Syntax nichts anfangen kann und meint es fehlt irgendwo eine Klammer. Das ist aber nicht der eigentliche Fehler

Das ist nicht auf meinem Mist gewachsen, das habe ich aus einer Anleitung für die I2C-Anzeige herausgenommen (finde sie jetzt gerade nicht mehr). Selbstverständlich habe ich den "falschen" Code entfernt. Hätte doch sein können, das ich eine falsche oder defekte #include-Datei geladen habe. wenn ich die "Anleitung" wieder gefunden habe, werde ich sie hier als abschreckendes Beispiel einstellen.
Danke für Eure Hilfe und auch für den Hinweis auf die "Const"-Variablen.

Hi

Deine
{code]
   if (pulslaenge2 < midp){ if (uflagli = (HIGH)){ delay (pause); digitalWrite(bremsli, LOW); delay(pause); digitalWrite(drehrili, LOW); digitalWrite(bremsli, HIGH);}}

                                               ^

‘Dinger’ hast Du ebenfalls überarbeitet?
Im Grunde mag der Kompiler hier das EINFACHE = nicht - Du weist Deinem Flag den Wert HIGH zu - Du willst aber sicherlich mittels == auf Gleichheit PRÜFEN.

MfG