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
fehler in anzeige von float
11.04.2015, 18:39
Beitrag #1
fehler in anzeige von float
ich habe hier eine Funktion mit der ich eine fließkommazahl auf einem Display ausgeben kann. ich übergebe beispielsweise "floatNumber = 125.347" und "decimal = 1" doch die Angabe der kommastellen wird nicht richtig behandelt wie es scheint.

es spielt dabei keine rolle wie groß der wert aktuell ist, die Funktion merkt sich wohl die maximal erkannte länge und behält diese anstelle sie wieder zu verringern.

da ich nicht so viel Ahnung vom Arduino programmieren habe, bitte ich euch mal über den Code zu kucken wo der Fehler liegt.

Code:
unsigned char SeeedOLED::putFloat(float floatNumber,unsigned char decimal)
{
  unsigned int temp=0;
  float decy=0.0;
  float rounding = 0.5;
  unsigned char f=0;
  if(floatNumber<0.0)
  {
    putString("-");
    floatNumber = -floatNumber;
    f +=1;
  }
  for (unsigned char i=0; i<decimal; ++i)
  {
    rounding /= 10.0;
  }
    floatNumber += rounding;
  
  temp = floatNumber;
  f += putNumber(temp);
  if(decimal>0)
  {
    putChar('.');
    f +=1;
}
  decy = floatNumber-temp;//decimal part,
  for(unsigned char i=0;i<decimal;i++)//4
  {
    decy *=10;// for the next decimal
    temp = decy;//get the decimal
    putNumber(temp);
    decy -= temp;
  }
  f +=decimal;
  return f;
}]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 19:06
Beitrag #2
RE: fehler in anzeige von float
Hi,
kannst Du das Fehlerbild mal mit ein paar Beispielen veranschaulichen?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 20:05 (Dieser Beitrag wurde zuletzt bearbeitet: 11.04.2015 20:26 von avoid.)
Beitrag #3
RE: fehler in anzeige von float
na klar.

Beispiel:
ich habe z. b. die startwerte "floatNumber = 123,456" und "decimal = 1".
dann bekomme ich "123,4" ausgegeben wie es sein soll.
fehlerbild:
der wert darf nicht unter 100 fallen, sonst verschiebt sich die kommastelle nach links.
Beispiel hierfür könnte dann so eine ausgabe sein: "95,75"
Vermutung:
größe des ausgabestring mit 5 zeichen wird zu beginn irgendwo gespeichert
und die angabe nur eine kommastelle an zu zeigen nicht weiter beachtet.

weiteres Beispiel:
ich habe z. b. die startwerte "floatNumber = 3,456" und "decimal = 1".
dann bekomme ich "3,4" ausgegeben wie es sein soll.
fehlerbild:
beim steigen des wert auf z. b. 10 oder 100 wird das komma zwar richtig nach rechts verschoben.
Beispiel hierfür könnte dann so eine ausgabe sein: "10,4" oder "100,4"
sinkt der wert dann aber wieder in den 10er oder 1er Bereich ab, verschiebt sich wieder das komma
und ich bekomme zu viele stellen hinter dem komma angezeigt und der string verlängert sich quasi.

ich hoffe die Beschreibung hilft.

-----nachtrag------
mir ist gerade aufgefallen: wenn ich einen String hinterherschiebe um z. b. "°" um das Symbol für Grad an die float zahl zu hängen dann tritt der fehler nicht auf.
die Library die ich verwende ist diese hier http://www.seeedstudio.com/wiki/images/a...142012.zip
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 20:44
Beitrag #4
RE: fehler in anzeige von float
Hi,
ich verstehe Deine Beispiele nicht wirklich. Kannst Du einfach mal die eigentliche Zahl mit der Ausgabe gegenüber stellen? Außerdem wäre vielleicht Dein kompletter Code nützlich.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 21:01 (Dieser Beitrag wurde zuletzt bearbeitet: 11.04.2015 21:02 von rkuehle.)
Beitrag #5
RE: fehler in anzeige von float
Klingt für mich ein wenig danach, dass vorhergehende Ausgaben mit aktuellen überschrieben werden ohne vorher den Darstellungsbereich zu clearen.
Von daher vielleicht ein Darstellungs- , kein Berechnungsproblem.
Man müsste mal den Code sehen Huh
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 22:30 (Dieser Beitrag wurde zuletzt bearbeitet: 11.04.2015 23:15 von avoid.)
Beitrag #6
RE: fehler in anzeige von float
hier das ist der code den ich verwende.
Code:
/*
  Xadow - Kompass (HMC5883) = Adresse 0x1E
  Xadow - OLED = Adresse 0x3C
*/

#include <Arduino.h>
#include <Wire.h>
#include <SeeedOLED.h>
#include <HMC5883L_Simple.h>

HMC5883L_Simple Compass;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  SeeedOled.init();                                      //initialze SEEED OLED display
  SeeedOled.clearDisplay();                              //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();                          //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();                               //Set addressing mode to Page Mode

  Compass.SetDeclination(1, 55, 'E');  
  Compass.SetSamplingMode(COMPASS_SINGLE);
  Compass.SetScale(COMPASS_SCALE_130);
  Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
}

void loop()
{
  float heading = Compass.GetHeadingDegrees();
  SeeedOled.setTextXY(0,0);                              //Set the cursor to Xth Page, Yth Column  
  SeeedOled.putString("Kompass: ");                      //Print the String
  SeeedOled.putFloat(heading,1);                         //Print the String
  SeeedOled.putString("°");                              //Print the String
  Serial.print("Kompass: ");
  Serial.print(heading,1);
  Serial.println(" Grad");
  delay(1000);
}

