This is a fork of a functional ILI9341 display with a functional Seeed touch screen library.

Dependencies:   BMP180 UniGraphic mbed BNO055_fusionI_fixed HTU21D GPSISR Compass Fonts uGUI

Fork of TFT_test_NUCLEO-F411RE by Motoo Tanaka

/media/uploads/trevieze/win_20170427_21_31_20_pro.jpg

Had to move sensors to a remote board because of interference. Added spi burst mode to supported displays.

To do.... ugui buttons are slow. will need to add rtos to project. Finish other way points screen. Will have to rewrite portions of the touch screen class. Sense touch, delay, read values and then average, touch released, is the sequence. Add cadence input and logic to program for computer screen.

Committer:
trevieze
Date:
Tue Feb 28 01:32:00 2017 +0000
Revision:
11:49600de70963
Parent:
10:869a102dd31c
Child:
12:1a9c0f9d7128
Compass graphics are working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:cd5e3d371b54 1 /* mbed main.cpp to test adafruit 2.8" TFT LCD shiled w Touchscreen
Rhyme 0:cd5e3d371b54 2 * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
Rhyme 0:cd5e3d371b54 3 *
Rhyme 0:cd5e3d371b54 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Rhyme 0:cd5e3d371b54 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Rhyme 0:cd5e3d371b54 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Rhyme 0:cd5e3d371b54 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Rhyme 0:cd5e3d371b54 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Rhyme 0:cd5e3d371b54 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Rhyme 0:cd5e3d371b54 10 * THE SOFTWARE.
Rhyme 0:cd5e3d371b54 11 */
Rhyme 0:cd5e3d371b54 12
Rhyme 0:cd5e3d371b54 13 /*
Rhyme 0:cd5e3d371b54 14 * Note: This program is derived from the SeeeStudioTFTv2 program.
Rhyme 0:cd5e3d371b54 15 * Although both program share same ILI9341 TFT driver,
Rhyme 0:cd5e3d371b54 16 * the touch sensor was not same with the Display I purchased from Akizuki.
Rhyme 0:cd5e3d371b54 17 * http://akizukidenshi.com/catalog/g/gM-07747/
Rhyme 0:cd5e3d371b54 18 * The touch sensor on the display is STMPE610,
Rhyme 0:cd5e3d371b54 19 * so I hacked the minimum spi driver for it (polling mode only).
Rhyme 0:cd5e3d371b54 20 */
Rhyme 0:cd5e3d371b54 21
Rhyme 0:cd5e3d371b54 22 #include "mbed.h"
Rhyme 0:cd5e3d371b54 23 #include <math.h>
Rhyme 0:cd5e3d371b54 24 #include "ILI9341.h"
trevieze 2:c5085faf2aa5 25 #include "SeeedStudioTFTv2.h"
trevieze 5:6eb4b9322931 26 #include "BNO055.h"
trevieze 5:6eb4b9322931 27 #include "HTU21D.h"
trevieze 5:6eb4b9322931 28 #include "BMP180.h"
trevieze 7:8aa9cdab4a07 29 #include "SDFileSystem.h"
trevieze 7:8aa9cdab4a07 30 #include "GPSISR.h"
trevieze 8:855884782f67 31
trevieze 5:6eb4b9322931 32
trevieze 10:869a102dd31c 33 #include "ArialR16x17.h"
trevieze 10:869a102dd31c 34 #include "Arial24x23i.h"
trevieze 10:869a102dd31c 35 #include "Arial28x28.h"
trevieze 10:869a102dd31c 36 #include "Neu44x36.h"
trevieze 10:869a102dd31c 37 #include "SCProSB31x55.h"
Rhyme 0:cd5e3d371b54 38 #include "Arial12x12.h"
trevieze 10:869a102dd31c 39 #include "ArialR20x20.h"
Rhyme 0:cd5e3d371b54 40
trevieze 7:8aa9cdab4a07 41 //#define PIN_CS_TSC PA_9
trevieze 7:8aa9cdab4a07 42 //#define PIN_TSC_INTR PA_8
Rhyme 0:cd5e3d371b54 43 #define PIN_RESET_TFT PC_13 /* place holder */
trevieze 7:8aa9cdab4a07 44 //ILI9341 SPI PINS
trevieze 1:e265e7245ab8 45 #define PIN_XP A3
trevieze 1:e265e7245ab8 46 #define PIN_XM A1
trevieze 1:e265e7245ab8 47 #define PIN_YP A2
trevieze 1:e265e7245ab8 48 #define PIN_YM A0
trevieze 7:8aa9cdab4a07 49 #define PIN_MOSI_SPI1 D11 //SPI 1 MOSI
trevieze 7:8aa9cdab4a07 50 #define PIN_MISO_SPI1 D12 //SPI 1 MISO
trevieze 7:8aa9cdab4a07 51 #define PIN_SCLK_SPI1 D13 //SPI 1 SLCK
trevieze 7:8aa9cdab4a07 52 #define PIN_CS_SPI1 D5 // SPI CS D10 Was D5
trevieze 1:e265e7245ab8 53 #define PIN_DC_TFT D6
trevieze 1:e265e7245ab8 54 #define PIN_CS_SD D4
trevieze 5:6eb4b9322931 55 #define PIN_RESET D7
trevieze 7:8aa9cdab4a07 56 // SD Card on GPS shield PINS
trevieze 7:8aa9cdab4a07 57 #define PIN_MOSI_SPI3 PB_15 //SPI 1 MOSI
trevieze 7:8aa9cdab4a07 58 #define PIN_MISO_SPI3 PB_14 //SPI 1 MISO
trevieze 7:8aa9cdab4a07 59 #define PIN_SCLK_SPI3 PB_13 //SPI 1 SLCK
trevieze 7:8aa9cdab4a07 60 #define PIN_CS_SPI3 D2 // SPI CS
trevieze 7:8aa9cdab4a07 61 #define PIN_RX_GPS PA_12 //GPS Shield RX pin
trevieze 7:8aa9cdab4a07 62 #define PIN_TX_GPS PA_11 //GPS Shield TX pin
trevieze 7:8aa9cdab4a07 63
trevieze 10:869a102dd31c 64 #define PI 3.14159265358979f
trevieze 10:869a102dd31c 65
trevieze 5:6eb4b9322931 66
trevieze 5:6eb4b9322931 67 BNO055_ID_INF_TypeDef bno055_id_inf;
trevieze 5:6eb4b9322931 68 BNO055_EULER_TypeDef euler_angles;
trevieze 5:6eb4b9322931 69 BNO055_QUATERNION_TypeDef quaternion;
trevieze 5:6eb4b9322931 70 BNO055_LIN_ACC_TypeDef linear_acc;
trevieze 5:6eb4b9322931 71 BNO055_GRAVITY_TypeDef gravity;
trevieze 5:6eb4b9322931 72 BNO055_TEMPERATURE_TypeDef chip_temp;
trevieze 1:e265e7245ab8 73
Rhyme 0:cd5e3d371b54 74 #define DEVICE_NAME "F411RE"
Rhyme 0:cd5e3d371b54 75
Rhyme 0:cd5e3d371b54 76 #ifndef TARGET_NECLEO_F411RE
Rhyme 0:cd5e3d371b54 77 #define TARGET_NECLEO_F411RE
Rhyme 0:cd5e3d371b54 78 #endif
Rhyme 0:cd5e3d371b54 79
trevieze 6:b78ff34209e5 80 //DigitalOut backlight(PB_3) ;
trevieze 5:6eb4b9322931 81 // DigitalOut tsc_cs(PA_9, 1) ;
trevieze 5:6eb4b9322931 82 // DigitalOut tft_cs(PB_6, 1) ;
Rhyme 0:cd5e3d371b54 83
trevieze 7:8aa9cdab4a07 84 Serial pc(USBTX, USBRX);
trevieze 7:8aa9cdab4a07 85
trevieze 5:6eb4b9322931 86 // Display
Rhyme 0:cd5e3d371b54 87 ILI9341 TFT(SPI_8, 10000000,
trevieze 7:8aa9cdab4a07 88 PIN_MOSI_SPI1, PIN_MISO_SPI1, PIN_SCLK_SPI1,
trevieze 7:8aa9cdab4a07 89 PIN_CS_SPI1, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
trevieze 5:6eb4b9322931 90
trevieze 5:6eb4b9322931 91 // TouchScreen
trevieze 2:c5085faf2aa5 92 TouchScreen TSC(PIN_XP, PIN_XM, PIN_YP, PIN_YM);
Rhyme 0:cd5e3d371b54 93
trevieze 5:6eb4b9322931 94 // 3 Axis IMU
trevieze 6:b78ff34209e5 95 BNO055 imu(I2C_SDA, I2C_SCL, PIN_RESET); // Reset =D7, addr = BNO055_G_CHIP_ADDR, mode = MODE_NDOF <- as default
trevieze 5:6eb4b9322931 96
trevieze 5:6eb4b9322931 97 // Humidity and Temperature
trevieze 10:869a102dd31c 98 HTU21D humid(I2C_SDA, I2C_SCL);
trevieze 5:6eb4b9322931 99
trevieze 5:6eb4b9322931 100 // Pressure
trevieze 6:b78ff34209e5 101 BMP180 bmp180(I2C_SDA, I2C_SCL);
trevieze 5:6eb4b9322931 102
trevieze 7:8aa9cdab4a07 103 // SD Card Reader On Adafruit GPS Shield
trevieze 7:8aa9cdab4a07 104 SDFileSystem sd(PIN_MOSI_SPI3, PIN_MISO_SPI3, PIN_SCLK_SPI3, PIN_CS_SPI3, "sd"); // the pinout on the mbed Cool Components workshop board
trevieze 7:8aa9cdab4a07 105
trevieze 8:855884782f67 106 // Set up serial interrupe service handler for gps characters.
trevieze 7:8aa9cdab4a07 107 GPS MyGPS(PIN_TX_GPS,PIN_RX_GPS, 9600);
trevieze 8:855884782f67 108
trevieze 10:869a102dd31c 109 void Draw_Compass_Rose(void);
trevieze 10:869a102dd31c 110 void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour);
Rhyme 0:cd5e3d371b54 111
trevieze 10:869a102dd31c 112 const int centreX = 120;
trevieze 10:869a102dd31c 113 const int centreY = 150;
trevieze 10:869a102dd31c 114 const int radius = 40;
trevieze 11:49600de70963 115 float last_dx;
trevieze 11:49600de70963 116 float last_dy;
Rhyme 0:cd5e3d371b54 117
Rhyme 0:cd5e3d371b54 118 int main()
Rhyme 0:cd5e3d371b54 119 {
trevieze 9:a3cb458d7b1c 120 TFT.BusEnable(true) ;
trevieze 9:a3cb458d7b1c 121 TFT.FastWindow(true) ;
trevieze 9:a3cb458d7b1c 122 wait(0.1);
trevieze 9:a3cb458d7b1c 123 TFT.cls();
trevieze 9:a3cb458d7b1c 124 wait(0.1);
trevieze 7:8aa9cdab4a07 125 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
trevieze 9:a3cb458d7b1c 126 const int refresh_Time = 2000; //refresh time in ms
trevieze 7:8aa9cdab4a07 127 refresh_Timer.start(); //starts the clock on the timer
trevieze 7:8aa9cdab4a07 128 //backlight = 0 ;
trevieze 10:869a102dd31c 129 TFT.set_font((unsigned char*) Arial24x23i);
trevieze 9:a3cb458d7b1c 130 TFT.fillrect(2, 2, 237, 317, White);
trevieze 9:a3cb458d7b1c 131 TFT.foreground(Blue);
trevieze 9:a3cb458d7b1c 132 TFT.background(White);
trevieze 9:a3cb458d7b1c 133 wait(0.1);
trevieze 9:a3cb458d7b1c 134
trevieze 10:869a102dd31c 135 Draw_Compass_Rose();
trevieze 10:869a102dd31c 136
trevieze 7:8aa9cdab4a07 137 while (1) {
trevieze 10:869a102dd31c 138
trevieze 11:49600de70963 139 TFT.set_font((unsigned char*) ArialR20x20);
trevieze 11:49600de70963 140 //check if we recieved a new message from GPS, if so, attempt to parse it,
trevieze 7:8aa9cdab4a07 141 if (refresh_Timer.read_ms() >= refresh_Time) {
trevieze 7:8aa9cdab4a07 142 refresh_Timer.reset();
trevieze 9:a3cb458d7b1c 143
trevieze 10:869a102dd31c 144 if (bmp180.init() != 0) {
trevieze 10:869a102dd31c 145 //pc.printf("Error communicating with BMP180\n");
trevieze 10:869a102dd31c 146 } else {
trevieze 10:869a102dd31c 147 //pc.printf("Initialized BMP180\n");
trevieze 10:869a102dd31c 148 bmp180.startTemperature();
trevieze 10:869a102dd31c 149 wait(0.1); // Wait for conversion to complete
trevieze 10:869a102dd31c 150 float temp;
trevieze 10:869a102dd31c 151 if(bmp180.getTemperature(&temp) != 0) {
trevieze 10:869a102dd31c 152 //pc.printf("Error getting temperature\n");
trevieze 10:869a102dd31c 153 }
trevieze 10:869a102dd31c 154 //pc.printf("Temperature is : %f", temp);
trevieze 10:869a102dd31c 155 TFT.locate(4, 26) ;
trevieze 10:869a102dd31c 156 TFT.printf("%.1fF", ((temp* 9.0) / 5.0 + 32));
trevieze 10:869a102dd31c 157 }
trevieze 10:869a102dd31c 158 int ftemp = humid.sample_ftemp();
trevieze 10:869a102dd31c 159 int humidity = humid.sample_humid();
trevieze 10:869a102dd31c 160 TFT.locate(140, 26) ;
trevieze 10:869a102dd31c 161 TFT.printf("%d%%RH",humidity);
trevieze 10:869a102dd31c 162 //pc.printf("HTU21D Temp: %d",ftemp);
trevieze 10:869a102dd31c 163 //pc.printf("HTU21D Humidity: %d",humidity);
trevieze 11:49600de70963 164
trevieze 10:869a102dd31c 165 if (imu.chip_ready() == 0){
trevieze 10:869a102dd31c 166 pc.printf("Bosch BNO055 is NOT avirable!!\r\n");
trevieze 10:869a102dd31c 167 } else {
trevieze 10:869a102dd31c 168 printf("Cal %d", imu.read_calib_status());
trevieze 10:869a102dd31c 169 if (imu.read_calib_status() > 0x0){
trevieze 10:869a102dd31c 170 TFT.foreground(White);
trevieze 10:869a102dd31c 171 TFT.locate(4, 260) ;
trevieze 10:869a102dd31c 172 TFT.printf("No Data");
trevieze 10:869a102dd31c 173 TFT.foreground(Blue);
trevieze 10:869a102dd31c 174 imu.get_Euler_Angles(&euler_angles);
trevieze 10:869a102dd31c 175 imu.get_quaternion(&quaternion);
trevieze 10:869a102dd31c 176 TFT.locate(4, 260) ;
trevieze 10:869a102dd31c 177 TFT.printf("%.1f",euler_angles.h);
trevieze 10:869a102dd31c 178 //pc.printf("H %.1f",euler_angles.h);
trevieze 10:869a102dd31c 179 //pc.printf("R %.1f",euler_angles.r);
trevieze 10:869a102dd31c 180 //pc.printf("P %.1f",euler_angles.p);
trevieze 10:869a102dd31c 181
trevieze 10:869a102dd31c 182 } else {
trevieze 10:869a102dd31c 183 TFT.locate(4, 260) ;
trevieze 10:869a102dd31c 184 TFT.printf("No Data");
trevieze 10:869a102dd31c 185 }
trevieze 10:869a102dd31c 186 }
trevieze 11:49600de70963 187
trevieze 11:49600de70963 188 float angle = int(euler_angles.h); // * 180/PI); // Convert radians to degrees for more a more usual result
trevieze 10:869a102dd31c 189 // For the screen -X = up and +X = down and -Y = left and +Y = right, so does not follow coordinate conventions
trevieze 10:869a102dd31c 190 float dx = (0.7*radius * cos((angle-90)*PI/180)) + centreX; // calculate X position for the screen coordinates - can be confusing!
trevieze 10:869a102dd31c 191 float dy = (0.7*radius * sin((angle-90)*PI/180)) + centreY; // calculate Y position for the screen coordinates - can be confusing!
trevieze 10:869a102dd31c 192 arrow(last_dx,last_dy, centreX, centreY, 2,2,White); // Erase last arrow
trevieze 10:869a102dd31c 193 arrow(dx,dy, centreX, centreY, 2, 2,Blue); // Draw arrow in new position
trevieze 10:869a102dd31c 194 last_dx = dx;
trevieze 10:869a102dd31c 195 last_dy = dy;
trevieze 10:869a102dd31c 196
trevieze 9:a3cb458d7b1c 197 if (MyGPS.dataready()) {
trevieze 9:a3cb458d7b1c 198 MyGPS.read();
trevieze 10:869a102dd31c 199 //pc.printf("NMEA has valid data");
trevieze 10:869a102dd31c 200 //pc.printf("Sats : %d \n", MyGPS.buffer.satellites);
trevieze 10:869a102dd31c 201 //pc.printf("%d-%d-%d\n", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
trevieze 10:869a102dd31c 202 //pc.printf("%d:%d:%d\n", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
trevieze 9:a3cb458d7b1c 203
trevieze 10:869a102dd31c 204 TFT.foreground(White);
trevieze 10:869a102dd31c 205 TFT.locate(4, 2) ;
trevieze 10:869a102dd31c 206 TFT.printf("No Data");
trevieze 10:869a102dd31c 207 TFT.foreground(Blue);
trevieze 10:869a102dd31c 208 TFT.locate(4, 2) ;
trevieze 9:a3cb458d7b1c 209 TFT.printf("%d-%d-%d", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
trevieze 10:869a102dd31c 210 TFT.locate(140, 2) ;
trevieze 9:a3cb458d7b1c 211 TFT.printf("%d:%d:%d", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
trevieze 10:869a102dd31c 212 TFT.locate(140, 260) ;
trevieze 10:869a102dd31c 213 TFT.printf("%.1fft", MyGPS.buffer.altitude/0.3048);
trevieze 10:869a102dd31c 214 TFT.locate(4, 280) ;
trevieze 10:869a102dd31c 215 int degree;
trevieze 10:869a102dd31c 216 int minutes;
trevieze 10:869a102dd31c 217 int seconds;
trevieze 10:869a102dd31c 218 degree = (int)MyGPS.buffer.longitude;
trevieze 10:869a102dd31c 219 minutes = (int) ( (MyGPS.buffer.longitude - (double)degree) * 60.0);
trevieze 10:869a102dd31c 220 seconds = (int) ( (MyGPS.buffer.longitude - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
trevieze 10:869a102dd31c 221 TFT.printf("%d %d' %d\"lon", degree, minutes,seconds);
trevieze 10:869a102dd31c 222 TFT.locate(4, 300) ;
trevieze 10:869a102dd31c 223 degree = (int)MyGPS.buffer.latitude;
trevieze 10:869a102dd31c 224 minutes = (int) ( (MyGPS.buffer.latitude - (double)degree) * 60.0);
trevieze 10:869a102dd31c 225 seconds = (int) ( (MyGPS.buffer.latitude - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 );
trevieze 10:869a102dd31c 226 TFT.printf("%d %d' %d\"lat", degree, minutes,seconds);
trevieze 10:869a102dd31c 227 TFT.set_font((unsigned char*) SCProSB31x55);
trevieze 10:869a102dd31c 228 TFT.locate(120, 200) ;
trevieze 10:869a102dd31c 229 TFT.printf("%.1f", MyGPS.buffer.speed);
trevieze 9:a3cb458d7b1c 230
trevieze 8:855884782f67 231 }
trevieze 8:855884782f67 232 else {
trevieze 10:869a102dd31c 233 TFT.locate(4, 2) ;
trevieze 10:869a102dd31c 234 TFT.printf("No Data");
trevieze 10:869a102dd31c 235 //pc.printf("NMEA has no valid data");
trevieze 8:855884782f67 236 }
trevieze 7:8aa9cdab4a07 237 }
trevieze 7:8aa9cdab4a07 238 }
trevieze 10:869a102dd31c 239 }
trevieze 10:869a102dd31c 240
trevieze 10:869a102dd31c 241 void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour) {
trevieze 10:869a102dd31c 242 float distance;
trevieze 10:869a102dd31c 243 int dx, dy, x2o,y2o,x3,y3,x4,y4,k;
trevieze 10:869a102dd31c 244 distance = sqrt(pow((double)(x1 - x2),2) + pow((double)(y1 - y2), 2));
trevieze 10:869a102dd31c 245 dx = x2 + (x1 - x2) * alength / distance;
trevieze 10:869a102dd31c 246 dy = y2 + (y1 - y2) * alength / distance;
trevieze 10:869a102dd31c 247 k = awidth / alength;
trevieze 10:869a102dd31c 248 x2o = x2 - dx;
trevieze 10:869a102dd31c 249 y2o = dy - y2;
trevieze 10:869a102dd31c 250 x3 = y2o * k + dx;
trevieze 10:869a102dd31c 251 y3 = x2o * k + dy;
trevieze 10:869a102dd31c 252 x4 = dx - y2o * k;
trevieze 10:869a102dd31c 253 y4 = dy - x2o * k;
trevieze 10:869a102dd31c 254 TFT.line(x1, y1, x2, y2, colour);
trevieze 10:869a102dd31c 255 TFT.line(x1, y1, dx, dy, colour);
trevieze 10:869a102dd31c 256 TFT.line(x3, y3, x4, y4, colour);
trevieze 10:869a102dd31c 257 TFT.line(x3, y3, x2, y2, colour);
trevieze 10:869a102dd31c 258 TFT.line(x2, y2, x4, y4, colour);
trevieze 11:49600de70963 259 TFT.set_font((unsigned char*) Arial12x12);
trevieze 11:49600de70963 260 TFT.foreground(Blue);
trevieze 11:49600de70963 261 TFT.background(White);
trevieze 11:49600de70963 262 TFT.locate((centreX-2),(centreY-24));
trevieze 11:49600de70963 263 TFT.printf("N");
trevieze 11:49600de70963 264 TFT.locate((centreX-2),(centreY+17));
trevieze 11:49600de70963 265 TFT.printf("S");
trevieze 11:49600de70963 266 TFT.locate((centreX+19),(centreY-3));
trevieze 11:49600de70963 267 TFT.printf("E");
trevieze 11:49600de70963 268 TFT.locate((centreX-23),(centreY-3));
trevieze 11:49600de70963 269 TFT.printf("W");
trevieze 11:49600de70963 270 TFT.set_font((unsigned char*) ArialR20x20);
trevieze 10:869a102dd31c 271 }
Rhyme 0:cd5e3d371b54 272
trevieze 10:869a102dd31c 273 void Draw_Compass_Rose(void) {
trevieze 10:869a102dd31c 274 int dxo, dyo, dxi, dyi;
trevieze 10:869a102dd31c 275 TFT.circle(centreX,centreY,radius,Blue); // Draw compass circle
trevieze 10:869a102dd31c 276 for (float i = 0; i <360; i = i + 22.5) {
trevieze 10:869a102dd31c 277 dxo = radius * cos(i*3.14/180);
trevieze 10:869a102dd31c 278 dyo = radius * sin(i*3.14/180);
trevieze 10:869a102dd31c 279 dxi = dxo * 0.95;
trevieze 10:869a102dd31c 280 dyi = dyo * 0.95;
trevieze 10:869a102dd31c 281 TFT.line(dxi+centreX,dyi+centreY,dxo+centreX,dyo+centreY,Blue);
trevieze 10:869a102dd31c 282 }
trevieze 10:869a102dd31c 283 TFT.set_font((unsigned char*) Arial12x12);
trevieze 10:869a102dd31c 284 TFT.foreground(Blue);
trevieze 10:869a102dd31c 285 TFT.background(White);
trevieze 10:869a102dd31c 286 TFT.locate((centreX-2),(centreY-24));
trevieze 10:869a102dd31c 287 TFT.printf("N");
trevieze 10:869a102dd31c 288 TFT.locate((centreX-2),(centreY+17));
trevieze 10:869a102dd31c 289 TFT.printf("S");
trevieze 10:869a102dd31c 290 TFT.locate((centreX+19),(centreY-3));
trevieze 10:869a102dd31c 291 TFT.printf("E");
trevieze 10:869a102dd31c 292 TFT.locate((centreX-23),(centreY-3));
trevieze 10:869a102dd31c 293 TFT.printf("W");
trevieze 9:a3cb458d7b1c 294 }