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
  Fehler in meinem Programm Franz54 7 165 01.12.2016 23:58
Letzter Beitrag: hotsystems
  merkwürdige Anzeige bei lektion 17 lecker16 7 171 20.11.2016 22:40
Letzter Beitrag: Tommy56
  Fehler im Programmablauf binderj1 14 359 10.10.2016 10:29
Letzter Beitrag: StephanBuerger
  Fehler beim Kompilieren binderj1 5 297 03.10.2016 21:27
Letzter Beitrag: hotsystems
Smile Simpler Fehler bei MAP? malsehen 8 230 02.10.2016 19:46
Letzter Beitrag: malsehen
  Fehler beim Speichern von Projekten Manni66 16 696 23.08.2016 10:05
Letzter Beitrag: hotsystems
  Ausgabe druckt immer 2 Werte anstatt nur einen. Finde den Fehler nicht TimeMen 24 744 02.07.2016 14:18
Letzter Beitrag: hotsystems
  Adafruit SD-master / logger shield: Fehler beim 2. Kompilieren kl-ing 3 337 06.06.2016 16:07
Letzter Beitrag: Bitklopfer
  Rechnen mit float und unsigned long Rudi 3 307 03.06.2016 12:41
Letzter Beitrag: hotsystems
  Thermometer mit 7 Segment Anzeige ottii50 53 1.539 31.05.2016 18:43
Letzter Beitrag: ottii50

Gehe zu:


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