달력

5

« 2024/5 »

  • 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
2016. 2. 8. 03:18

GPS 값을 받아서 LCD제어 작품/무선 GPS 송수신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(100);
  print_text('.'30);
 
  print_3num(240);
  print_text('/'70);
  
  print_3num(380);
  
 
  print_3num(401);
  print_text('.'31);
  
  print_3num(541);
  print_text('/'71);
  
  print_3num(681);
}
 
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값을 읽어내는 코드입니다.

 gps_datasheet.pdf

 
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 == && lon == 0)
    loading();
  else
  {
    print_3num(lat, 00);//first line
    if(check_gps > 400// ! time
    print_text('!'30);
    else
    print_text('.'30);
    print_3num(lon, 40);
    print_text('/'70);
    print_3num(401);//second line 
    print_text('.'31);
    print_3num(541);
  }
  print_3num(380);
  print_text('/'71);
  print_3num(681);
  
  //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('/'70);
    
  //second line  
  lcd.setCursor(01);
  lcd.print(".");
  lcd.setCursor(01);
  print_text('/'71);
  print_3num(681);
  if(i==7)//reset
   {
     lcd.setCursor(01);
     lcd.print(".      ");
     i=1;
   }
   lcd.setCursor(i, 1);//...
   lcd.print(".");
}
cs


'작품 > 무선 GPS 송수신' 카테고리의 다른 글

무선 송수신기 + GPS + LCD  (0) 2016.02.08
무선송수신모듈 RH447  (0) 2016.02.08
:
Posted by youjin.A