Es gibt keine eigentliche zahl, da es sich um einen sensorwert handelt der sich ändern kann.
In "heading" befindet sich die Grad Zahl eines Kompasssensor.
Wenn ich die Zeile (34) mit dem Grad Zeichen auskommentiere dann spinnt das Komma rum.

Hm, Darstellungsproblem ..., gut möglich.
Aber ob das eine Zeichen dann wirklich so ausschlaggebend ist?

---nachtrag---
Ich glaube das mit dem Darstellungsproblem ist der fall.
Mir ist gerade aufgefallen dass das Grad Zeichen gar nicht dargestellt wird, fehlt wohl im Zeichensatz, also ist an der stelle ein leer.
Damit wird dann wohl die kommastelle gelöscht die dort vorher stand und das vermittelt den Eindruck als währe alles ok.

bestätigt, wenn ich von 359,x° auf 0,1° wechsle bleibt die kommastelle stehen als hätte man vergessen sie zu löschen. klar liegt ja im ram des Display und keiner überschreibt sie.

---nachtrag 2---
hab eben mit folgenden Codeteilen das Grad Zeichen eingebaut.
Code:
static unsigned char GradIco[] PROGMEM ={
0x00, 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00
};
SeeedOled.drawBitmap(GradIco,7);                       //Print the GradIco
nichts destotrotz werden die hintersten teile der anzeige, wenn sich die Ausgabe verkürzt nicht entfernt bzw. überschrieben.
da könnte doch eine schleife helfen...
Code:
if (länge_alt > länge_aktuell){ füge leerzeichen an }
ist nur noch die frage wo ich das im Code unterbringen muss.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.04.2015, 23:47 (Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2015 00:02 von avoid.)
Beitrag #7
RE: fehler in anzeige von float
Auch wenn man sich nicht selbst antworten sollte, mach ich das jetzt mal.
Problem zumindest abgefangen.
Hab ne schleife gebaut die Leerstellen anfügt wenn die zahl kleiner wird.
Damit wird der RAM Inhalt des Display überschrieben und gut ist es.

Hier noch der berichtigte Code und danke für den schups in die richtige Richtung.
Code:
/*
  Xadow - Kompass (HMC5883) = Adresse 0x1E
  Xadow - OLED = Adresse 0x3C
  Incl. Grad Icon
*/

#include <Arduino.h>
#include <Wire.h>
#include <SeeedOLED.h>
#include <HMC5883L_Simple.h>

HMC5883L_Simple Compass;
float heading_alt = 0;

static unsigned char GradIco[] PROGMEM ={
0x00, 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00
};

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  SeeedOled.init();                                      //initialze SEEED OLED display
  SeeedOled.clearDisplay();                              //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();                          //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();                               //Set addressing mode to Page Mode

  Compass.SetDeclination(1, 55, 'E');  
  Compass.SetSamplingMode(COMPASS_SINGLE);
  Compass.SetScale(COMPASS_SCALE_130);
  Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
}

void loop()
{
  float heading = Compass.GetHeadingDegrees();
  SeeedOled.setTextXY(0,0);                              //Set the cursor to Xth Page, Yth Column
  SeeedOled.putString("Kompass: ");                      //Print the String
  SeeedOled.putFloat(heading,1);                         //Print the Float
  SeeedOled.drawBitmap(GradIco,7);                       //Print the GradIco
  Serial.println((heading_alt - heading));
  if ((heading_alt - heading) > 10){
    SeeedOled.putString(" ");
    if ((heading_alt - heading) > 100){
      SeeedOled.putString(" ");
    }
  }
  heading_alt = heading;
  Serial.print("Kompass: ");
  Serial.print(heading,1);
  Serial.println(" Grad");
  delay(1000);
}

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.04.2015, 08:05
Beitrag #8
RE: fehler in anzeige von float
Moin,
ach das ist das alte Problem...
formatiere den Zahlenwert doch einfach mit sprintf() dann kannst du die Breite vom Ausgenfeld und die Anzahl der Nachkommastellen definieren. Dann noch den so gewonnenen String aufs Display schieben und alles passt.
Über die Syntax von sprintf einfach mal ne Suchmaschine beauftragen...
Gibt aber auch andere Befehle wo die Kollegen in dem Fall schon angewendet haben, vielleicht steuert das noch einer bei...Shy
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anzeige von Daten FreDicnc 9 479 24.06.2017 11:09
Letzter Beitrag: FreDicnc
  DS18B20 Pool-Thermometer mit 7Seg.-Anzeige Evilgnievel 19 730 23.06.2017 09:27
Letzter Beitrag: Tommy56
  Compiler Fehler Harti 8 329 16.06.2017 17:51
Letzter Beitrag: Harti
  Fehler bei Zeitmessung Fox 15 392 24.05.2017 09:19
Letzter Beitrag: SkobyMobil
  Zeitabhängige LED Anzeige mit 2x4 Input Abfrage do1xxy 2 197 05.03.2017 19:25
Letzter Beitrag: do1xxy
  TFT Anzeige Tellen 7 429 14.02.2017 22:04
Letzter Beitrag: hotsystems
  Seltsamer Fehler bei Vergleichsoperation ardu_arne 14 548 22.01.2017 20:35
Letzter Beitrag: Binatone
  Anzeige ruhiger halten Franz54 9 679 19.12.2016 01:28
Letzter Beitrag: SkobyMobil
  Fehler beim Hochladen steyr 24 1.468 16.12.2016 07:52
Letzter Beitrag: hotsystems
  Fehler in meinem Programm Franz54 7 460 01.12.2016 23:58
Letzter Beitrag: hotsystems

Gehe zu:


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