From dad763ce4d2ff62eb5735ee07742cfcb32ee8313 Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 31 Jan 2020 15:51:13 -0800 Subject: [PATCH] NodeMCU(ESP8266) | GPS | ILI9488 - Showing the Latitude and Longitude on Display --- .../ESP8266_BAISC_GPS_MODULE_FINAL.ino | 120 ++++++ .../ESP8266_BAISC_GPS_MODULE_TEST.ino | 92 +++++ .../ESP8266_BASIC_GPS_ILI9488_TEST.ino | 370 ++++++++++++++++++ 3 files changed, 582 insertions(+) create mode 100644 ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_FINAL/ESP8266_BAISC_GPS_MODULE_FINAL.ino create mode 100644 ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_TEST/ESP8266_BAISC_GPS_MODULE_TEST.ino create mode 100644 ESP8266_BASIC_GPS/ESP8266_BASIC_GPS_ILI9488_TEST/ESP8266_BASIC_GPS_ILI9488_TEST.ino diff --git a/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_FINAL/ESP8266_BAISC_GPS_MODULE_FINAL.ino b/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_FINAL/ESP8266_BAISC_GPS_MODULE_FINAL.ino new file mode 100644 index 0000000..d397eca --- /dev/null +++ b/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_FINAL/ESP8266_BAISC_GPS_MODULE_FINAL.ino @@ -0,0 +1,120 @@ +#include +#include +#include +#include "SPI.h" +#include "TFT_eSPI.h" + +TFT_eSPI tft = TFT_eSPI(); + +static const int RXPin = 5, TXPin = 16; +static const uint32_t GPSBaud = 9600; + +const int offset = -8; // Pacific Standard Time +time_t prevDisplay = 0; + +// The TinyGPS++ object +TinyGPSPlus gps; + +// The serial connection to the GPS device +SoftwareSerial ss(RXPin, TXPin); + +bool isReadyToShow; +char timeBuffer[16]; +char dateBuffer[16]; +float prevLatitude, prevLongitude; + +void setup() +{ + Serial.begin(115200); + ss.begin(GPSBaud); + + tft.begin(); + tft.setRotation(3); + + isReadyToShow = false; + initScreen(); +} + +void loop() +{ + + while (ss.available() > 0){ + if (gps.encode(ss.read())){ + + if(!isReadyToShow){ + isReadyToShow = true; + tft.fillScreen(TFT_BLACK); + } + + int Year = gps.date.year(); + byte Month = gps.date.month(); + byte Day = gps.date.day(); + byte Hour = gps.time.hour(); + byte Minute = gps.time.minute(); + byte Second = gps.time.second(); + + setTime(Hour, Minute, Second, Day, Month, Year); + adjustTime(offset * SECS_PER_HOUR); + + if(gps.location.isValid()){ + tft.setTextDatum(TR_DATUM); + tft.setTextSize(2); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + float latitude = gps.location.lat(); + if(latitude != prevLatitude){ + tft.drawString(String(latitude, 6), 460, 120, 4); + } + prevLatitude = latitude; + + float longitude = gps.location.lng(); + if(longitude != prevLongitude){ + tft.drawString(String(longitude, 6), 460, 120, 4); + } + prevLongitude = longitude; + + } + } + + if(timeStatus() != timeNotSet){ + if(now() != prevDisplay){ + prevDisplay = now(); + dateTimeDisplay(); + } + } + } + + if (millis() > 5000 && gps.charsProcessed() < 10) + { + Serial.println(F("No GPS detected: check wiring.")); + errorScreen(); + while(true); + } +} + +void initScreen(){ + tft.fillScreen(TFT_WHITE); + tft.setTextSize(1); + tft.setTextColor(TFT_RED, TFT_WHITE); + tft.setTextDatum(TC_DATUM); + tft.drawString("Waiting for GPS...", 240, 140, 4); +} + +void errorScreen(){ + tft.fillScreen(TFT_RED); + tft.setTextSize(1); + tft.setTextColor(TFT_WHITE, TFT_RED); + tft.setTextDatum(TC_DATUM); + tft.drawString("No GPS detected: Check Wiring!", 240, 140, 4); +} + +void dateTimeDisplay(){ + sprintf(timeBuffer, "Time: %02u:%02u:%02u", hour(), minute(), second()); + tft.setTextDatum(TL_DATUM); + tft.setTextSize(1); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.drawString(timeBuffer, 0, 0, 4); + + sprintf(dateBuffer, "Date: %02u/%02u/%04u", month(), day(), year()); + tft.drawString(dateBuffer, 0, 26, 4); +} diff --git a/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_TEST/ESP8266_BAISC_GPS_MODULE_TEST.ino b/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_TEST/ESP8266_BAISC_GPS_MODULE_TEST.ino new file mode 100644 index 0000000..61927a6 --- /dev/null +++ b/ESP8266_BASIC_GPS/ESP8266_BAISC_GPS_MODULE_TEST/ESP8266_BAISC_GPS_MODULE_TEST.ino @@ -0,0 +1,92 @@ +#include +#include +/* + This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object. + It requires the use of SoftwareSerial, and assumes that you have a + 4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). +*/ +static const int RXPin = 5, TXPin = 16; +static const uint32_t GPSBaud = 9600; + +// The TinyGPS++ object +TinyGPSPlus gps; + +// The serial connection to the GPS device +SoftwareSerial ss(RXPin, TXPin); + +void setup() +{ + Serial.begin(115200); + ss.begin(GPSBaud); + + Serial.println(F("DeviceExample.ino")); + Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module")); + Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion()); + Serial.println(F("by Mikal Hart")); + Serial.println(); +} + +void loop() +{ + // This sketch displays information every time a new sentence is correctly encoded. + while (ss.available() > 0) + if (gps.encode(ss.read())) + displayInfo(); + + if (millis() > 5000 && gps.charsProcessed() < 10) + { + Serial.println(F("No GPS detected: check wiring.")); + while(true); + } +} + +void displayInfo() +{ + Serial.print(F("Location: ")); + if (gps.location.isValid()) + { + Serial.print(gps.location.lat(), 6); + Serial.print(F(",")); + Serial.print(gps.location.lng(), 6); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.print(F(" Date/Time: ")); + if (gps.date.isValid()) + { + Serial.print(gps.date.month()); + Serial.print(F("/")); + Serial.print(gps.date.day()); + Serial.print(F("/")); + Serial.print(gps.date.year()); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.print(F(" ")); + if (gps.time.isValid()) + { + if (gps.time.hour() < 10) Serial.print(F("0")); + Serial.print(gps.time.hour()); + Serial.print(F(":")); + if (gps.time.minute() < 10) Serial.print(F("0")); + Serial.print(gps.time.minute()); + Serial.print(F(":")); + if (gps.time.second() < 10) Serial.print(F("0")); + Serial.print(gps.time.second()); + Serial.print(F(".")); + if (gps.time.centisecond() < 10) Serial.print(F("0")); + Serial.print(gps.time.centisecond()); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.println(); +} diff --git a/ESP8266_BASIC_GPS/ESP8266_BASIC_GPS_ILI9488_TEST/ESP8266_BASIC_GPS_ILI9488_TEST.ino b/ESP8266_BASIC_GPS/ESP8266_BASIC_GPS_ILI9488_TEST/ESP8266_BASIC_GPS_ILI9488_TEST.ino new file mode 100644 index 0000000..8535a75 --- /dev/null +++ b/ESP8266_BASIC_GPS/ESP8266_BASIC_GPS_ILI9488_TEST/ESP8266_BASIC_GPS_ILI9488_TEST.ino @@ -0,0 +1,370 @@ +/* + Adapted from the Adafruit graphicstest sketch, see orignal header at end + of sketch. + + This sketch uses the GLCD font (font 1) only. + + Make sure all the display driver and pin comnenctions are correct by + editting the User_Setup.h file in the TFT_eSPI library folder. + + ######################################################################### + ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### + ######################################################################### +*/ + + +#include "SPI.h" +#include "TFT_eSPI.h" + +TFT_eSPI tft = TFT_eSPI(); + +unsigned long total = 0; +unsigned long tn = 0; +void setup() { + Serial.begin(115200); + while (!Serial); + + Serial.println(""); Serial.println(""); + Serial.println("TFT_eSPI library test!"); + + tft.init(); + + tn = micros(); + tft.fillScreen(TFT_BLACK); + + yield(); Serial.println(F("Benchmark Time (microseconds)")); + + yield(); Serial.print(F("Screen fill ")); + yield(); Serial.println(testFillScreen()); + //total+=testFillScreen(); + //delay(500); + + yield(); Serial.print(F("Text ")); + yield(); Serial.println(testText()); + //total+=testText(); + //delay(3000); + + yield(); Serial.print(F("Lines ")); + yield(); Serial.println(testLines(TFT_CYAN)); + //total+=testLines(TFT_CYAN); + //delay(500); + + yield(); Serial.print(F("Horiz/Vert Lines ")); + yield(); Serial.println(testFastLines(TFT_RED, TFT_BLUE)); + //total+=testFastLines(TFT_RED, TFT_BLUE); + //delay(500); + + yield(); Serial.print(F("Rectangles (outline) ")); + yield(); Serial.println(testRects(TFT_GREEN)); + //total+=testRects(TFT_GREEN); + //delay(500); + + yield(); Serial.print(F("Rectangles (filled) ")); + yield(); Serial.println(testFilledRects(TFT_YELLOW, TFT_MAGENTA)); + //total+=testFilledRects(TFT_YELLOW, TFT_MAGENTA); + //delay(500); + + yield(); Serial.print(F("Circles (filled) ")); + yield(); Serial.println(testFilledCircles(10, TFT_MAGENTA)); + //total+= testFilledCircles(10, TFT_MAGENTA); + + yield(); Serial.print(F("Circles (outline) ")); + yield(); Serial.println(testCircles(10, TFT_WHITE)); + //total+=testCircles(10, TFT_WHITE); + //delay(500); + + yield(); Serial.print(F("Triangles (outline) ")); + yield(); Serial.println(testTriangles()); + //total+=testTriangles(); + //delay(500); + + yield(); Serial.print(F("Triangles (filled) ")); + yield(); Serial.println(testFilledTriangles()); + //total += testFilledTriangles(); + //delay(500); + + yield(); Serial.print(F("Rounded rects (outline) ")); + yield(); Serial.println(testRoundRects()); + //total+=testRoundRects(); + //delay(500); + + yield(); Serial.print(F("Rounded rects (filled) ")); + yield(); Serial.println(testFilledRoundRects()); + //total+=testFilledRoundRects(); + //delay(500); + + yield(); Serial.println(F("Done!")); yield(); + //Serial.print(F("Total = ")); Serial.println(total); + + //yield();Serial.println(millis()-tn); +} + +void loop(void) { + for (uint8_t rotation = 0; rotation < 4; rotation++) { + tft.setRotation(rotation); + testText(); + delay(2000); + } +} + + +unsigned long testFillScreen() { + unsigned long start = micros(); + tft.fillScreen(TFT_BLACK); + tft.fillScreen(TFT_RED); + tft.fillScreen(TFT_GREEN); + tft.fillScreen(TFT_BLUE); + tft.fillScreen(TFT_BLACK); + return micros() - start; +} + +unsigned long testText() { + tft.fillScreen(TFT_BLACK); + unsigned long start = micros(); + tft.setCursor(0, 0); + tft.setTextColor(TFT_WHITE); tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(TFT_YELLOW); tft.setTextSize(2); + tft.println(1234.56); + tft.setTextColor(TFT_RED); tft.setTextSize(3); + tft.println(0xDEADBEEF, HEX); + tft.println(); + tft.setTextColor(TFT_GREEN); + tft.setTextSize(5); + tft.println("Groop"); + tft.setTextSize(2); + tft.println("I implore thee,"); + //tft.setTextColor(TFT_GREEN,TFT_BLACK); + tft.setTextSize(1); + tft.println("my foonting turlingdromes."); + tft.println("And hooptiously drangle me"); + tft.println("with crinkly bindlewurdles,"); + tft.println("Or I will rend thee"); + tft.println("in the gobberwarts"); + tft.println("with my blurglecruncheon,"); + tft.println("see if I don't!"); + return micros() - start; +} + +unsigned long testLines(uint16_t color) { + unsigned long start, t; + int x1, y1, x2, y2, + w = tft.width(), + h = tft.height(); + + tft.fillScreen(TFT_BLACK); + + x1 = y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t = micros() - start; // fillScreen doesn't count against timing + yield(); + tft.fillScreen(TFT_BLACK); + + x1 = w - 1; + y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + yield(); + tft.fillScreen(TFT_BLACK); + + x1 = 0; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + yield(); + tft.fillScreen(TFT_BLACK); + + x1 = w - 1; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + yield(); + return micros() - start; +} + +unsigned long testFastLines(uint16_t color1, uint16_t color2) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(); + + tft.fillScreen(TFT_BLACK); + start = micros(); + for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1); + for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2); + + return micros() - start; +} + +unsigned long testRects(uint16_t color) { + unsigned long start; + int n, i, i2, + cx = tft.width() / 2, + cy = tft.height() / 2; + + tft.fillScreen(TFT_BLACK); + n = min(tft.width(), tft.height()); + start = micros(); + for (i = 2; i < n; i += 6) { + i2 = i / 2; + tft.drawRect(cx - i2, cy - i2, i, i, color); + } + + return micros() - start; +} + +unsigned long testFilledRects(uint16_t color1, uint16_t color2) { + unsigned long start, t = 0; + int n, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(TFT_BLACK); + n = min(tft.width(), tft.height()); + for (i = n - 1; i > 0; i -= 6) { + i2 = i / 2; + start = micros(); + tft.fillRect(cx - i2, cy - i2, i, i, color1); + t += micros() - start; + // Outlines are not included in timing results + tft.drawRect(cx - i2, cy - i2, i, i, color2); + } + + return t; +} + +unsigned long testFilledCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; + + tft.fillScreen(TFT_BLACK); + start = micros(); + for (x = radius; x < w; x += r2) { + for (y = radius; y < h; y += r2) { + tft.fillCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, r2 = radius * 2, + w = tft.width() + radius, + h = tft.height() + radius; + + // Screen is not cleared for this one -- this is + // intentional and does not affect the reported time. + start = micros(); + for (x = 0; x < w; x += r2) { + for (y = 0; y < h; y += r2) { + tft.drawCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testTriangles() { + unsigned long start; + int n, i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(TFT_BLACK); + n = min(cx, cy); + start = micros(); + for (i = 0; i < n; i += 5) { + tft.drawTriangle( + cx , cy - i, // peak + cx - i, cy + i, // bottom left + cx + i, cy + i, // bottom right + tft.color565(0, 0, i)); + } + + return micros() - start; +} + +unsigned long testFilledTriangles() { + unsigned long start, t = 0; + int i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(TFT_BLACK); + start = micros(); + for (i = min(cx, cy); i > 10; i -= 5) { + start = micros(); + tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(0, i, i)); + t += micros() - start; + tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(i, i, 0)); + } + + return t; +} + +unsigned long testRoundRects() { + unsigned long start; + int w, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(TFT_BLACK); + w = min(tft.width(), tft.height()); + start = micros(); + for (i = 0; i < w; i += 6) { + i2 = i / 2; + tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(i, 0, 0)); + } + + return micros() - start; +} + +unsigned long testFilledRoundRects() { + unsigned long start; + int i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(TFT_BLACK); + start = micros(); + for (i = min(tft.width(), tft.height()); i > 20; i -= 6) { + i2 = i / 2; + tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, i, 0)); + yield(); + } + + return micros() - start; +} + +/*************************************************** + Original Adafruit text: + + This is an example sketch for the Adafruit 2.2" SPI display. + This library works with the Adafruit 2.2" TFT Breakout w/SD card + ----> http://www.adafruit.com/products/1480 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/