Pages: [1]   Go Down
Author Topic: Einsteigerfragen  (Read 988 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seit knapp 2 Wochen beschäfftige ich mich mit dem Arduino Duemilanove und frage mich warum ich nicht schon früher mit dem programmieren angefangen habe.

hab mir auch das Buch Arduino "Physical Computing für Bastler, Designer & Geeks" besorgt ... muss leider aber sagen das das Buch eine Menge Fehler aufweisst und für Einsteiger wie mich ... bei manchen Fehlern zur Weissglut führte ^^ aber das beiseite ...

Ich probiere nun Seit Tagen den NMEA String von meinem UBLOX-GPS 4T auseinanderzunehmen was mir auch im einzelnen gelingt.

Der GPRMC String reicht für die meisten Aussagen ja aus ... aber ich hätte gern nach Anzahl der erfassten Sateliten sowie momentane Genauigkeit dafür benötige ich aber noch GPGGA
Also die Auswertung des einzelnen Strings bekomme ich schon hin ... aber immer nur von einem.

Was ich nicht schaffe ist Ihm zu sagen suche  gleichzeitig nach "$GPRMC" und "$GPGGA"  und schicke mir diese beiden Strings

Entweder entwickle ich immer solch eine logik das er mir garnix mehr ausspuckt weil er kein true mehr bekommt, oder er mir wild alles mögliche des NMEA Strings ausgibt.
Was ich halt nur schaffe ist die Suche nach einem von beiden, dies war mir natürlich nur möglich durch die vielen teils guten tutorials.

mir fällt es sogar schwer die Frage richtig zu formulieren weil ich nicht wirklich sagen kann warum er mich nicht versteht^^

vllt hier mal der momentane  Programmstand:(der ist inzwischen ganzschön durcheinandergewürfelt durch die ständigen änderungen

#include <NewSoftSerial.h>
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char HauptZeile[100] ="";
char HauptString[7] ="$GPRMC",NebenString[7]="$GPGGA";
int Hzaehl = 0;
int Hgut = 0;
int Hschlecht = 0;
int Hwerte[13];

//int byteGPGGA=-1;
//char NebenZeile[100] ="";
//char NebenString[7]="$GPGGA";
//int Nzaehl = 0;
//int Ngut = 0;
//int Nschlecht = 0;
//int HNerte[13];


void setup()
{
  pinMode(ledPin,OUTPUT);
  Serial.begin(38400);
  Serial.println("Warte auf Signal");
  delay(1000);
  gpsSerial.begin(9600);
  Serial.println("intialisiere GPS-Port");
  delay(1000);
  Serial.println("Warte auf GPS-Signal");
  Serial.println("--------------------");
  
  for (int i=0;i<100;i++)
  {
    HauptZeile=' ';
  }

 //  for (int j=0;j<100;j++)
 // {
 //   NebenZeile[j]=' ';
 // }
}
void loop()
{
  digitalWrite(ledPin, HIGH);
  byteGP=gpsSerial.read();
  if (byteGP == -1)
  {
    delay(100);
  }
  else
  {
    HauptZeile[Hschlecht]=byteGP;
    Hschlecht++;
    if (byteGP==13)
    {
      digitalWrite(ledPin,LOW);
      Hzaehl=0;
      Hgut=0;
      for (int i=1;i<7;i++)
      {
        if(HauptZeile==(HauptString[i-1]))//&&(NebenString[i-1]));
        {
          Hgut++;
        }
      }
      if(Hgut==6)
      {

        //for(int i=0;i<70;i++)
        //{
        //  if(HauptZeile==',')
        //  {
        //    Hwerte[Hzaehl]=i;
        //    Hzaehl++;
        //  }
        //  if(HauptZeile[i++]=='*')
        //  {
        //    Hwerte[12]=i;
        //    Hzaehl++;
        //  }
        //}
        Serial.println(HauptZeile);
        //Serial.println(NebenZeile);
        //Serial.println("");
        //for(int i=0;i<12;i++)
        //{
        //  switch(i)
        //  {
        //    case 0 :Serial.print("Zeit = ");//break;
        //  }
          //for (int k=Hwerte;k<(Hwerte[i+1]-1);k++)
          //{
          //  Serial.print(HauptZeile[k+1]);
          //}
        //}
       }
       Hschlecht=0;                    
       for (int i=0;i<100;i++)
       {    
         HauptZeile=' ';
       }
    }
  }
}
« Last Edit: November 04, 2010, 03:58:54 am by afrahm1981 » Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie wärs denn z.B. mit so nem Ansatz:
Code:
for (int i=1;i<7;i++)
     {
       if(HauptZeile[i]==(HauptString[i-1]));
       {
         Hgut++;
       }
       if(HauptZeile[i]==(NebenString[i-1]));
       {
         Ngut++;
       }
     }
     if(Hgut==6)
     {...}
     if(Ngut==6)
     {...}
...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ersteinmal DANKE schön für Deine rasche Antwort ...

Nicht Wundern bin grad im Raum daher die NMEAdaten...
aber wieder das problem er spuckt mit mehr als nur den GPRMC und GPGGA


$GPGSA,A,1,,,,$GPRMC,,V,,,,,,,,,,N*53
                                                             $GPRMC

$GPVTG,,,,,,,,,N*30
                                                                               $GPRMC

$GPGGA,,,,,,0,00,99.99,,,,,,*48
                                                                   $GPRMC

$GPGSA,A99.99*30
                                                                                  $GPRMC

$GPGSV,1,1,*48
                                                                                    $GPRMC

$GPRMC,,V,,,,,,,,,,N*53
                                                                           $GPRMC

$GPRMC,,V,,,,,,,,,,N*53
                                                                           $GPRMC

$GPVTG,,,,,,,,,N*30
                                                                               $GPRMC

$GPGGA,,,,,,0,00,,*48
                                                                             $GPRMC

$GPGSA,A,1,,,,,,,,$GPRMC,,V,,,,,,,,,,N*53
                                                         $GPRMC

Quote
#include <NewSoftSerial.h>
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char HauptZeile[100] ="";
char HauptString[7] ="$GPRMC",NebenString[7]="$GPGGA";
int Hzaehl = 0;
int Hgut = 0;
int Hschlecht = 0;
int Hwerte[13];
//int byteGPGGA=-1;
//char NebenZeile[100] ="";
//char NebenString[7]="$GPGGA";
//int Nzaehl = 0;
int Ngut = 0;
//int Nschlecht = 0;
//int HNerte[13];


void setup()
{
  pinMode(ledPin,OUTPUT);
  Serial.begin(38400);
  Serial.println("Warte auf Signal");
  delay(1000);
  gpsSerial.begin(9600);
  Serial.println("intialisiere GPS-Port");
  delay(1000);
  Serial.println("Warte auf GPS-Signal");
  Serial.println("--------------------");
  
  for (int i=0;i<100;i++)
  {
    HauptZeile=' ';
  }
  // for (int j=0;j<100;j++)
  //{
  //  NebenZeile[j]=' ';
  //}
}
void loop()
{
  digitalWrite(ledPin, HIGH);
  byteGP=gpsSerial.read();
  if (byteGP == -1)
  {
    delay(100);
  }
  else
  {
    HauptZeile[Hschlecht]=byteGP;
    Hschlecht++;
    if (byteGP==13)
    {
      digitalWrite(ledPin,LOW);
      Hzaehl=0;
      Hgut=0;
      Ngut=0;
      for (int i=1;i<7;i++)
      {
        if(HauptZeile==(HauptString[i-1]))
        {
          Hgut++;
        }
        if(HauptZeile==(NebenString[i-1]));
        {
          Ngut++;
        }
      }
      if(Hgut==6)
      {
        //for(int i=0;i<70;i++)
        //{
        //  if(HauptZeile==',')
        //  {
        //    Hwerte[Hzaehl]=i;
        //    Hzaehl++;
        //  }
        //  if(HauptZeile[i++]=='*')
        //  {
        //    Hwerte[12]=i;
        //    Hzaehl++;
        //  }
        //}
        Serial.println(HauptZeile);
        //Serial.println(NebenZeile);
        //Serial.println("");
        //for(int i=0;i<12;i++)
        //{
        //  switch(i)
        //  {
        //    case 0 :Serial.print("Zeit = ");//break;
        //  }
          //for (int k=Hwerte;k<(Hwerte[i+1]-1);k++)
          //{
          //  Serial.print(HauptZeile[k+1]);
          //}
        //}
       }
       if(Ngut==6)
       {
         Serial.println(HauptZeile);
       }
        
       Hschlecht=0;                    
       for (int i=0;i<100;i++)
       {    
         HauptZeile=' ';
       }
    }
  }
}


PS: welchen button benötigt man um so ein scrollfenster in den eigenen Post einzuführen Quote war ja falsch
« Last Edit: November 04, 2010, 04:49:12 am by afrahm1981 » Logged

CH
Offline Offline
God Member
*****
Karma: 19
Posts: 703
Book Writer "Arduino Praxiseinstieg"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
welchen button benötigt man um so ein scrollfenster in den eigenen Post einzuführen Quote war ja falsch
Der Button "Insert Code" mit #
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Öhm, also ich seh jetzt auch den ersten Blick auch nicht, woran das liegt...  :-?

Wie wäre es denn generell mit etwas in der Richtung:
Code:
loop() {
  while (gpsSerial.available()) {
    hauptZeile[hschlecht] = gpsSerial.read();
    if (hauptZeile[hschlecht++] == '\n') {
      hauptZeile[hschlecht-1] = '\0'; // Ende einer Zeile -> Ende des Strings
      if (hauptZeile[0] == '$' && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'G' && hauptZeile[4] == 'G' && hauptZeile[5] == 'A') {
        Serial.println(hauptZeile); // GPGGA...
      }
      if (hauptZeile[0] == '$' && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'R' && hauptZeile[4] == 'M' && hauptZeile[5] == 'C') {
        Serial.println(hauptZeile); // GPRMC...
      }
      hschlecht = 0; // Den Positionszeiger wieder auf den Anfang des Arrays setzen
    }
  }
}
Das wäre relativ klein und kompakt, und Du bräuchtest das Array nicht immer aufräumen...

PS: Ist jetzt nur "schnell hingeschmiert", habs nicht getestet. Kann sein, dass noch der ein oder andere Fehler drin ist. smiley-wink

(Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)
Danke für den Tip werd ich mir merken! Darf das doch unter Anfängerfehlerv verbuchen^^ hoffe ich

Und Besonderen Dank für dein Code der hat sofort funktioniert, mir fällt da ne Last im Kopf ab jetzt bin ich endlich wieder ansprechbar^^
Quote
Warte auf Signal
intialisiere GPS-Port
Warte auf GPS-Signal
--------------------
$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48

$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48

$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48


PS: und der ist auch noch ziemlich kurz bündig und übersichtlich

Echt klasse danke!!
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Kein Problem, gern geschehen. smiley
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3482
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)

Genaugenommen ist es so, daß man oft verschiedene Arten von Entitäten per Namenskonvention auszeichnet. Die "richtige" Namenskonvention hingegen ist oft Anlaß für Glaubenskriege. Genauso wie die "richtige" Einrückung smiley-wink

Eine "richtige" Konvention hat außerdem häufig schon eine gewisse Länge, also z.B. so http://geosoft.no/development/cppstyle.html.
http://www.possibility.com/Cpp/CppCodingStandard.html ist auch nicht schlecht. Davon abgesehen empfehle ich "Code Complete" smiley

Gruß, Udo
« Last Edit: November 04, 2010, 12:44:53 pm by udoklein » Logged

Check out my experiments http://blog.blinkenlight.net

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo nachdem ich nun etwas weiter rumgespielt habe bin ich auf ein Problem gestossen was ich mir noch nicht wirklich erklären kann.

Jenachdem wann ich nach start des Programmes anfange das Signal zu messen "stürzt" das Board meiner Meinung nach ab und macht das gleiche wie beim Reset sprich es fängt von vorn an.

PS: Zum einen glaube ich das das was mit der Anzahl der Zeichen zu tun hat, solange ich Indoor messe läuft das Progrämmchen reibungslos, sobald ich aber GPS habe ... wird igendwas wahrscheinlich überflutet und resetet ... besser kann ich es nicht umschreiben.
Code:
//AF,RM,Joghurt
#include <NewSoftSerial.h>
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char hauptZeile[100] ="";
//char HauptString[7] ="$GPRMC";
//char NebenString[7]="$GPGGA";
int hzaehl = 0;
int hgut = 0;
int hschlecht = 0;
int hwerte[13];
int i=6;
int j;
int z=0;

void setup()
{
  pinMode(ledPin,OUTPUT);
  Serial.begin(38400);
  Serial.println("Warte auf Signal");
  delay(1000);
  gpsSerial.begin(9600);
  Serial.println("intialisiere GPS-Port");
  delay(1000);
  Serial.println("Warte auf GPS-Signal");
  Serial.println("--------------------");
  
  for (int i=0;i<100;i++)
  {
    hauptZeile[i]=' ';
  }
}

void loop() {
  while (gpsSerial.available()) {
    hauptZeile[hschlecht] = gpsSerial.read();
    if (hauptZeile[hschlecht++] == '\n') {
      hauptZeile[hschlecht-1] = '\0'; // Ende einer Zeile -> Ende des Strings
      if (hauptZeile[0] == '$' && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'R' && hauptZeile[4] == 'M' && hauptZeile[5] == 'C') {
        Serial.println(hauptZeile);// GPRMC..
            i=6;
            z=0;
            while((hauptZeile[i]==',')&&(hauptZeile[i]!='\0'))
            {
              switch(z){
               case 0 :Serial.print("Zeit(UTC)                   = ");break;
               case 1 :if (gpsSerial.read() == 'A')  // Wenn Signal aktiv schreibe "Signal aktiv
                       {
                         Serial.print("Signal aktiv                = ");;break;
                       }
                       else
                       {
                         Serial.print("ungueltiges Signal          = ");};break;
               case 2 :Serial.print("Breitengrad                 = ");break;
               case 3 :Serial.print("Ausrichtung (N=Nord/S=Sued) = ");break;
               case 4 :Serial.print("Laengengrad                 = ");break;
               case 5 :Serial.print("Ausrichtung (E=Ost/W=West)  = ");break;
               case 6 :Serial.print("Geschwindigkeit (Knoten)    = ");break;
               case 7 :Serial.print("Bewegungsrichtung (Grad)    = ");break;
               case 8 :Serial.print("Datum(UTC)                  = ");break;
               case 9 :Serial.print("Missweisung                 = ");break;
               case 10 :Serial.print("Ausrichtung (E=Ost/W=West)  = ");break;
               case 11 :Serial.print("Mode                        = ");
                       delay(100);break;
               //case 12 :Serial.print("Checksum                    = ");
               //         Serial.println("----------------------------");
               //         delay(100);break;
              }

              
              while((hauptZeile[i+1]!=',')&&(hauptZeile[i+1]!='\0'))
              {
                j=i+1;
                Serial.print(hauptZeile[j]);
                i++;              
              }
              Serial.println();
              z++;
              i++;
            }
      }
      if (hauptZeile[0] == '$' && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'G' && hauptZeile[4] == 'G' && hauptZeile[5] == 'A') {
        Serial.println(hauptZeile); // GPGGA...
            i=6;
            z=0;
            while((hauptZeile[i]==',')&&(hauptZeile[i]!='\0'))
            {
              switch(z){
               case 0 :Serial.print("Zeit(UTC)                       = ");break;
               case 1 :Serial.print("Breitengrad                     = ");break;
               case 2 :Serial.print("Ausrichtung (N=Nord/S=Sued)     = ");break;
               case 3 :Serial.print("Laengengrad                     = ");break;
               case 4 :Serial.print("Ausrichtung (E=Ost/W=West)      = ");break;
               case 5 :Serial.print("Qualitaet der Messung           = ");break;
                      // Serial.println("0 = ungueltig;1 = GPS; 2 = DGPS; 6 = gschaetzt nur NMEA-0183 2.3");
               case 6 :Serial.print("Anzahl der erfassten Satelliten = ");break;
               case 7 :Serial.print("Genauigkeit in Prozent          = ");break;
               case 8 :Serial.print("Hoehe ueber Meer                = ");break;
               case 9 :Serial.print("Einheit                         = ");break;
               case 10 :Serial.print("Hoehe ueber Ellipsoid           = ");break;
               case 11 :Serial.print("Einheit                         = ");break;
              }

              
              while((hauptZeile[i+1]!=',')&&(hauptZeile[i+1]!='\0'))
              {
                j=i+1;
                Serial.print(hauptZeile[j]);
                i++;              
              }
              Serial.println();
              z++;
              i++;
            }
       }
      
      hschlecht = 0; // Den Positionszeiger wieder auf den Anfang des Arrays setzen
      
    }
  }
}
Vllt kann das mir mal einer erklären^^ anhand des Programmes
« Last Edit: November 07, 2010, 11:12:43 am by afrahm1981 » Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Also auf den ersten Blick würde ich schätzen, dass Du in den ersten while-Schleifen das i nicht hochzählst und er daher nicht mehr da raus kommt...? Soll das wirklich ne while sein und nicht mehr ne if?
« Last Edit: November 07, 2010, 01:05:48 pm by Joghurt » Logged

Pages: [1]   Go Up
Jump to: