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
LCD Zahlen Formatierung
02.02.2015, 18:26
Beitrag #9
RE: LCD Zahlen Formatierung
So habe es fast richtig aber es sind 2 Fehler wo ich nicht finde.
1. ALT wenn ich eine Flughöhe von 32767 übersteige bekomme ich ein Negativen Wert
2. VS Anzeige das + wenn ich eine Positiven Steigung habe und die Zahl Flackert etwas

hier ist der Aktuelle Code
Code:
#include <stdio.h>
#include <SPI.h>        
#include <Ethernet.h>
//#include <EthernetUdp.h>
#include <Wire.h>
#include <XPlaneData.h>         // -- include XPlaneData library
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//-----------------------------
byte Ard_MAC[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};// MAC-Address of Arduino
int XPR = 49001;                                  // port to listen to get UDP packets
int XPW = 49000;                                  // port to send UDP packets
int IPx[] = {
  192, 168, 178, 26};                     // X-Plane IP address ( ! set your !)
//IPAddress ip (192, 168, 178, 60);                                   // Arduino IP address (Auto)

XPlaneData XP (XPR, XPW, IPx, Ard_MAC);   //==!==  Create  XPlaneData object (XP)
//--------------------------------------------------
long HDG;
long HDG_pre;
char HDG_b1[3];
char HDG_b2[3];

long CRS;
long CRS_pre;
char CRS_b1[3];
char CRS_b2[3];

long SPD;
long SPD_pre;
char SPD_b1[3];
char SPD_b2[3];

long FL;
long FL_pre;
char FL_b1[3];
char FL_b2[3];

long ALT;
long ALT_pre;
char ALT_b1[5];
char ALT_b2[5];

long VS;
long VS_pre;
char VS_b1[4];
char VS_b2[4];


//---------------- setup ---------------------------
void setup()  {


  XP.begin();      //==! init XPlaneData

  // XP.Pins_In (42, 43);             // Define pins for inputs  
  lcd.init();                       // initialize the lcd
  lcd.backlight();
  lcd.clear();
  Serial.begin(38400);
}



//------------------------ start --------------------
void loop()
{                // ------ send data to X-Plane -----

  // XP.Set_Value(42, "cockpit2/controls/flap_ratio[0]", 0);      // Flaps APR position                                
  // XP.Set_Value(43, "cockpit2/controls/flap_ratio[0]", 1 );      // Flaps Full position


  //----------- Receive data from X-Plane -----------------

  lcd.setCursor(5,0);
  lcd.print("AUTOPILOT:");

  if (XP.udpin())   // -
  {                

    HDG = XP.Dget(118, 2);                     // HDG
    CRS = XP.Dget(98, 2);                     // CRS
    SPD = XP.Dget(118, 1);                     // SPD
    FL = XP.Dget(118, 4)/100;                      // FL
    ALT = XP.Dget(20, 6);                     // ALT
    VS = XP.Dget(118, 3);                      // VS


    if (HDG_pre != HDG) {      // check ob Wert sich geändert hat
      HDG_pre = HDG;
      lcd.setCursor(0,1);
      itoa(HDG, HDG_b1, 10);
      sprintf(HDG_b2, "%03d", HDG);
      lcd.print("HDG: ");
      lcd.print(HDG_b2);
    }

    if (CRS_pre != CRS) {      // check ob Wert sich geändert hat
      CRS_pre = CRS;
      lcd.setCursor(0,2);
      itoa(CRS, CRS_b1, 10);
      sprintf(CRS_b2, "%3d", CRS);
      lcd.print("CRS: ");
      lcd.print(CRS_b2);
    }

    if (SPD_pre != SPD) {      // check ob Wert sich geändert hat
      SPD_pre = SPD;
      lcd.setCursor(0,3);
      itoa(SPD, SPD_b1, 10);
      sprintf(SPD_b2, "%03d", SPD);
      lcd.print("SPD: ");
      lcd.print(SPD_b2);
    }

    if (FL_pre != FL) {      // check ob Wert sich geändert hat
      FL_pre = FL;
      lcd.setCursor(10,1);
      itoa(FL, FL_b1, 10);
      sprintf(FL_b2, "%03d", FL);
      lcd.print("FL:  ");
      lcd.print(FL_b2);
   }

    if (ALT_pre != ALT) {      // check ob Wert sich geändert hat
      ALT_pre = ALT;
      lcd.setCursor(10,2);
      itoa(ALT, ALT_b1, 10);
      sprintf(ALT_b2, "%5d", ALT);
      lcd.print("ALT: ");
      lcd.print(ALT_b2);
    }

    if (VS_pre != VS) {      // check ob Wert sich geändert hat
      VS_pre = VS;
      lcd.setCursor(10,3);
      itoa(VS, VS_b1, 10);
      sprintf(VS_b2, "%4d", VS);
      lcd.print("VS: ");
      lcd.print(VS_b2);
    }




  }


}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2015, 18:30 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2015 18:30 von tito-t.)
Beitrag #10
RE: LCD Zahlen Formatierung
na, das mit dem 32000 irgendwas ist doch klar:
int geht nicht höher, danach hast du einen Zahlen-Überlauf.

