//#include #include #include #include LCDi2cW lcd = LCDi2cW(4, 20, 0x4C, 0); uint8_t rows = 4; uint8_t cols = 20; uint8_t timeset = 0; int clearneeded; //LiquidCrystal lcd(12,11,10,9,8,7); bool ledState = LOW; volatile bool ppsTriggered = false; char serialBuffer[100]; /////////////////////// void ppsHandler(void); void ppsHandler(void) { ppsTriggered = true; } ////////////////////////////////// void pulseTheTime(int); void pulseTheTime(long counter) { digitalWrite(4, HIGH); //pulse the reset output delay(10); digitalWrite(4, LOW); for (int x = 0; x < counter; x++) { //count up the time for right now. //digitalWrite(5,HIGH); //delay(1); digitalWrite(5, LOW); digitalWrite(5, HIGH); digitalWrite(5, LOW); } return; } ///////////////////////////////////////////////////////////////////////// void setup() { //lcd.begin(20, 2); lcd.init(); lcd.clear(); lcd.write(" ---[RuhNet GPS]---"); lcd.setCursor(0, 1); //lcd.write("PROGRAM STARTING..."); lcd.print("PROGRAM STARTING..."); Serial.begin(4800); pinMode(13, OUTPUT); pinMode(6, OUTPUT); pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(3, OUTPUT); digitalWrite(5, LOW); //pulseTheTime(1000); pinMode(2, INPUT); attachInterrupt(digitalPinToInterrupt(2), ppsHandler, RISING); for (int x = 0; x < 20; x++) { digitalWrite(13, HIGH); delay(10); digitalWrite(13, LOW); delay(10); } lcd.clear(); } ////////////////////////////////////////////// void loop() { lcd.setCursor(0, 0); if (ppsTriggered) { ppsTriggered = false; ledState = !ledState; digitalWrite(13, ledState); digitalWrite(5, LOW); digitalWrite(5, HIGH); digitalWrite(5, LOW); //digitalWrite(7, ledState); } if (Serial.available()) { // wait a bit for the entire message to arrive delay(400); while (Serial.available() > 0) { for (int n = 0; n < 100; n++) { serialBuffer[n] = Serial.read(); } } String gpsString = serialBuffer; char gpsValid = gpsString.charAt(18); lcd.print(gpsString.substring(7, 9)); lcd.print(":"); lcd.print(gpsString.substring(9, 11)); lcd.print(":"); lcd.print(gpsString.substring(11, 13)); lcd.print(" UTC"); lcd.print(" ruel.io"); String timestring = gpsString.substring(7, 9) + gpsString.substring(9, 11) + gpsString.substring(11, 13); // int timeint = (gpsString.substring(7,9) + gpsString.substring(9, 11) + gpsString.substring(11, 13)).toInt(); long timeint = timestring.toInt(); long advance = 0; if (!timeset) { advance = 2; pulseTheTime(advance); advance = timeint; pulseTheTime(advance); timeset = 1; } if (gpsString.substring(11, 13) == "00") { advance = 40; pulseTheTime(advance); } if (gpsString.substring(9, 11) == "00") { advance = 4040; pulseTheTime(advance); } //String test = gpsString.substring(11,13); lcd.setCursor(0, 3); //lcd.print(timeint); //clearneeded = 0; clearneeded--; if (advance > 0) { lcd.setCursor(0, 3); lcd.print("Advance Pulse:"); clearneeded = 2; lcd.print(advance); } else if (!clearneeded) { lcd.print("GPS SYNC TIME"); lcd.print(" "); lcd.write(127); lcd.print(" |"); //lcd.print(gpsString.substring(11,13)); } lcd.setCursor(0, 2); if (gpsValid == 'V') { lcd.print(" NO POSITION LOCK "); lcd.setCursor(0, 1); if (ledState) { lcd.print("--****--"); } else { lcd.print("Searching for GPS..."); } // digitalWrite(8,LOW); //lock indicator LED } else { lcd.print(" GPS LOCK"); lcd.setCursor(0, 1); lcd.print(gpsString.substring(20, 22)); lcd.print("."); lcd.print(gpsString.substring(22, 24)); lcd.print(gpsString.substring(25, 27)); lcd.print("N "); lcd.print(gpsString.substring(33, 35)); lcd.print("."); lcd.print(gpsString.substring(35, 37)); lcd.print(gpsString.substring(38, 40)); lcd.print("W "); lcd.print(gpsString.substring(40, 42)); //digitalWrite(8,HIGH); //lock indicator LED } } }