Wegweiser

Titelseite

Gabi

Haus

Bernd

Mobil

Schweden

Imperium

Dies & Das

Programm-Code GPS-Logger

 

#include <NewSoftSerial.h>
#include <SdFat.h>
#include <SdFatUtil.h> 
#include <ctype.h>
#include <EEPROM.h>
Sd2Card SDKARTE;
SdVolume SPEICHER;
SdFile VERZEICHNIS;
SdFile DATEI;
int LED_ROT=7;
int LED_GRUEN=6;
int LED_BLAU=5;
NewSoftSerial NSS(3,2); 
char PUFFER[150];
char AV;
int INDEX_PUFFER;
int MERK;
int OK;
int X,Y;
int KOMMA,VK,NK,Z,KMH1,KMH2,KMH3,KMH4,KMH5,KMH;
char MEILEN[7];
char SATELLITEN[3];
int ANZSAT;
int TEMPO;
// Dateihandling
char DATEINAME1[13];
char DATEINAME2[13];
int ADRESSE;
int UB,LB,FERTIG;
int DATEINUMMER;
String string1,string2,string3;
String string4,string5,string6;
String string7;
//*********************************
void setup()
{
    //Serial.begin(9600);
    NSS.begin(4800); 
    pinMode(LED_ROT,OUTPUT);
    pinMode(LED_GRUEN,OUTPUT);
    pinMode(LED_BLAU,OUTPUT);
    INDEX_PUFFER=0;
    OK=0;
// Dateihandling
    pinMode(10, OUTPUT);               //Pin 10 ist reserviert fuer Kommunikation
    SDKARTE.init();                    //Initialisieren SD und I/O pins.
    SPEICHER.init(SDKARTE);            //Initialisiert Laufwerk .
    VERZEICHNIS.openRoot(SPEICHER);    //Oeffnet Directory.
    delay(500);
    ADRESSE=100;
    //EEPROM
    EEPROM_LESEN();
    //Datei 1
    string1=String("GPS");
    string2=String(DATEINUMMER);
    string3=String (".TXT");
    string4=string1+string2+"A"+string3;
    if(DATEINUMMER<100){string4=string1+"0"+string2+"A"+string3;}
    if(DATEINUMMER<10){string4=string1+"00"+string2+"A"+string3;}    
    string4.toCharArray(DATEINAME1,13);
    //Datei 2
    string5=String("GPS");
    string6=string5+string2+"B"+string3;
    if(DATEINUMMER<100){string6=string5+"0"+string2+"B"+string3;}
    if(DATEINUMMER<10){string6=string5+"00"+string2+"B"+string3;}
    string6.toCharArray(DATEINAME2,13);
    DATEINUMMER++;
    EEPROM_SCHREIBEN();
    delay(1000);
    digitalWrite(LED_BLAU,HIGH);
    digitalWrite(LED_GRUEN,HIGH);
    digitalWrite(LED_ROT,HIGH);

}
//*********************************
void loop()
{
    while (true)
    {
        if (NSS.available())
        {
            char c = NSS.read();
            PUFFER[INDEX_PUFFER]=c;
            INDEX_PUFFER++;
            MERK=0;
            if (c == '\n'){MERK=1;}
            if (INDEX_PUFFER==sizeof(PUFFER)-1){MERK=1;}
            OK=0;            
            if(MERK==1)            
            {
                PUFFER[INDEX_PUFFER]='\0';
                INDEX_PUFFER=0;
                if(PUFFER[0]!='$')//{MERK=0;}  
                //if(MERK==0)
                {
                    //Serial.print("$");Serial.println(PUFFER[0]);
                    digitalWrite(LED_ROT,LOW);
                    digitalWrite(LED_GRUEN,HIGH);
                    break;                
                }
                digitalWrite(LED_ROT,HIGH);
                digitalWrite(LED_GRUEN,LOW);                
                if(PUFFER[0]=='$' && OK==0){OK=1;}
                if(PUFFER[1]=='G' && OK==1){OK=2;}
                if(PUFFER[2]=='P' && OK==2){OK=3;}
                if(PUFFER[3]=='G' && OK==3){OK=4;}
                if(PUFFER[4]=='G' && OK==4){OK=5;}
                if(PUFFER[5]=='A' && OK==5){OK=6;}
                // nur fuer km/h und "A" bzw. "V"
                if(PUFFER[3]=='R' && OK==3){OK=4;}
                if(PUFFER[4]=='M' && OK==4){OK=5;}
                if(PUFFER[5]=='C' && OK==5){OK=7;}
                if(OK==7)
                {
                    KOMMA=0;
                    for(X=0;X<100;X++)
                    {
                        if(PUFFER[X]==','){KOMMA++;}
                        if(KOMMA==2 && PUFFER[X] !=',')
                        {AV=PUFFER[X];}
                    }
                    if(AV!='A')
                    {
                        //Serial.print(PUFFER);
                        //Serial.print("A");Serial.println(AV);
                        digitalWrite(LED_ROT,LOW);
                        digitalWrite(LED_GRUEN,HIGH);
                        break;
                    }                    
                }
                if(AV=='A')
                {                
                    digitalWrite(LED_ROT,HIGH);
                    digitalWrite(LED_GRUEN,LOW);                    
                    if(OK==7)
                    {
                        KOMMA=0;
                        TEMPO=0;
                        for(X=0;X<100;X++)
                        {
                            if(PUFFER[X]==','){KOMMA++;}
                            if(KOMMA==7 && PUFFER[X] !=',')
                            {
                                MEILEN[TEMPO]=PUFFER[X];
                                TEMPO++;
                            }
                        }
                        KOMMA=0;NK=0;VK=0;
                        for(X=0;X<TEMPO;X++)
                        {
                            Z=MEILEN[X];
                            if(Z=='.'){KOMMA=X;}
                            if(KOMMA==0){VK++;}
                            if(KOMMA!=0)
                            {
                                if(Z!='.'){NK++;}
                            }
                        }
                        KMH1=0;KMH2=0;KMH3=0;KMH4=0;KMH5=0,KMH=0;
                        if(VK==1)
                        {    
                           KMH3=int(MEILEN[0]-48);
                        }
                        if(VK==2)
                        {
                            KMH2=int(MEILEN[0]-48);
                            KMH3=int(MEILEN[1]-48);
                        }
                        if(VK==3)
                        {
                            KMH1=int(MEILEN[0]-48);
                            KMH2=int(MEILEN[1]-48);
                            KMH3=int(MEILEN[2]-48);
                        }
                        KMH4=int(MEILEN[KOMMA+1]-48);
                        KMH5=int(MEILEN[KOMMA+2]-48);                    
                        KMH=(((KMH1*10000)+(KMH2*1000)+(KMH3*100)+(KMH4*10)+(KMH5)));
                        KMH=KMH*1.852;
                        KMH=KMH/100;
                    }
                    if(OK==6)
                    {
                        //nach dem 7. Komma Anzahl Satelliten
                        KOMMA=0;Y=0;
                        for(X=0;X<100;X++)
                        {
                            if(PUFFER[X]==','){KOMMA++;}
                            if(KOMMA==7 && PUFFER[X] !=',')
                            {
                                SATELLITEN[Y]=PUFFER[X];
                                Y++;
                                if(KOMMA==8){break;}
                            }
                        }
                        ANZSAT=(((SATELLITEN[0]-48)*10)+(SATELLITEN[1]-48));
                        //KMH=10;                        
                        if(KMH>=3)
                        {
                            digitalWrite(LED_BLAU,LOW);
                            DATEI.open(VERZEICHNIS, DATEINAME1, O_CREAT | O_APPEND | O_WRITE);
                            DATEI.print(PUFFER);    
                            delay(10);
                            DATEI.close();
                            delay(100);
                            DATEI.open(VERZEICHNIS, DATEINAME2, O_CREAT | O_APPEND | O_WRITE);
                            DATEI.print(PUFFER);
                            delay(10);
                            DATEI.close();        
                            digitalWrite(LED_BLAU,HIGH);
                        }
                    }
                }
                /*
                Serial.print(PUFFER);
                Serial.print("OK:");
                Serial.print(OK);
                Serial.print("  KMH:");
                Serial.print(KMH);
                Serial.print("  AV;");
                Serial.print(AV);
                Serial.print("  SAT:");
                Serial.println(ANZSAT);                
                */
            }
        }
    }
}
//++++++++++++++++++++++++++++
int EEPROM_LESEN()
{
    UB = EEPROM.read(ADRESSE);
    LB = EEPROM.read(ADRESSE + 1);
    DATEINUMMER=LB+(UB*256);
    return FERTIG;
}
//++++++++++++++++++++++++++++
int EEPROM_SCHREIBEN()
{
    if(DATEINUMMER==256)
    {
        for(X=0;X<10;X++)
        {
            digitalWrite(LED_ROT,HIGH);delay(200);
            digitalWrite(LED_GRUEN,HIGH);delay(200);
            digitalWrite(LED_BLAU,HIGH);delay(200);
            digitalWrite(LED_BLAU,LOW);delay(200);
            digitalWrite(LED_GRUEN,LOW);delay(200);
            digitalWrite(LED_ROT,LOW);delay(200);        
        }
        DATEINUMMER=0;
    }        
    UB = (DATEINUMMER / 256);
    LB = DATEINUMMER - (UB * 256);
    EEPROM.write(ADRESSE, UB);
    EEPROM.write(ADRESSE + 1, LB);
    return FERTIG;
}