Wenn du nie negative Werte erwartest, nimm unsigned int (uint16_t), ansonsten nimm long (int32_t)

bei dem Flackern könnte was mit der Stringlänge nicht passen, oder die Formatierung stimmt einfach nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2015, 18:32 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2015 18:36 von Thorsten Pferdekämper.)
Beitrag #11
RE: LCD Zahlen Formatierung
(02.02.2015 18:30)tito-t schrieb:  int geht nicht höher, danach hast du einen Zahlen-Überlauf.

Wenn du nie negative Werte erwartest, nimm unsigned int (uint16_t), ansonsten nimm long (int32_t)
Er hat schon "long", das ist es nicht.

(02.02.2015 18:26)Kaito164 schrieb:  1. ALT wenn ich eine Flughöhe von 32767 übersteige bekomme ich ein Negativen Wert
Du musst dem sprintf sagen, dass es ein long ist: sprintf(ALT_b2, "%5ld", ALT);
Das rote ist ein kleines "L".

Zitat:2. VS Anzeige das + wenn ich eine Positiven Steigung habe und die Zahl Flackert etwas
Deine Grammatik ist etwas gewöhnungsbedürftig, daher ist mir nicht ganz klar, was Du meinst. Du willst ein "+" haben oder Du hast es und willst es nicht?
Was mir auffällt:
Code:
char FL_b2[3];
In sowas schreibst Du dann drei Ziffern rein. Das ist nicht gut, da das sprintf ans Ende noch eine 0 schreibt. Das bedeutet, dass das nächste Byte im Speicher auf Null gesetzt wird. Das kann ziemlich schief gehen. Du musst immer ein Byte mehr deklarieren als Du tatsächlich brauchst.

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
02.02.2015, 18:42 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2015 19:01 von Kaito164.)
Beitrag #12
RE: LCD Zahlen Formatierung
(02.02.2015 17:27)tito-t schrieb:  Nur für floats muss man vorher einen float-patch kopieren, das ist leider normalerweise nicht freigeschaltet.

Ich glaube genau da ist gerade mein Problem mit der Höhe ALT.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2015, 18:51
Beitrag #13
RE: LCD Zahlen Formatierung
(02.02.2015 18:42)Kaito164 schrieb:  
(02.02.2015 17:27)tito-t schrieb:  Nur für floats muss man vorher einen float-patch kopieren, das ist leider normalerweise nicht freigeschaltet.

