| @ -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 | |||
| } | |||
| } | |||
| } | |||