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:
Fri Jan 20 20:46:41 2017 +0000
Revision:
6:b78ff34209e5
Parent:
5:6eb4b9322931
Child:
7:8aa9cdab4a07
BMP180 Functional

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 5:6eb4b9322931 29
Rhyme 0:cd5e3d371b54 30 #include "Arial12x12.h"
Rhyme 0:cd5e3d371b54 31 #include "Arial24x23.h"
Rhyme 0:cd5e3d371b54 32 #include "Arial28x28.h"
Rhyme 0:cd5e3d371b54 33 #include "Arial43x48_numb.h"
Rhyme 0:cd5e3d371b54 34
Rhyme 0:cd5e3d371b54 35 #define PIN_CS_TSC PA_9
Rhyme 0:cd5e3d371b54 36 #define PIN_TSC_INTR PA_8
Rhyme 0:cd5e3d371b54 37 #define PIN_RESET_TFT PC_13 /* place holder */
trevieze 1:e265e7245ab8 38
trevieze 1:e265e7245ab8 39 #define PIN_XP A3
trevieze 1:e265e7245ab8 40 #define PIN_XM A1
trevieze 1:e265e7245ab8 41 #define PIN_YP A2
trevieze 1:e265e7245ab8 42 #define PIN_YM A0
trevieze 1:e265e7245ab8 43 #define PIN_MOSI D11
trevieze 1:e265e7245ab8 44 #define PIN_MISO D12
trevieze 1:e265e7245ab8 45 #define PIN_SCLK D13
trevieze 1:e265e7245ab8 46 #define PIN_CS_TFT D5
trevieze 1:e265e7245ab8 47 #define PIN_DC_TFT D6
trevieze 1:e265e7245ab8 48 #define PIN_CS_SD D4
trevieze 5:6eb4b9322931 49 #define PIN_RESET D7
trevieze 5:6eb4b9322931 50
trevieze 5:6eb4b9322931 51 BNO055_ID_INF_TypeDef bno055_id_inf;
trevieze 5:6eb4b9322931 52 BNO055_EULER_TypeDef euler_angles;
trevieze 5:6eb4b9322931 53 BNO055_QUATERNION_TypeDef quaternion;
trevieze 5:6eb4b9322931 54 BNO055_LIN_ACC_TypeDef linear_acc;
trevieze 5:6eb4b9322931 55 BNO055_GRAVITY_TypeDef gravity;
trevieze 5:6eb4b9322931 56 BNO055_TEMPERATURE_TypeDef chip_temp;
trevieze 1:e265e7245ab8 57
Rhyme 0:cd5e3d371b54 58 #define DEVICE_NAME "F411RE"
Rhyme 0:cd5e3d371b54 59
Rhyme 0:cd5e3d371b54 60 #ifndef TARGET_NECLEO_F411RE
Rhyme 0:cd5e3d371b54 61 #define TARGET_NECLEO_F411RE
Rhyme 0:cd5e3d371b54 62 #endif
Rhyme 0:cd5e3d371b54 63
trevieze 6:b78ff34209e5 64
trevieze 6:b78ff34209e5 65 //DigitalOut backlight(PB_3) ;
trevieze 5:6eb4b9322931 66 // DigitalOut tsc_cs(PA_9, 1) ;
trevieze 5:6eb4b9322931 67 // DigitalOut tft_cs(PB_6, 1) ;
Rhyme 0:cd5e3d371b54 68
trevieze 5:6eb4b9322931 69 // Display
Rhyme 0:cd5e3d371b54 70 ILI9341 TFT(SPI_8, 10000000,
Rhyme 0:cd5e3d371b54 71 PIN_MOSI, PIN_MISO, PIN_SCLK,
trevieze 6:b78ff34209e5 72 PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8");
trevieze 5:6eb4b9322931 73
trevieze 5:6eb4b9322931 74 // TouchScreen
trevieze 2:c5085faf2aa5 75 TouchScreen TSC(PIN_XP, PIN_XM, PIN_YP, PIN_YM);
Rhyme 0:cd5e3d371b54 76
trevieze 5:6eb4b9322931 77 // 3 Axis IMU
trevieze 6:b78ff34209e5 78 BNO055 imu(I2C_SDA, I2C_SCL, PIN_RESET); // Reset =D7, addr = BNO055_G_CHIP_ADDR, mode = MODE_NDOF <- as default
trevieze 5:6eb4b9322931 79
trevieze 5:6eb4b9322931 80 // Humidity and Temperature
trevieze 5:6eb4b9322931 81 HTU21D temphumid(I2C_SDA, I2C_SCL);
trevieze 5:6eb4b9322931 82
trevieze 5:6eb4b9322931 83 // Pressure
trevieze 6:b78ff34209e5 84 BMP180 bmp180(I2C_SDA, I2C_SCL);
trevieze 5:6eb4b9322931 85
Rhyme 0:cd5e3d371b54 86 int page = 0 ;
Rhyme 0:cd5e3d371b54 87 int numPage = 2 ;
Rhyme 0:cd5e3d371b54 88
Rhyme 0:cd5e3d371b54 89 void initTFT(void)
Rhyme 0:cd5e3d371b54 90 {
Rhyme 0:cd5e3d371b54 91 //Configure the display driver
Rhyme 0:cd5e3d371b54 92 TFT.BusEnable(true) ;
Rhyme 0:cd5e3d371b54 93 TFT.FastWindow(true) ;
Rhyme 0:cd5e3d371b54 94 TFT.background(Black);
Rhyme 0:cd5e3d371b54 95 TFT.foreground(White);
Rhyme 0:cd5e3d371b54 96 wait(0.01) ;
Rhyme 0:cd5e3d371b54 97 TFT.cls();
Rhyme 0:cd5e3d371b54 98 TFT.BusEnable(false) ;
Rhyme 0:cd5e3d371b54 99 }
Rhyme 0:cd5e3d371b54 100
Rhyme 0:cd5e3d371b54 101 void screen1(void) // Welcome Screen
Rhyme 0:cd5e3d371b54 102 {
Rhyme 0:cd5e3d371b54 103 TFT.BusEnable(true) ;
trevieze 6:b78ff34209e5 104 //backlight = 0 ;
Rhyme 0:cd5e3d371b54 105 TFT.background(White) ;
Rhyme 0:cd5e3d371b54 106 wait(0.1) ;
Rhyme 0:cd5e3d371b54 107 TFT.cls() ;
Rhyme 0:cd5e3d371b54 108 wait(0.1) ;
Rhyme 0:cd5e3d371b54 109
Rhyme 0:cd5e3d371b54 110 TFT.set_font((unsigned char*) Arial24x23);
Rhyme 0:cd5e3d371b54 111 TFT.foreground(Red) ;
Rhyme 0:cd5e3d371b54 112 TFT.locate(80, 40) ;
trevieze 6:b78ff34209e5 113 TFT.printf("MBED");
Rhyme 0:cd5e3d371b54 114 TFT.foreground(Blue);
Rhyme 0:cd5e3d371b54 115 TFT.locate(60, 80) ;
Rhyme 0:cd5e3d371b54 116 TFT.printf("2.8\"TFT") ;
Rhyme 0:cd5e3d371b54 117 TFT.locate(40, 120) ;
Rhyme 0:cd5e3d371b54 118 TFT.printf("with touch") ;
Rhyme 0:cd5e3d371b54 119 TFT.foreground(Black);
Rhyme 0:cd5e3d371b54 120 TFT.set_font((unsigned char*) Arial12x12);
Rhyme 0:cd5e3d371b54 121 TFT.foreground(Blue) ;
Rhyme 0:cd5e3d371b54 122 TFT.locate(30, 180) ;
Rhyme 0:cd5e3d371b54 123 TFT.printf("This program is running on") ;
Rhyme 0:cd5e3d371b54 124 TFT.locate(30, 200) ;
Rhyme 0:cd5e3d371b54 125 TFT.printf("ST Nucleo F411RE with") ;
Rhyme 0:cd5e3d371b54 126 TFT.locate(30, 220) ;
Rhyme 0:cd5e3d371b54 127 TFT.printf("a program developed in mbed") ;
Rhyme 0:cd5e3d371b54 128 TFT.foreground(Green) ;
Rhyme 0:cd5e3d371b54 129 TFT.locate(30, 260) ;
Rhyme 0:cd5e3d371b54 130 TFT.printf("To advance demo page, touch") ;
Rhyme 0:cd5e3d371b54 131 TFT.locate(30, 280) ;
Rhyme 0:cd5e3d371b54 132 TFT.printf("and hold right side of screen") ;
Rhyme 0:cd5e3d371b54 133 TFT.locate(30, 300) ;
Rhyme 0:cd5e3d371b54 134 TFT.printf("until the next screen starts") ;
Rhyme 0:cd5e3d371b54 135 TFT.BusEnable(false) ;
trevieze 6:b78ff34209e5 136 //backlight = 1 ;
Rhyme 0:cd5e3d371b54 137 }
Rhyme 0:cd5e3d371b54 138
Rhyme 0:cd5e3d371b54 139 void screen2(void) // Graphics
Rhyme 0:cd5e3d371b54 140 {
Rhyme 0:cd5e3d371b54 141 //Draw some graphics
Rhyme 0:cd5e3d371b54 142 int i, x[2], y[2] ;
trevieze 6:b78ff34209e5 143 //backlight = 0 ;
Rhyme 0:cd5e3d371b54 144 TFT.BusEnable(true) ;
Rhyme 0:cd5e3d371b54 145 TFT.background(Black);
Rhyme 0:cd5e3d371b54 146 wait(0.1) ;
Rhyme 0:cd5e3d371b54 147 TFT.foreground(White);
Rhyme 0:cd5e3d371b54 148 wait(0.1) ;
Rhyme 0:cd5e3d371b54 149 TFT.cls() ;
Rhyme 0:cd5e3d371b54 150 wait(0.1) ;
Rhyme 0:cd5e3d371b54 151 TFT.set_font((unsigned char*) Arial12x12);
Rhyme 0:cd5e3d371b54 152 TFT.locate(90,0);
Rhyme 0:cd5e3d371b54 153 TFT.printf("Graphics");
Rhyme 0:cd5e3d371b54 154
Rhyme 0:cd5e3d371b54 155 x[0] = 25 ; x[1] = 224 ;
Rhyme 0:cd5e3d371b54 156 y[0] = 20 ; y[1] = 219 ;
Rhyme 0:cd5e3d371b54 157 for (i = 20 ; i < 220 ; i += 10) {
Rhyme 0:cd5e3d371b54 158 TFT.line(i+5, y[0], i+5, y[1], Blue) ;
Rhyme 0:cd5e3d371b54 159 TFT.line(x[0], i, x[1], i, Blue) ;
Rhyme 0:cd5e3d371b54 160 }
Rhyme 0:cd5e3d371b54 161 TFT.line(125, y[0], 125, y[1], Green) ;
Rhyme 0:cd5e3d371b54 162 TFT.line(x[0], 120, x[1], 120, Green) ;
Rhyme 0:cd5e3d371b54 163 TFT.rect(x[0],y[0], x[1], y[1], Green) ;
Rhyme 0:cd5e3d371b54 164 TFT.locate(10, 20) ;
Rhyme 0:cd5e3d371b54 165 TFT.printf("V") ;
Rhyme 0:cd5e3d371b54 166 TFT.locate(0, 115) ;
Rhyme 0:cd5e3d371b54 167 TFT.printf("0.0") ;
Rhyme 0:cd5e3d371b54 168 TFT.locate(115, 225) ;
Rhyme 0:cd5e3d371b54 169 TFT.printf("0.0") ;
Rhyme 0:cd5e3d371b54 170 TFT.locate(215, 225) ;
Rhyme 0:cd5e3d371b54 171 TFT.printf("T") ;
Rhyme 0:cd5e3d371b54 172
Rhyme 0:cd5e3d371b54 173 double s;
Rhyme 0:cd5e3d371b54 174 for (int i = x[0]; i < 225; i++) {
Rhyme 0:cd5e3d371b54 175 s = 40 * sin((long double)i / 20);
Rhyme 0:cd5e3d371b54 176 TFT.pixel(i, 120 + (int)s, White);
Rhyme 0:cd5e3d371b54 177 }
Rhyme 0:cd5e3d371b54 178
Rhyme 0:cd5e3d371b54 179 TFT.fillrect(10, 240, 229, 309, White) ;
Rhyme 0:cd5e3d371b54 180 TFT.rect(10, 240, 229, 309, Red) ;
Rhyme 0:cd5e3d371b54 181 TFT.rect(11, 241, 228, 308, Red) ;
Rhyme 0:cd5e3d371b54 182
Rhyme 0:cd5e3d371b54 183 TFT.background(White) ;
Rhyme 0:cd5e3d371b54 184 TFT.foreground(Black) ;
Rhyme 0:cd5e3d371b54 185 TFT.locate(20, 250) ;
Rhyme 0:cd5e3d371b54 186 TFT.printf("With QVGA resolution") ;
Rhyme 0:cd5e3d371b54 187 TFT.locate(20, 270) ;
Rhyme 0:cd5e3d371b54 188 TFT.printf("simple graphics drawing") ;
Rhyme 0:cd5e3d371b54 189 TFT.locate(20, 290) ;
Rhyme 0:cd5e3d371b54 190 TFT.printf("capability is provided") ;
Rhyme 0:cd5e3d371b54 191 TFT.BusEnable(false) ;
trevieze 6:b78ff34209e5 192 //backlight = 1 ;
Rhyme 0:cd5e3d371b54 193 }
Rhyme 0:cd5e3d371b54 194
Rhyme 0:cd5e3d371b54 195 double clip(double src)
Rhyme 0:cd5e3d371b54 196 {
Rhyme 0:cd5e3d371b54 197 double value ;
Rhyme 0:cd5e3d371b54 198 value = src ;
Rhyme 0:cd5e3d371b54 199 if (value < 0.0) {
Rhyme 0:cd5e3d371b54 200 value = 0.0 ;
Rhyme 0:cd5e3d371b54 201 } else if (value > 2.0) {
Rhyme 0:cd5e3d371b54 202 value = 2.0 ;
Rhyme 0:cd5e3d371b54 203 }
Rhyme 0:cd5e3d371b54 204 return( value ) ;
Rhyme 0:cd5e3d371b54 205 }
Rhyme 0:cd5e3d371b54 206
Rhyme 0:cd5e3d371b54 207 void incPage(void)
Rhyme 0:cd5e3d371b54 208 {
Rhyme 0:cd5e3d371b54 209 page++ ;
Rhyme 0:cd5e3d371b54 210 if (page >= numPage) {
Rhyme 0:cd5e3d371b54 211 page = 0 ;
Rhyme 0:cd5e3d371b54 212 }
Rhyme 0:cd5e3d371b54 213 }
Rhyme 0:cd5e3d371b54 214
Rhyme 0:cd5e3d371b54 215 void decPage(void)
Rhyme 0:cd5e3d371b54 216 {
Rhyme 0:cd5e3d371b54 217 page-- ;
Rhyme 0:cd5e3d371b54 218 if (page < 0) {
Rhyme 0:cd5e3d371b54 219 page = numPage - 1 ;
Rhyme 0:cd5e3d371b54 220 }
Rhyme 0:cd5e3d371b54 221 }
Rhyme 0:cd5e3d371b54 222
Rhyme 0:cd5e3d371b54 223 int main()
Rhyme 0:cd5e3d371b54 224 {
trevieze 6:b78ff34209e5 225
trevieze 6:b78ff34209e5 226 if (bmp180.init() != 0) {
trevieze 6:b78ff34209e5 227 printf("Error communicating with BMP180\n");
trevieze 6:b78ff34209e5 228 } else {
trevieze 6:b78ff34209e5 229 printf("Initialized BMP180\n");
trevieze 6:b78ff34209e5 230
trevieze 6:b78ff34209e5 231 }
trevieze 6:b78ff34209e5 232 wait(1);
trevieze 6:b78ff34209e5 233
trevieze 6:b78ff34209e5 234
trevieze 6:b78ff34209e5 235
trevieze 5:6eb4b9322931 236 // uint16_t x, y, z ;
Rhyme 0:cd5e3d371b54 237 int prevPage = 99 ;
Rhyme 0:cd5e3d371b54 238 bool waitTouch = false ;
trevieze 2:c5085faf2aa5 239 point p;
Rhyme 0:cd5e3d371b54 240
Rhyme 0:cd5e3d371b54 241 printf("Hello World\n") ;
trevieze 6:b78ff34209e5 242
trevieze 5:6eb4b9322931 243 // screen0() ;
Rhyme 0:cd5e3d371b54 244
Rhyme 0:cd5e3d371b54 245 printf("Program Started!\n\r") ;
Rhyme 0:cd5e3d371b54 246
Rhyme 0:cd5e3d371b54 247 for(;;) {
Rhyme 0:cd5e3d371b54 248 // printf("TFT width = %d, height = %d\n\r", TFT.width(), TFT.height()) ;
trevieze 5:6eb4b9322931 249 // tft_cs = 0 ;
Rhyme 0:cd5e3d371b54 250 switch(page) {
Rhyme 0:cd5e3d371b54 251 case 0:
Rhyme 0:cd5e3d371b54 252 if (prevPage != page) {
Rhyme 0:cd5e3d371b54 253 screen1() ;
Rhyme 0:cd5e3d371b54 254 }
Rhyme 0:cd5e3d371b54 255 waitTouch = true ;
Rhyme 0:cd5e3d371b54 256 break ;
Rhyme 0:cd5e3d371b54 257 case 1:
Rhyme 0:cd5e3d371b54 258 if (prevPage != page) {
Rhyme 0:cd5e3d371b54 259 screen2() ;
Rhyme 0:cd5e3d371b54 260 }
Rhyme 0:cd5e3d371b54 261 waitTouch = true ;
Rhyme 0:cd5e3d371b54 262 break ;
Rhyme 0:cd5e3d371b54 263 default:
Rhyme 0:cd5e3d371b54 264 page = 0 ;
Rhyme 0:cd5e3d371b54 265 break ;
Rhyme 0:cd5e3d371b54 266 }
Rhyme 0:cd5e3d371b54 267 prevPage = page ;
Rhyme 0:cd5e3d371b54 268
trevieze 5:6eb4b9322931 269 // tft_cs = 1 ;
Rhyme 0:cd5e3d371b54 270 do {
trevieze 2:c5085faf2aa5 271 TSC.getTouch(p);
trevieze 6:b78ff34209e5 272
trevieze 6:b78ff34209e5 273 bmp180.startTemperature();
trevieze 6:b78ff34209e5 274 wait_ms(5); // Wait for conversion to complete
trevieze 6:b78ff34209e5 275 float temp;
trevieze 6:b78ff34209e5 276 if(bmp180.getTemperature(&temp) != 0) {
trevieze 6:b78ff34209e5 277 printf("Error getting temperature\n");
trevieze 6:b78ff34209e5 278 }
trevieze 6:b78ff34209e5 279 printf("Temperature is -> %.2f\n", temp);
trevieze 6:b78ff34209e5 280
trevieze 6:b78ff34209e5 281 //printf("Touched X %d\n\r", p.x) ;
trevieze 6:b78ff34209e5 282 //printf("Touched Y %d\n\r", p.y) ;
trevieze 6:b78ff34209e5 283 //printf("Touched Z %d\n\r", p.z) ;
trevieze 4:25554dc066a0 284 wait(3) ;
trevieze 2:c5085faf2aa5 285 if (p.z > __PRESURE) {
trevieze 2:c5085faf2aa5 286 if (p.y < 30000) { // left
Rhyme 0:cd5e3d371b54 287 decPage() ;
trevieze 2:c5085faf2aa5 288 } else if (p.y > 90000) { // right
Rhyme 0:cd5e3d371b54 289 incPage() ;
Rhyme 0:cd5e3d371b54 290 }
Rhyme 0:cd5e3d371b54 291 waitTouch = false ;
Rhyme 0:cd5e3d371b54 292 }
trevieze 2:c5085faf2aa5 293 //tsc_cs = 1 ;
trevieze 2:c5085faf2aa5 294 }
trevieze 2:c5085faf2aa5 295 while(waitTouch != false) ;
trevieze 3:6f47fcd415ab 296 //wait(1) ;
Rhyme 0:cd5e3d371b54 297 }
Rhyme 0:cd5e3d371b54 298 }