Go Down

Topic: XML Probleme... (Read 3028 times) previous topic - next topic

uwefed

Quote
Und jetzt hab ich das Problem, dass er mir wegen dem Zeile++ einen 'lvalue required as increment operand' Fehler anzeigt...


Und er hat recht. Versuchs mal mit
Code: [Select]
int Zeile;

Grüße Uwe

thmmax

Natürlich :)
Danke vielmals!
LG Max

thmmax

Lieber Uwe,

habe gestern und heute wirklich versucht, deine Tipps umzusetzen, aber irgendwas mach ich wohl falsch!

'Zeile' habe ich also ganz oben definiert:
Code: [Select]
#define Zeile 0
Dann habe ich bei jedem tag die Zeile eingefügt:
Code: [Select]
matrix.setCursor(16, Zeile*8);
Und dann noch jeweils das
Code: [Select]
int Zeile++ hinzugefügt. Ich hab das int und Zeile in allen möglichen Kombinationen probiert, ich bekomm immer einen 'expected unqualified-id before numeric constant' Error.

Könntest du mir da nochmal weiterhelfen? Und brauch ich im Code sonst noch was, damit die Daten jeweils auf die nächste Zeile kommen?

Insgesamt sieht der Code in diesem Bereich also so aus:
Code: [Select]

    if (matchTag("<time>")) {
      Serial.print(F(" Abfahrt: "));
      Serial.print(dataStr);
      String stringOne = dataStr;
      Serial.println(stringOne);
      String stringTwo = stringOne;
      stringTwo.replace("min","'");
      stringTwo.replace(":","");
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(24, Zeile*8);
        matrix.println(stringTwo);
        matrix.writeScreen();
      }
      int Zeile++;

    }
    if (matchTag("<direction>")) {
      Serial.print(F(" Ziel: "));
      Serial.print(dataStr);
      char mostSignificantDigit = dataStr[0];
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(16, Zeile*8);
        matrix.println(mostSignificantDigit);
        matrix.writeScreen();
      }
      int Zeile++;
    }
    if (matchTag("<route>")) {
      Serial.print(F(" Linie: "));
      Serial.print(dataStr);
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(0, Zeile*8);
        matrix.print(dataStr);
        matrix.writeScreen();
      }
      }
      int Zeile++;


Vielen Dank!
LG Max

jurs


'Zeile' habe ich also ganz oben definiert:
Code: [Select]
#define Zeile 0
Dann habe ich bei jedem tag die Zeile eingefügt:
Code: [Select]
matrix.setCursor(16, Zeile*8);
Und dann noch jeweils das
Code: [Select]
int Zeile++ hinzugefügt. Ich hab das int und Zeile in allen möglichen Kombinationen probiert, ich bekomm immer einen 'expected unqualified-id before numeric constant' Error.


0++ geht eben nicht, eine definierte Konstante ist eine Konstante und kann ihren Wert zur Programmlaufzeit nicht ändern.

Probier's mal mit der Definition einer Variablen, wenn sich der Wert im Programm ändern soll!

thmmax

Danke für den Tipp!
Aber wie soll ich dann die Variable definieren? Die Zeile muss ja 0 sein, sonst stimmt die Anzeige auf der Matrix nicht?

thmmax

Habe jetzt statt dem
Code: [Select]
#define Zeile 0
Code: [Select]
int Zeile = 0; verwendet.
Das Script läuft jetzt grundsätzlich, allerdings nicht ganz wie erwartet:
Zwar werden die Abfahrten nach Zeilen getrennt, es tauchen aber nicht alle Informationen gleichzeitig auf, einmal steht z.B. in Zeile 1 Ziel und Uhrzeit, dann wieder in Zeile 2 Linie und Ziel etc..

Und an eine Sache habe ich gar nicht gedacht: die Matrix hat 'von sich' nur zwei Zeilen, d.h. wenn man die zwei unteren der vier Zeilen ansprechen möchte, muss man die Information im Prinzip nach rechts schieben...

Hier zur Sicherheit mal der abgeänderte Code:
Code: [Select]
    if (matchTag("<time>")) {
      Serial.print(" Abfahrt: ");
      Serial.print(dataStr);
      String stringOne = dataStr;
      Serial.println(stringOne);
      String stringTwo = stringOne;
      stringTwo.replace("min","'");
      stringTwo.replace(":","");
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(24, Zeile*8);
        matrix.println(stringTwo);
        matrix.writeScreen();
      }