Ich glaube genau da ist gerade mein Problem mit der Höhe ALT
Nein, ist es nicht. Dein ALT ist kein float, sondern ein long. Siehe mein Beitrag vorher.

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
02.02.2015, 19:20
Beitrag #14
RE: LCD Zahlen Formatierung
Sorry mit der Schreibweise bin gerade ein par Sachen parallel am machen und hab nicht noch mal drüber gelesen Wink
Das + und - was ich bei den Wert VS brauche ist für die Steig-/Sinkfluggeschwindigkeit.
Wenn ich z.b. 1200m in der Minute Steigen möchte sollte er ein "V/S: +1200" im Display anzeigen, das Minus macht er schon.

Zitat:In sowas schreibst Du dann drei Ziffern rein. Das ist nicht gut, da das sprintf ans Ende noch eine 0 schreibt. Das bedeutet, dass das nächste Byte im Speicher auf Null gesetzt wird. Das kann ziemlich schief gehen. Du musst immer ein Byte mehr deklarieren als Du tatsächlich brauchst.

Danke für die Info.

(02.02.2015 18:51)Thorsten Pferdekämper schrieb:  
(02.02.2015 18:42)Kaito164 schrieb:  
(02.02.2015 17:27)tito-t schrieb:  Nur für floats muss man vorher einen float-patch kopieren, das ist leider normalerweise nicht freigeschaltet.

Ich glaube genau da ist gerade mein Problem mit der Höhe ALT
Nein, ist es nicht. Dein ALT ist kein float, sondern ein long. Siehe mein Beitrag vorher.

Habe mir noch mal den Werte angesehen, was mir der Simulator laut der Liste hier gibt.
http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html
Wenn das stimmt ist "/Sim/cockpit/autopilot/current_altitude" ein Float Wert, und ich muss die Formatierung anpassen =)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.02.2015, 19:31
Beitrag #15
RE: LCD Zahlen Formatierung
Hi,
es ist doch völlig egal, was für einen Datentyp der Simulator liefert. Es kommt nur darauf an, was Dein Sketch benutzt.
Für das "+" musst Du im Format-String bei sprintf direkt nach dem "%" ein "+" schreiben. Also z.B. "%+5d".
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
02.02.2015, 20:10 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2015 20:18 von tito-t.)
Beitrag #16
RE: LCD Zahlen Formatierung
naja, also wenn der gelieferte Datentyp float ist, dann muss er auch als float zugewiesen werden, und dann muss er auch als Float in sprint formatiert werden
z.B. "%+07.0f"
-
oder man wandelt per typecasting explizit in int um, dann kann man den int-Wert natürlich (z.B.) als
"%+07d"
als string formatieren

eine float Zahl in sprintf wie ein int formatiert geht aber schief...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  4 Anzeigen mit unterschiedlichen zufälligen Zahlen Gravia 4 428 10.02.2016 06:05
Letzter Beitrag: Gravia
  Problem mit Division zweier Zahlen torsten_156 3 452 18.12.2015 22:09
Letzter Beitrag: Bitklopfer
  analogRead: Pin-Nummern zählen? HaWe 4 823 14.06.2015 12:01
Letzter Beitrag: HaWe
  Serial Monitor Zahlen Senden über 9 paq 7 2.009 18.05.2015 08:48
Letzter Beitrag: Scherheinz
  .read() liest nur zahlen anstatt character kraweuschuasta 1 1.246 27.02.2014 21:10
Letzter Beitrag: kraweuschuasta
  Zahlen vom Serieller Monitor verarbeiten Sascha87 1 1.270 16.01.2014 10:47
Letzter Beitrag: Stefan
  10er zahlen in binärzahlen - noobfrage schatten14 9 3.804 14.01.2014 12:17
Letzter Beitrag: Stefan
  Pulse zählen Coleby 8 8.228 05.01.2014 10:10
Letzter Beitrag: Coleby
  Große Zahlen und kein Punkt Xwill 2 1.703 27.10.2013 21:10
Letzter Beitrag: Xwill

Gehe zu:


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