| @ -0,0 +1,210 @@ | |||||
| //#include <LiquidCrystal.h> | |||||
| #include <Wire.h> | |||||
| #include <inttypes.h> | |||||
| #include <LCDi2cW.h> | |||||
| 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("--**<RuhNet GPS>**--"); | |||||
| } 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 | |||||
| } | |||||
| } | |||||
| } | |||||