#include <TFT_eSPI.h>
#include "image.h"
//Pin configuration
#define BUZZER_PIN 26//speaker
#define SELECTOR_PIN 27//push button
// setting PWM properties
#define backlightChannel 0
#define buzzerChannel 2
#define array_length(x) (sizeof(x) / sizeof(x[0])) //macro to calculate array length
//DISPLAY
TFT_eSPI tft = TFT_eSPI();
//Sprites
TFT_eSprite car = TFT_eSprite(&tft);
TFT_eSprite bk = TFT_eSprite(&tft);
TFT_eSprite pole = TFT_eSprite(&tft);
TFT_eSprite fence = TFT_eSprite(&tft);
void StarField() {//start field effect
#define BK_HEIGHT 80
#define BK_WIDTH 235
uint8_t cur_x = 68;
uint8_t cur_y = 15;
uint8_t dash_x = 20;
int16_t tag_x = 235;
int16_t fence_x = 0;
uint8_t ani_speed = 2;
//create spirtes
bk.createSprite(BK_WIDTH,BK_HEIGHT);
car.createSprite(CAR_WIDTH,CAR_HEIGHT);//image size 114x50
car.setSwapBytes(true);
car.pushImage(0,0,CAR_WIDTH,CAR_HEIGHT,futurecar);//image size 114x50
pole.createSprite(POLE_WIDTH,POLE_HEIGHT);
pole.setSwapBytes(true);
pole.pushImage(0,0,POLE_WIDTH,POLE_HEIGHT,pole1);
fence.createSprite(FENCE_WIDTH,FENCE_HEIGHT);
fence.setSwapBytes(true);
fence.pushImage(0,0,FENCE_WIDTH,FENCE_HEIGHT,fence1);
//-------------------------------
tft.fillScreen(TFT_BLACK);//clear screen
//draw QRCode
tft.drawBitmap(0, 159, qrcode, 80, 80, TFT_WHITE);
//draw text
tft.setTextColor(TFT_WHITE);
tft.drawString(">MAP/ENG LOAD/ECT/EOT/TFT/ENG SPD/PCM Volt",0,40,2);
tft.drawString(">Warning, Automatic Dim/OnOff/O็verheat Shutdown",0,60,2);
tft.drawString(">Read DTC Code & Clear MIL Status",0,80,2);
tft.drawString("* FW-\"VaandCobOBD2Gauge.bin\" * Image-\"mypic.jpg\"",0,100,2);
tft.drawString("* Facebook : www.facebook.com/vaandcob",0,120,2);
tft.setTextColor(TFT_YELLOW);
tft.drawString(" [ Manual ] ----------------[ Press button to exit ]",0,140,2);
tft.setTextColor(TFT_CYAN);
//String txt = "[ "+serial_no+" ] BUILD : "+compile_date;
//tft.drawString(txt,0,0,2);
//get VIN
//getPID("ATE0");//force echo off
//txt = "VIN : " + getVIN(getPID("0902"));
//tft.drawString(txt,0,20,2);
bk.setTextColor(TFT_BLACK,TFT_ORANGE);
//loop drawing
while (digitalRead(SELECTOR_PIN) == HIGH) {//exit if press button
//draw car driving animation
bk.fillSprite(0x4228);//draw road
bk.fillRect(0,0,235,16,TFT_LIGHTGREY);
bk.fillRect(0,16,235,3,0x8430);
//draw dash line
for(int16_t i = 0; i < 5; i++) {
//speed //space //posY //length
// bk.drawFastHLine(dash_x +(40 * i), 20,10,TFT_WHITE);//draw dash line length 10
bk.drawFastHLine((dash_x-20)*1.5+(60 * i),45,15,TFT_WHITE);//length 15
// bk.drawFastHLine((dash_x-40)*2.0+(80 * i),79,20,TFT_WHITE);//length 15
}
dash_x = dash_x - ani_speed;
if (dash_x <= 0 ) dash_x = 40;
//draw billboard
tag_x = tag_x - ani_speed;
if (tag_x <= -80) tag_x = 235;
// bk.setTextColor(random(0xffff));
bk.drawString("< Thank You >",tag_x,0,2);//draw billboard
//draw car
int8_t move = random(-1,2);
cur_x = cur_x + move;
move = random(-1,2);
cur_y = cur_y + move;
if (cur_x > 235-CAR_WIDTH) cur_x = 235-CAR_WIDTH;
if (cur_x < 1) cur_x = 1;
if (cur_y < 1) cur_y = 1;
if (cur_y > 79-CAR_HEIGHT) cur_y = 79-CAR_HEIGHT;
car.pushToSprite(&bk,cur_x,cur_y,TFT_BLACK);//put car into bk, white color as transparent
//draw fence
for(int i=0;i<8;i++)
fence.pushToSprite(&bk,fence_x*2+(FENCE_WIDTH*i),80-FENCE_HEIGHT,TFT_BLACK);
fence_x = fence_x - ani_speed;
if (fence_x <= -FENCE_WIDTH + ani_speed) fence_x = 0;
//draw pole
pole.pushToSprite(&bk,tag_x*2,80-POLE_HEIGHT,TFT_BLACK);//draw bush
bk.pushSprite(85,159);//show background sprite
}
//remove sprites
car.deleteSprite();
bk.deleteSprite();
pole.deleteSprite();
fence.deleteSprite();
}//task star field
//----------------------------
// the setup function runs once when you press reset or power the board
void setup() {
//pin configuration
pinMode(BUZZER_PIN,OUTPUT);//speaker
pinMode(SELECTOR_PIN,INPUT_PULLUP);//button
//pwm setup
ledcSetup(buzzerChannel, 1500, 10);//buzzer 10 bit
ledcSetup(backlightChannel, 12000, 8);//backlight 8 bit
ledcAttachPin(BUZZER_PIN, buzzerChannel);//attach buzzer
Serial.begin(115200);
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
}
//----------------------------
void loop()
{
StarField();//play star field animation
}