- I am using Arduino Mega 2560 and I have written code for my GPS module (Neo-6m-0-001/GY-NEO6MV2) and it is working fine independently.
- I also have written code for Compass module (QMC5883L) which is also working fine independently and I am displaying the direction on my TFT (made a graphical compass dial on TFT) in real-time which is also working fine and needle varies according to my compass direction.
- Now I am trying to combine both codes and display the long. and lat. values in graphical TFT fields but it is giving me error.
GPS code
//Connect with pin 18 and 19
#include <TinyGPS.h>
float lat,lon;
TinyGPS gps; // create gps object
void setup()
{
Serial.begin(57600); // connect serial
Serial.println("The GPS Received Signal:");
Serial1.begin(9600); // connect gps sensor
}
void loop(){
while(Serial1.available()){ // check for gps data
if(gps.encode(Serial1.read()))// encode gps data
{
gps.f_get_position(&lat,&lon); // get latitude and longitude
Serial.print("Position: ");
//Latitude
Serial.print("Latitude: ");
Serial.print(lat,6);
Serial.print(",");
//Longitude
Serial.print("Longitude: ");
Serial.println(lon,6);
}
}
}
TFT and Compass Code
#include <stdlib.h>
#include <SPI.h>
#include <Wire.h> // this is needed even tho we aren't using it
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Adafruit_STMPE610.h>
#include <SoftwareSerial.h>
void Draw_Compass_Rose();
void display_item(int x, int y, String token, int txt_colour, int txt_size);
void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour);
// For the Adafruit TFT shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000
/*** UI details */
#define BUTTON_X 40
#define BUTTON_Y 140
#define BUTTON_W 60
#define BUTTON_H 30
#define BUTTON_SPACING_X 20
#define BUTTON_SPACING_Y 10
#define BUTTON_TEXTSIZE 2
/* Back Button details */
#define BACK_BUTTON_X 40
#define BACK_BUTTON_Y 40
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// text box where numbers go,position the text box/rectangle
#define TEXT_X 10
#define TEXT_Y 10
#define TEXT_X1 10
#define TEXT_Y1 50
#define TEXT_X2 10
#define TEXT_Y2 90
#define TEXT_W 220
#define TEXT_H 30
#define TEXT_TSIZE 3
#define TEXT_TCOLOR ILI9341_MAGENTA
// the data (phone #) we store in the textfield
#define TEXT_LEN 12
char latitude[TEXT_LEN+1] = "";
char longitude[TEXT_LEN+1] = "";
uint8_t latitude_i=0;
uint8_t longitude_i=0;
char STATUS_X;
char STATUS_Y;
float lat = 0.0;
float lon = 0.0;
float AZMTH = 0.0;
float add;
const int centreX = 160;
const int centreY = 120;
const int diameter = 100;
int last_dx, last_dy, dx, dy;
// 0 -> Keypad 1 -> Compass
unsigned int page_state = 0;
// 0 -> latitude 1 -> longitude
unsigned int cursor_state = 0;
/* create 15 buttons, in classic candybar phone style */
char buttonlabels[15][5] = {"ENT", "CLR", "NEXT", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ">"};
uint16_t buttoncolors[15] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_ORANGE};
Adafruit_GFX_Button buttons[15];
char backButtonLable[1][5] = {"Back"};
uint16_t backButtonColors[1] = {ILI9341_DARKGREEN};
Adafruit_GFX_Button backButton[1];
// Print something in the mini status bar with either flashstring
void status(const __FlashStringHelper *msg) {
tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
tft.setCursor(STATUS_X, STATUS_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);//font size on top of white box
tft.print(msg);
}
// or charstring
void status(char *msg) {
tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
tft.setCursor(STATUS_X, STATUS_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);//font size on top of white box
tft.print(msg);
}
void setup() {
Serial.begin(9600);
Serial.println("Arduin-Test-LCD");
// clear the screen
tft.begin();
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_MAGENTA);
tft.print(" WELCOME TO AZIMUTH SYSTEM");
// eep touchscreen not found?
if (!ts.begin()) {
Serial.println("Couldn't start touchscreen controller");
while (1);
}
Serial.println("Touchscreen started");
// create buttons
for (uint8_t row=0; row<5; row++) {
for (uint8_t col=0; col<3; col++) {
buttons[col + row*3].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X),
BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text
BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col+row*3], ILI9341_WHITE,
buttonlabels[col + row*3], BUTTON_TEXTSIZE);
buttons[col + row*3].drawButton();
}
}
// create 'text field'
tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.drawRect(TEXT_X1, TEXT_Y1, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.drawRect(TEXT_X2, TEXT_Y2, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.setCursor(TEXT_X+2, TEXT_Y+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" LAT:");
tft.setCursor(TEXT_X1 + 2, TEXT_Y1+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" LONG:");
tft.setCursor(TEXT_X2 + 2, TEXT_Y2+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" AZMTH:");
}
void loop() {
TS_Point p;
if (ts.bufferSize()) {
p = ts.getPoint();
} else {
// this is our way of tracking touch 'release'!
p.x = p.y = p.z = -1;
}
// Scale from ~0->4000 to tft.width using the calibration #'s
if (p.z != -1) {
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
Serial.print("("); Serial.print(p.x); Serial.print(", ");
Serial.print(p.y); Serial.print(", ");
Serial.print(p.z); Serial.println(") ");
}
switch(page_state){
case 0: // Means Keypad
// go thru all the buttons, checking if they were pressed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].contains(p.x, p.y)) {
//Serial.print("Pressing: "); Serial.println(b);
buttons[b].press(true); // tell the button it is pressed
} else {
buttons[b].press(false); // tell the button it is NOT pressed
}
}
// now we can ask the buttons if their state has changed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].justReleased()) {
// Serial.print("Released: "); Serial.println(b);
buttons[b].drawButton(); // draw normal
}
if (buttons[b].justPressed()) {
buttons[b].drawButton(true); // draw invert!
// ENT Button was clicked
if (b == 0){
lon = atof(longitude);
lat = atof(latitude);
status(F(" Searching and laser start rotating"));
Serial.println("Searching ");
Serial.print("Latitude : ");
Serial.println(String(lat));
Serial.print("longitude : ");
Serial.println(String(lon));
Serial.print("lat + lon = ");
AZMTH=lat+lon;
Serial.println(AZMTH);
// just add this part in this location
//----- AND REPLACE THE VALUE -----
tft.setCursor(TEXT_X2 + 90, TEXT_Y2+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(AZMTH);
Serial.print(AZMTH);
}
// CLR Button was clicked
else if (b == 1) {
switch(cursor_state){
case 0:
if (latitude > 0) {
latitude_i--;
latitude[latitude_i] = ' ';
}
break;
case 1:
if (longitude > 0) {
longitude_i--;
longitude[longitude_i] = ' ';
}
break;
}
}
// NEXT Button was clicked
else if (b == 2){
page_state = 1;
tft.fillScreen(BLACK);
latitude[0]=0x00;
latitude_i=0;
longitude[0]=0x00;
longitude_i=0;
cursor_state = 0;
tft.setRotation(1);
Draw_Compass_Rose();
double angle= 270; //use heading from compass
dx = (diameter * cos((angle-90)*3.14/180)) + centreX; // calculate X position
dy = (diameter * sin((angle-90)*3.14/180)) + centreY; // calculate Y position
arrow(last_dx,last_dy, centreX, centreY, 20, 20,BLACK); // Erase last arrow
arrow(dx,dy, centreX, centreY, 20, 20,CYAN); // Draw arrow in new position
last_dx = dx;
last_dy = dy;
delay(25);
tft.setRotation(0);
}
// '>' Button was clicked
else if (b == 14){
/* Toggle between latitude and longitude */
if (cursor_state == 0){
cursor_state = 1;
} else if (cursor_state == 1){
cursor_state = 0;
}
}
// if a numberpad button, append the relevant # to the textfield
else if (b >= 3) {
switch(cursor_state){
case 0:
if (latitude_i < TEXT_LEN) {
latitude[latitude_i] = buttonlabels[b][0];
latitude_i++;
latitude[latitude_i] = 0; // zero terminate
//fona.playDTMF(buttonlabels[b][0]);
}
break;
case 1:
if (longitude_i < TEXT_LEN) {
longitude[longitude_i] = buttonlabels[b][0];
longitude_i++;
longitude[longitude_i] = 0; // zero terminate
//fona.playDTMF(buttonlabels[b][0]);
}
break;
}
}
switch(cursor_state){
case 0:
// update the current latitude
tft.setCursor(TEXT_X + 90, TEXT_Y+10);//set position of text when user key in the lat angle
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(latitude);
Serial.print(latitude);
break;
// update the current longitude
case 1:
tft.setCursor(TEXT_X1 + 90, TEXT_Y1+10);//set position of text when user key in the long angle
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(longitude);
Serial.print(longitude);
break;
}
}
//
delay(50); // UI debouncing
}
}
}
void display_item(int x, int y, String token, int txt_colour, int txt_size) {
tft.setCursor(x, y);
tft.setTextColor(txt_colour);
tft.setTextSize(txt_size);
tft.print(token);
tft.setTextSize(2); // Back to default text size
}
void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour) {
float distance;
int dx, dy, x2o,y2o,x3,y3,x4,y4,k;
distance = sqrt(pow((x1 - x2),2) + pow((y1 - y2), 2));
dx = x2 + (x1 - x2) * alength / distance;
dy = y2 + (y1 - y2) * alength / distance;
k = awidth / alength;
x2o = x2 - dx;
y2o = dy - y2;
x3 = y2o * k + dx;
y3 = x2o * k + dy;
x4 = dx - y2o * k;
y4 = dy - x2o * k;
tft.drawLine(x1, y1, x2, y2, colour);
tft.drawLine(x1, y1, dx, dy, colour);
tft.drawLine(x3, y3, x4, y4, colour);
tft.drawLine(x3, y3, x2, y2, colour);
tft.drawLine(x2, y2, x4, y4, colour);
}
void Draw_Compass_Rose(){
int dxo, dyo, dxi, dyi;
tft.drawCircle(centreX,centreY,diameter,YELLOW); // Draw compass circle
for (float i = 0; i <360; i = i + 22.5) {
dxo = diameter * cos((i-90)*3.14/180);
dyo = diameter * sin((i-90)*3.14/180);
dxi = dxo * 0.9;
dyi = dyo * 0.9;
tft.drawLine(dxi+centreX,dyi+centreY,dxo+centreX,dyo+centreY,YELLOW);
}
display_item((centreX-5),(centreY-85),"N",RED,2);
display_item((centreX-5),(centreY+70),"S",RED,2);
display_item((centreX+80),(centreY-5),"E",RED,2);
display_item((centreX-85),(centreY-5),"W",RED,2);
}
Combine Code
#include <stdlib.h>
#include <SPI.h>
#include <Wire.h> // this is needed even tho we aren't using it
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Adafruit_STMPE610.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps; // create gps
void Draw_Compass_Rose();
void display_item(int x, int y, String token, int txt_colour, int txt_size);
void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour);
// For the Adafruit TFT shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000
/*** UI details */
#define BUTTON_X 40
#define BUTTON_Y 140
#define BUTTON_W 60
#define BUTTON_H 30
#define BUTTON_SPACING_X 20
#define BUTTON_SPACING_Y 10
#define BUTTON_TEXTSIZE 2
/* Back Button details */
#define BACK_BUTTON_X 40
#define BACK_BUTTON_Y 40
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// text box where numbers go,position the text box/rectangle
#define TEXT_X 10
#define TEXT_Y 10
#define TEXT_X1 10
#define TEXT_Y1 50
#define TEXT_X2 10
#define TEXT_Y2 90
#define TEXT_W 220
#define TEXT_H 30
#define TEXT_TSIZE 3
#define TEXT_TCOLOR ILI9341_MAGENTA
// the data (phone #) we store in the textfield
#define TEXT_LEN 12
char latitude[TEXT_LEN+1] = "";
char longitude[TEXT_LEN+1] = "";
uint8_t latitude_i=0;
uint8_t longitude_i=0;
char STATUS_X;
char STATUS_Y;
float lat = 0.0;
float lng = 0.0;
float AZMTH = 0.0;
float add;
const int centreX = 160;
const int centreY = 120;
const int diameter = 100;
int last_dx, last_dy, dx, dy;
// 0 -> Keypad 1 -> Compass
unsigned int page_state = 0;
// 0 -> latitude 1 -> longitude
unsigned int cursor_state = 0;
/* create 15 buttons, in classic candybar phone style */
char buttonlabels[15][5] = {"ENT", "CLR", "NEXT", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ">"};
uint16_t buttoncolors[15] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_ORANGE};
Adafruit_GFX_Button buttons[15];
char backButtonLable[1][5] = {"Back"};
uint16_t backButtonColors[1] = {ILI9341_DARKGREEN};
Adafruit_GFX_Button backButton[1];
// Print something in the mini status bar with either flashstring
void status(const __FlashStringHelper *msg) {
tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
tft.setCursor(STATUS_X, STATUS_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);//font size on top of white box
tft.print(msg);
}
// or charstring
void status(char *msg) {
tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
tft.setCursor(STATUS_X, STATUS_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);//font size on top of white box
tft.print(msg);
}
void setup() {
Serial.begin(57600); // connect serial
Serial.println("The GPS Received Signal:");
Serial1.begin(9600); // connect gps sensor
// clear the screen
tft.begin();
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_MAGENTA);
tft.print(" WELCOME TO AZIMUTH SYSTEM");
// eep touchscreen not found?
if (!ts.begin()) {
Serial.println("Couldn't start touchscreen controller");
while (1);
}
Serial.println("Touchscreen started");
// create buttons
for (uint8_t row=0; row<5; row++) {
for (uint8_t col=0; col<3; col++) {
buttons[col + row*3].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X),
BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text
BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col+row*3], ILI9341_WHITE,
buttonlabels[col + row*3], BUTTON_TEXTSIZE);
buttons[col + row*3].drawButton();
}
}
// create 'text field'
tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.drawRect(TEXT_X1, TEXT_Y1, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.drawRect(TEXT_X2, TEXT_Y2, TEXT_W, TEXT_H, ILI9341_WHITE);
tft.setCursor(TEXT_X+2, TEXT_Y+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" LAT:");
tft.setCursor(TEXT_X1 + 2, TEXT_Y1+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" LONG:");
tft.setCursor(TEXT_X2 + 2, TEXT_Y2+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(" AZMTH:");
}
void loop() {
TS_Point p;
while(Serial1.available()){ // check for gps data
if(gps.encode(Serial1.read()))// encode gps data
Serial.print("Position: ");
}
if (ts.bufferSize()) {
p = ts.getPoint();
} else {
// this is our way of tracking touch 'release'!
p.x = p.y = p.z = -1;
}
// Scale from ~0->4000 to tft.width using the calibration #'s
if (p.z != -1) {
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
Serial.print("("); Serial.print(p.x); Serial.print(", ");
Serial.print(p.y); Serial.print(", ");
Serial.print(p.z); Serial.println(") ");
}
switch(page_state){
case 0: // Means Keypad
// go thru all the buttons, checking if they were pressed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].contains(p.x, p.y)) {
//Serial.print("Pressing: "); Serial.println(b);
buttons[b].press(true); // tell the button it is pressed
} else {
buttons[b].press(false); // tell the button it is NOT pressed
}
}
// now we can ask the buttons if their state has changed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].justReleased()) {
// Serial.print("Released: "); Serial.println(b);
buttons[b].drawButton(); // draw normal
}
if (buttons[b].justPressed()) {
buttons[b].drawButton(true); // draw invert!
// ENT Button was clicked
if (b == 0){
lng = atof(longitude);
lat = atof(latitude);
status(F(" Searching and laser start rotating"));
Serial.println("Searching ");
Serial.print("Latitude : ");
Serial.println(String(lat));
Serial.print("longitude : ");
Serial.println(String(lng));
Serial.print("lat + lng = ");
AZMTH=lat+lng;
Serial.println(AZMTH);
// just add this part in this location
//----- AND REPLACE THE VALUE -----
tft.setCursor(TEXT_X2 + 90, TEXT_Y2+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
tft.print(AZMTH);
Serial.print(AZMTH);
}
// CLR Button was clicked
else if (b == 1) {
switch(cursor_state){
case 0:
if (latitude > 0) {
latitude_i--;
latitude[latitude_i] = ' ';
}
break;
case 1:
if (longitude > 0) {
longitude_i--;
longitude[longitude_i] = ' ';
}
break;
}
}
// NEXT Button was clicked
else if (b == 2){
page_state = 1;
tft.fillScreen(BLACK);
latitude[0]=0x00;
latitude_i=0;
longitude[0]=0x00;
longitude_i=0;
cursor_state = 0;
tft.setRotation(1);
Draw_Compass_Rose();
double angle= 270; //use heading from compass
dx = (diameter * cos((angle-90)*3.14/180)) + centreX; // calculate X position
dy = (diameter * sin((angle-90)*3.14/180)) + centreY; // calculate Y position
arrow(last_dx,last_dy, centreX, centreY, 20, 20,BLACK); // Erase last arrow
arrow(dx,dy, centreX, centreY, 20, 20,CYAN); // Draw arrow in new position
last_dx = dx;
last_dy = dy;
delay(25);
tft.setRotation(0);
}
// '>' Button was clicked
else if (b == 14){
/* Toggle between latitude and longitude */
if (cursor_state == 0){
cursor_state = 1;
} else if (cursor_state == 1){
cursor_state = 0;
}
}
// if a numberpad button, append the relevant # to the textfield
else if (b >= 3) {
switch(cursor_state){
case 0:
if (latitude_i < TEXT_LEN) {
latitude[latitude_i] = buttonlabels[b][0];
latitude_i++;
latitude[latitude_i] = 0; // zero terminate
//fona.playDTMF(buttonlabels[b][0]);
}
break;
case 1:
if (longitude_i < TEXT_LEN) {
longitude[longitude_i] = buttonlabels[b][0];
longitude_i++;
longitude[longitude_i] = 0; // zero terminate
//fona.playDTMF(buttonlabels[b][0]);
}
break;
}
}
switch(cursor_state){
case 0:
// update the current latitude
tft.setCursor(TEXT_X + 90, TEXT_Y+10);//set position of text when user key in the lat angle
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
Serial.print(latitude);
if (gps.f_get_position(&lat,&lng))
{
tft.print(String(gps.f_get_position(&lat));
double lat=gps.f_get_position(&lat,&lng));
Serial.print(lat, 6);
}
break;
// update the current longitude
case 1:
tft.setCursor(TEXT_X1 + 90, TEXT_Y1+10);//set position of text when user key in the long angle
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(2);//font size inside white box
Serial.print(longitude);
if (gps.f_get_position(&lat,&lng))
{
tft.print(String(gps.f_get_position(&lng));
double lng=gps.f_get_position(&lat,&lng));
Serial.print(lng, 6);
}
break;
}
}
//
delay(50); // UI debouncing
}
}
}
void display_item(int x, int y, String token, int txt_colour, int txt_size) {
tft.setCursor(x, y);
tft.setTextColor(txt_colour);
tft.setTextSize(txt_size);
tft.print(token);
tft.setTextSize(2); // Back to default text size
}
void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour) {
float distance;
int dx, dy, x2o,y2o,x3,y3,x4,y4,k;
distance = sqrt(pow((x1 - x2),2) + pow((y1 - y2), 2));
dx = x2 + (x1 - x2) * alength / distance;
dy = y2 + (y1 - y2) * alength / distance;
k = awidth / alength;
x2o = x2 - dx;
y2o = dy - y2;
x3 = y2o * k + dx;
y3 = x2o * k + dy;
x4 = dx - y2o * k;
y4 = dy - x2o * k;
tft.drawLine(x1, y1, x2, y2, colour);
tft.drawLine(x1, y1, dx, dy, colour);
tft.drawLine(x3, y3, x4, y4, colour);
tft.drawLine(x3, y3, x2, y2, colour);
tft.drawLine(x2, y2, x4, y4, colour);
}
void Draw_Compass_Rose(){
int dxo, dyo, dxi, dyi;
tft.drawCircle(centreX,centreY,diameter,YELLOW); // Draw compass circle
for (float i = 0; i <360; i = i + 22.5) {
dxo = diameter * cos((i-90)*3.14/180);
dyo = diameter * sin((i-90)*3.14/180);
dxi = dxo * 0.9;
dyi = dyo * 0.9;
tft.drawLine(dxi+centreX,dyi+centreY,dxo+centreX,dyo+centreY,YELLOW);
}
display_item((centreX-5),(centreY-85),"N",RED,2);
display_item((centreX-5),(centreY+70),"S",RED,2);
display_item((centreX+80),(centreY-5),"E",RED,2);
display_item((centreX-85),(centreY-5),"W",RED,2);
}
Attached is the image of error line, GUI on TFT with lat. and long. field, TFT, and log errors. Errror line
gps.f_get_position(...)
, which is avoid
, inside anif
statement, which expects something it can evaluate to abool
(i.e. a "true" or "false") to base its decision on.