Zeile++;
    }
    if (matchTag("<direction>")) {
      Serial.print(" Ziel: ");
      Serial.print(dataStr);
      char mostSignificantDigit = dataStr[0];
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(16, Zeile*8);
        matrix.println(mostSignificantDigit);
        matrix.writeScreen();
      }
      Zeile++;
    }
    if (matchTag("<route>")) {
      Serial.print(" Linie: ");
      Serial.print(dataStr);
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      {
        matrix.setCursor(0, Zeile*8);
        matrix.print(dataStr);
        matrix.writeScreen();
      }
      Zeile++;
      }
     

thmmax

Habe nun etwas am Code 'herumprobiert', nach dem Entfernen des *8 (nur mehr
Code: [Select]
matrix.setCursor(24, Zeile);) wird das ganze zwar schon leserlich (siehe Foto), es bleiben aber zwei Probleme (abgesehen von den restlichen 2 Abfahrten, die sich im Prinzip ja rechts befinden müssten):
Wie bring ich die zwei Abfahrten komplett auseinander? Und jedes Mal, wenn er die Daten neu lädt, 'rutschen' die Abfahrten nach unten, bis sie beim 3./4. Mal Nachladen komplett verschwinden...

uwefed

Ich bitte Dich um 2 Dinge:
1) unsere Antworten lesen
2) unsere Fragen beantworten.

Welches Display hast Du?

Grüße Uwe

thmmax

Lieber Uwe,

wird gemacht 8)
Es handelt sich um 4 von diesen Displays: http://adafruit.com/products/555
Diese sind miteinander verbunden und bilden dann ein 'langes' zweizeiliges Display.

Deshalb sind die Daten, die auf der unteren Hälfte der Smartinfo angezeigt werden, im Prinzip rechts von den oberen.

LG Max

uwefed

Dann definiere die Startpositionen in 2 Array (x bzw y -Position) . So kannst Du mit dem Index die Kursorpositionen aufrufen.
Grüße Uwe


thmmax

Lieber Uwe,

habe nun eine Zeit lang herumexperimentiert, so wirklich flüssig will das Ganze nicht funktionieren...
Eine Idee hätte ich noch: könnte man eventuell den Datensatz in 4 Teile unterteilen und dann den einzelnen Displayabschnitten zuteilen?

Also z.B.
<smartinfo>
<route>D</route>
<direction>Hauptbahnhof</direction>
<time>11 min</time>
</smartinfo>
=Teil 1

<smartinfo>
<route>E</route>
<direction>Hauptbahnhof</direction>
<time>11:06</time>
</smartinfo>
=Teil 2...

Das Problem daran ist wohl, dass die Tags gleich sind...

uwefed

Die Teile sind gleich kommen aber nacheinander nach dem Aufruf der URL und darum eindeutig zuordenbar.
Du mußt einfach die Zeilenvariable auch dafür benutzen. Erster Block auf die erste Zeile, zweiter Block auf zweite Zeile ecc.
Grüße Uwe

thmmax

Lieber Uwe,

ich weiß, es ist kompliziert mit mir...aber könntest du mir einen Tipp geben wie ich das zuordnen könnte?
Stehe da im Moment echt komplett an :~

Danke!
LG Max

uwefed

Die URL hat mir 1003 Bytes als Antwort gegeben. Falls Du einen Arduino MEGA hättest könntest Du alles in ein array schreiben und dann analysieren. Der Uno hat zuwenig Platz dafür. Also muß alles ohne abzuspeichern kontrolliert werden.

Du willst route, direction und Zeit anzeigen.
Die Daten kommen so:
Code: [Select]
<?xml version="1.0" encoding="utf-8"?>
<ivbsmartinfo output="timetable">
 <smartinfo>
   <route>DE</route>
   <direction>Hauptbahnhof</direction>
   <time>12 min</time>
 </smartinfo>
 <smartinfo>
   <route>DE</route>
   <direction>Kurhaus</direction>
   <time>20:46</time>
 </smartinfo>
 <smartinfo>
   <route>DE</route>
   <direction>Kurhaus</direction>
   <time>20:46</time>
 </smartinfo>
 <smartinfo>
   <route>DE</route>
   <direction>Hauptbahnhof</direction>
   <time>21:07</time>
 </smartinfo>
 <linedirections route="DE" direction="Hauptbahnhof" dirforrequest="Hauptbahnhof"/>
 <linedirections route="D" direction="Hauptbahnhof" dirforrequest="Hauptbahnhof"/>
 <linedirections route="E" direction="Hauptbahnhof" dirforrequest="Hauptbahnhof"/>
 <linedirections route="D" direction="Kurhaus" dirforrequest="Kurhaus"/>
 <linedirections route="DE" direction="Kurhaus" dirforrequest="Kurhaus"/>
 <stopidname>Absam Dorf</stopidname>
