#include <Arduino.h>
#include <SPI.h>
#include <TFT_eSPI.h> // Hardware-specific library
#include <TFT_eWidget.h>
#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include <Free_Fonts.h>
#include <XPT2046_Touchscreen.h>
// Touchscreen pins
#define XPT2046_IRQ 14 // T_IRQ
#define XPT2046_MOSI 11 // T_DIN
#define XPT2046_MISO 12 // T_OUT
#define XPT2046_CLK 10 // T_CLK
#define XPT2046_CS 13 // T_CS
TFT_eSPI tft = TFT_eSPI();
SoftwareSerial gpsSerial(22, 28);
TinyGPSPlus gps;
TFT_eSprite buff = TFT_eSprite(&tft);
MeterWidget speed = MeterWidget(&buff);
ButtonWidget btnReset = ButtonWidget(&buff);
XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);
#define BUTTON_W 50
#define BUTTON_H 20
#define LOOP_PERIOD 35 // Display updates every 35 ms
uint32_t timer = millis();
float maxSpeed = 0.00;
//float speedValue = 0.0;
void btnReset_pressAction(void){
if(btnReset.justPressed()){
maxSpeed = 0.00;
btnReset.drawSmoothButton(true);
}
}
void btnReset_releaseAction(void){
static uint32_t waitTime = 1000;
if(btnReset.justReleased()){
btnReset.drawSmoothButton(false);
btnReset.setReleaseTime(millis());
waitTime = 10000;
}else{
if(millis() - btnReset.getReleaseTime() >= waitTime){
waitTime = 1000;
btnReset.setReleaseTime(millis());
btnReset.drawSmoothButton(!btnReset.getState());
}
}
}
void initButtons(){
uint16_t x = 222;
uint16_t y = 200;
btnReset.initButtonUL(x, y, BUTTON_W, BUTTON_H, TFT_WHITE, TFT_BLACK, TFT_WHITE, "Reset", 1);
btnReset.setPressAction(btnReset_pressAction);
btnReset.setReleaseAction(btnReset_releaseAction);
btnReset.drawSmoothButton(false, 3, TFT_BLACK);
}
void setup(void)
{
tft.init();
tft.setRotation(3);
buff.createSprite(tft.width(), tft.height());
buff.fillScreen(TFT_BLACK);
gpsSerial.begin(9600);
Serial.begin(9600);
speed.setZones(0, 0, 0, 0, 0, 0, 0, 40); // Example here red starts at 75% and ends at 100% of full scale
String initText = "Initializing GPS...";
Serial.println(initText);
speed.analogMeter((tft.width() / 2) - (239 / 2),0, 0, 60, "MPH", "0", "10", "20", "30", "40");
buff.setCursor((tft.width() / 2) - (initText.length() * 4), 1, 4);
buff.setTextColor(TFT_WHITE,TFT_BLACK);
// tft.println(initText);
initButtons();
buff.pushSprite(0,0);
//buff.deleteSprite();
}
void loop()
{
uint16_t t_x = 9999, t_y = 9999; // To store the touch coordinates
static uint32_t updateTime = 0;
while (gpsSerial.available() > 0){
byte gpsIn = gpsSerial.read();
gps.encode(gpsIn);
//Serial.print((char)gpsIn);
}
if (millis() - updateTime >= LOOP_PERIOD){
updateTime = millis();
float speedValue = 0.0;
speedValue = gps.speed.mph();
if(speedValue > maxSpeed) maxSpeed = speedValue;
//buff.createSprite(tft.width(), tft.height());
//speed.analogMeter((tft.width() / 2) - (239 / 2),0, 0, 60, "MPH", "0", "10", "20", "30", "40");
speed.updateNeedle(speedValue, 0);
buff.setCursor(0,tft.height() / 2 + 12, 4);
buff.setTextSize(1);
buff.setTextColor(TFT_WHITE,TFT_BLACK,true);
buff.setTextPadding(32);
buff.println("Current spd: " + (String)gps.speed.mph() + " mph ");
buff.setTextSize(0);
String maxSpeedText = "Max speed: " + (String)maxSpeed + " mph ";
buff.println(maxSpeedText);
String satellitesText = "Satellites: " + (String)gps.satellites.value();
buff.println(satellitesText + " ");
buff.pushSprite(0,0);
//buff.deleteSprite();
bool pressed = tft.getTouch(&t_x, &t_y);
Serial.println((String)t_x + "," + (String)t_y);
if (pressed) {
if(btnReset.contains(t_x, t_y)){
btnReset.press(true);
btnReset.pressAction();
}
}else {
btnReset.press(false);
btnReset.releaseAction();
}
}
}