작품/무선 GPS 송수신
GPS 값을 받아서 LCD제어
youjin.A
2016. 2. 8. 03:18
아두이노로 GPS의 값을 받아서 LCD로 이 값을 나타내는 것을 해보았습니다.
1. 우선 작품에 쓸 LCD 테스트 코드이구요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <LiquidCrystal.h> // LCD LiquidCrystal lcd(12,11,10,9,8,7); void setup() { lcd.begin(16,2); } void loop() { print_3num(1, 0, 0); print_text('.', 3, 0); print_3num(2, 4, 0); print_text('/', 7, 0); print_3num(3, 8, 0); print_3num(4, 0, 1); print_text('.', 3, 1); print_3num(5, 4, 1); print_text('/', 7, 1); print_3num(6, 8, 1); } void print_3num(int n, int p1, int p2) { if(n>99) { lcd.setCursor(p1, p2); lcd.print(n); } else if(n>9) { lcd.setCursor(p1, p2); lcd.print("0"); lcd.setCursor(p1+1, p2); lcd.print(n); } else if(n>=0) { lcd.setCursor(p1, p2); lcd.print("00"); lcd.setCursor(p1+2, p2); lcd.print(n); } } void print_text(char a, int p1, int p2) { lcd.setCursor(p1, p2); lcd.write(a); } | cs |
2. 다음은 아두이노가 GPS값을 읽어내는 코드입니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include "TinyGPS.h" #include "SoftwareSerial.h" #define HEMISPHERE_PIN 13 #define GPS_RX_PIN 5 #define GPS_TX_PIN 6 TinyGPS gps; SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN); void setup() { Serial.begin(9600); ss.begin(9600); pinMode(HEMISPHERE_PIN, OUTPUT); digitalWrite(HEMISPHERE_PIN, LOW); } void loop() { while (ss.available()) { int c = ss.read(); Serial.write(c); if (gps.encode(c)) { long lat, lon; unsigned long fix_age; gps.get_position(&lat, &lon, &fix_age); if (fix_age == TinyGPS::GPS_INVALID_AGE ) Serial.println("No fix ever detected!"); else if (fix_age > 2000) Serial.println("Data is getting STALE!"); else Serial.println("Latitude and longitude valid!"); Serial.print("Lat: "); Serial.print(lat); Serial.print(" Lon: "); Serial.println(lon); if (lat < 0) digitalWrite(HEMISPHERE_PIN, HIGH); else digitalWrite(HEMISPHERE_PIN, LOW); } } } | cs |
3. 이 두 코드를 합쳐서 LCD에 나타내야 되는데요.
여기서 문제는 초반에 GPS 값을 못 읽어 들였을 때는 Loading 이라는 문구와 처리 중이라는 영상이 나오도록 하는 것이였 습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | //LCD #include <LiquidCrystal.h> //GPS #include "TinyGPS.h" #include "SoftwareSerial.h" #define HEMISPHERE_PIN 13 #define GPS_RX_PIN 5 #define GPS_TX_PIN 6 //LCD LiquidCrystal lcd(12,11,10,9,8,7); //GPS TinyGPS gps; SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN); long lat=0, lon=0; int i = 1; int count; // ... int check_gps = 0; // ! void setup() { //LCD lcd.begin(16,2); //GPS Serial.begin(9600); ss.begin(9600); pinMode(HEMISPHERE_PIN, OUTPUT); digitalWrite(HEMISPHERE_PIN, LOW); } void loop() { //GPS while (ss.available()) { int c = ss.read(); Serial.write(c); if (gps.encode(c)) { unsigned long fix_age; gps.get_position(&lat, &lon, &fix_age); lat = (lat % 100000) * 60;//calculate lat, lon lat = (lat % 100000) / 100; lon = (lon %100000) * 60; lon = (lon %100000) / 100; check_gps=0; break; } } //LCD if(lat == 0 && lon == 0) loading(); else { print_3num(lat, 0, 0);//first line if(check_gps > 400) // ! time print_text('!', 3, 0); else print_text('.', 3, 0); print_3num(lon, 4, 0); print_text('/', 7, 0); print_3num(4, 0, 1);//second line print_text('.', 3, 1); print_3num(5, 4, 1); } print_3num(3, 8, 0); print_text('/', 7, 1); print_3num(6, 8, 1); //count looop count++; check_gps++; if(count == 25) {i++; count =0;} } void print_3num(int n, int p1, int p2) { if(n>99) { lcd.setCursor(p1, p2); lcd.print(n); } else if(n>9) { lcd.setCursor(p1, p2); lcd.print("0"); lcd.setCursor(p1+1, p2); lcd.print(n); } else if(n>=0) { lcd.setCursor(p1, p2); lcd.print("00"); lcd.setCursor(p1+2, p2); lcd.print(n); } } void print_text(char a, int p1, int p2) { lcd.setCursor(p1, p2); lcd.write(a); } void loading(void) { //first line lcd.setCursor(0,0); lcd.print("Loading"); print_text('/', 7, 0); //second line lcd.setCursor(0, 1); lcd.print("."); lcd.setCursor(0, 1); print_text('/', 7, 1); print_3num(6, 8, 1); if(i==7)//reset { lcd.setCursor(0, 1); lcd.print(". "); i=1; } lcd.setCursor(i, 1);//... lcd.print("."); } | cs |