Arduino: GPS first trial
Jump to navigation
Jump to search
Instalasi Library
wget https://www.monocilindro.com/wp-content/uploads/2016/03/tempo_library_v1.zip mv tempo_library_v1.zip ~/Arduino/libraries/ cd ~/Arduino/libraries/ unzip tempo_library_v1.zip
Code
#include <SoftwareSerial.h> #include "tempo.h" bool first_loop_exec; unsigned long time_1=0; unsigned long time_2=0; #define GPS_INFO_BUFFER_SIZE 128 char GPS_info_char; char GPS_info_buffer[GPS_INFO_BUFFER_SIZE]; unsigned int received_char; int i; // counter bool message_started; SoftwareSerial mySerial_GPS(7, 8); // 7=RX, 8=TX (needed to communicate with GPS) // REAL TIME SCHEDULER PARAMETERS AND VARIABLES #define SCHEDULER_TIME 10000 // scheduler interrupt runs every 20000us = 20ms #define DIVIDER_STD 200 // logging message sent every 100 scheduler times (20ms) 1s #define DIVIDER_DELAY 500 // delay after forwarding meggages is 3s unsigned int divider=0; unsigned int divider_max=DIVIDER_DELAY; // SENDS THE POLLING MESSAGE TO GPS void scheduled_interrupt() { divider++; if (divider==divider_max) { divider=0; divider_max=DIVIDER_STD; time_1 = millis(); mySerial_GPS.println("$PUBX,00*33"); // data polling to the GPS } } void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Connected"); mySerial_GPS.begin(9600); mySerial_GPS.println("Connected"); first_loop_exec=true; i=0; message_started=false; Timer1.initialize(); // initialize 10ms scheduler timer Timer1.setPeriod(SCHEDULER_TIME); // sets the main scheduler time in microseconds (10ms in this case) Timer1.attachInterrupt(scheduled_interrupt); // attaches the interrupt Timer1.start(); // starts the timer } void loop() { // run over and over if (first_loop_exec == true){ delay(2000); mySerial_GPS.println(F("$PUBX,40,RMC,0,0,0,0*47")); //RMC OFF delay(100); mySerial_GPS.println(F("$PUBX,40,VTG,0,0,0,0*5E")); //VTG OFF delay(100); mySerial_GPS.println(F("$PUBX,40,GGA,0,0,0,0*5A")); //CGA OFF delay(100); mySerial_GPS.println(F("$PUBX,40,GSA,0,0,0,0*4E")); //GSA OFF delay(100); mySerial_GPS.println(F("$PUBX,40,GSV,0,0,0,0*59")); //GSV OFF delay(100); mySerial_GPS.println(F("$PUBX,40,GLL,0,0,0,0*5C")); //GLL OFF delay(1000); first_loop_exec = false; } // MANAGES THE CHARACTERS RECEIVED BY GPS while (mySerial_GPS.available()) { GPS_info_char=mySerial_GPS.read(); if (GPS_info_char == '$'){ // start of message message_started=true; received_char=0; }else if (GPS_info_char == '*'){ // end of message time_2 = millis(); Serial.print("Time,"); Serial.print(time_1); Serial.print(","); Serial.print(time_2); Serial.println(","); for (i=0; i<received_char; i++){ Serial.write(GPS_info_buffer[i]); // writes the message to the PC once it has been completely received } Serial.println(); message_started=false; // ready for the new message }else if (message_started==true){ // the message is already started and I got a new character if (received_char<=GPS_INFO_BUFFER_SIZE){ // to avoid buffer overflow GPS_info_buffer[received_char]=GPS_info_char; received_char++; }else{ // resets everything (overflow happened) message_started=false; received_char=0; } } } while (Serial.available()) { mySerial_GPS.write(Serial.read()); } }