</ivbsmartinfo>


Beschreibung Flußdiagramms des Sketches:
Du öffnest die Verbindung und schickst die Anfrage der Infos. dann in
Code: [Select]
//Anfangspositionen der 4 Zeilen (bitte kontrollieren ob zahlen richtig)
Byte posX[] = {0 , 0, 24, 24};
Byte posY[] = {0 , 8,  0,  8};
Byte Zeile;
Byte Position; // Variable um position des Texts in der Displayzeile zu definieren
...
loop(){
   if (client.connect(server, 80)) {   / anfrage Daten von Internetseite
     //Serial.println("Reconnected");
     client.println("GET /smartinfo/ivb_smartinfo_kernel.php?olifServerId=84&autorefresh=20&default_autorefresh=20&routeId=&stopId=Absam%20Dorf&optDir=-1&nRows=4&showArrivals=n&optTime=now&time=&allLines=y&app=sionline HTTP/1.0");    
     client.println("Host: www.ivb.at");
     matrix.clearScreen();  
     client.println();
     delay(0);
   }
Zeile=0;
serialEvent();
pause bis zum nächsten Update.
...
}
void serialEvent() {

char inChar = client.read();
if( Zeile<4){
kontrolle ob inChar == "<"  //Taganfang:
 nein: return  // nächstes Zeichen
 ja: kontrolle ob inChar == "r"  // Tag route  
     ja: 5 byte einlesen und nicht beachten  // oute>
     char inChar = client.read();
     While inChar != "<"
         ja: Ausgabe inChar auf Display in Position (posX[Zeile]+Postion) und posY[Zeile]
         Postion++;      
     solange nächste Zeichen holen und bis ==  "<"
     kontrolle ob inChar == "d"  // Tag direction
              Position = 6;           //Anfangsposition des Textes Direktion festlegen
              das gleiche wie mit route.
     kontrolle auf "<t" und zeit ausgeben   // 3 werte sind jetzt ausgegeben und ein Block fertig.
  Zeile ++; Postion=0; neue Zeile festlegen und 2. Block herunterladen.
   Das gleiche mit Block 2 bis 4 machen.
}
else  die 4 Blöcke wurden heruntergeladen
{
while  (inChar = client.read()){}  Restliche Seite herunterladen und ignorieren
}        
}


Den Sketch mußt Du schreiben. Ich hoffe ich habe alles richtig geschrieben.

Grüße Uwe

thmmax

#29
Mar 29, 2013, 07:16 pm Last Edit: Mar 29, 2013, 08:16 pm by thmmax Reason: 1
Lieber Uwe,

vielen vielen Dank für deine unglaubliche Hilfe!
Habe deine Idee so gut es geht mal umgesetzt, aber ein paar kleine Problemchen haben sich doch ergeben :)

Habe jetzt mal nur den ersten Tag im ersten Block versucht, alles andere sollte dann ja kein Problem sein!
Code sieht so aus, meine Probleme hab ich direkt im Code angemerkt:
Code: [Select]
void serialEvent() {

 char inChar = client.read();

 if (Zeile<4) {
   
   if (inChar == "<" ) {
     
   else {
     //wie return / zum nächsten Zeichen gehen?
     }
      }
     if (inChar == "r" ) {
       
        Serial.readBytes(5);  //liest er so 5 Bytes? Und welcher Befehl zum Ignorieren?
}

   char inChar = client.read();
     while inChar != "<"{
     matrix.setTextSize(1);
     matrix.setTextColor(1);
     {
       matrix.setCursor(posX[Zeile]+Postion), posY[Zeile]);
       matrix.println(inChar);
       matrix.writeScreen();
       }
   Position++;
   
   //Bis "<" - wie umsetzen?
   }
   
 
   }
  // ...restliche Blöcke

while (inChar = client.read()){}  

}


Vielen Dank!
LG Max

Go Up