#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
//Screen global constantes and variables
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//Gear shift global constantes and variables
#define GEAR_UP_SHIFT_BUTTON_PIN_UP 2
#define GEAR_DOWN_SHIFT_BUTTON_PIN_DOWN 3
#define GEAR_NEUTRAL_BUTTON_PIN 4
#define MIN_GEAR 1
#define MAX_GEAR 5
#define NEUTRAL_GEAR 0
int gear = 0;
bool button_state_up = false;
bool button_state_down = false;
bool button_state_neutral = false;
//Pit Lane Limiter global constantes and variables
#define PIT_LANE_LIMITER_BUTTON_PIN 5
bool button_state_pit_limiter = false;
//FCY and Safety Car global constantes and varibles
#define FCY_AND_SAFETY_CAR_BUTTON_PIN 6
bool button_state_fcy_and_safety_car = false;
//Rain light global constantes and varibles
//Hazard lights global constantes and varibles
//Display Encoder global constantes and varibles
#define DISPLAY_ENCODER_CLK 23
#define DISPLAY_ENCODER_DT 22
int counter = 5;
//Traction Control Encoder global constantes and varibles
#define TRACTION_CONTROL_ENCODER_CLK 2
#define TRACTION_CONTROL_CODER_DT 3
//Engine Control Encoder global constantes and varibles
#define ENGINE_CONTROL_ENCODER_CLK 2
#define ENGINE_CONTROL_ENCODER_DT 3
void setup() {
tft.begin();
Serial.begin(115200);
set_up_gear_shifts_button(GEAR_UP_SHIFT_BUTTON_PIN_UP, GEAR_DOWN_SHIFT_BUTTON_PIN_DOWN, GEAR_NEUTRAL_BUTTON_PIN);
set_up_pit_limiter_button(PIT_LANE_LIMITER_BUTTON_PIN);
set_up_fcy_and_safety_car_button(FCY_AND_SAFETY_CAR_BUTTON_PIN);
pinMode(DISPLAY_ENCODER_CLK, INPUT);
pinMode(DISPLAY_ENCODER_DT, INPUT);
init_display(tft);
}
int counter_1 = 5;
void loop() {
gear_shifts();
pit_limiter();
fcy_and_safety_car();
counter_1 = encoder_control(DISPLAY_ENCODER_CLK, DISPLAY_ENCODER_DT, counter_1);
Serial.println(counter_1);
}
/*---------------------------------------------UNIVERSAL-LIBS-------------------------------------------------*/
void init_display(Adafruit_ILI9341 tft){
tft.setCursor(110, 200);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.print("N");
tft.setCursor(50, 50);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.print("speed");
}
void set_up_button(int button_pin){
pinMode(button_pin, INPUT);
}
bool read_button(int button_pin){
bool reading = digitalRead(button_pin) == HIGH;
return reading;
}
int encoder_control(int ENCODER_CLK, int ENCODER_DT, int &counter_1) {
static int lastClk = HIGH;
int newClk = read_encoder(ENCODER_CLK);
return get_value_encoder(ENCODER_CLK, ENCODER_DT, newClk, counter_1, lastClk);
}
int read_encoder(int ENCODER_CLK) {
return digitalRead(ENCODER_CLK);
}
int get_value_encoder(int ENCODER_CLK, int ENCODER_DT, int newClk, int encoder_counter, int &lastClk) {
if (newClk != lastClk) {
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
encoder_counter++;
} else if (newClk == LOW && dtValue == LOW) {
encoder_counter--;
}
}
return encoder_counter;
}
/*-------------------------------------------------GEARS------------------------------------------------------*/
void set_up_gear_shifts_button(int up_gear_button, int down_gear_button, int neutral_button){
set_up_button(up_gear_button);
set_up_button(down_gear_button);
set_up_button(neutral_button);
}
void update_screen_gears(){
tft.fillRect(110, 200, 40, 40, ILI9341_BLACK);
tft.setCursor(110, 200);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
if(gear == NEUTRAL_GEAR){
tft.print("N");
}else{
tft.print(gear);
}
}
void up_shift(int max_gear_value){
if (gear < max_gear_value) {
gear++;
update_screen_gears();
}
}
void down_shift(int min_gear_value){
if (gear > min_gear_value) {
gear--;
update_screen_gears();
}
}
void neutral_button(){
gear = NEUTRAL_GEAR;
update_screen_gears();
}
void gear_shifts(){
bool reading_up = read_button(GEAR_UP_SHIFT_BUTTON_PIN_UP);
bool reading_down = read_button(GEAR_DOWN_SHIFT_BUTTON_PIN_DOWN);
bool reading_neutral = read_button(GEAR_NEUTRAL_BUTTON_PIN);
delay(1);
if (reading_up != button_state_up) {
button_state_up = reading_up;
if (button_state_up) {
up_shift(MAX_GEAR);
}
}
if (reading_down != button_state_down) {
button_state_down = reading_down;
if (button_state_down) {
down_shift(MIN_GEAR);
}
}
if (reading_neutral != button_state_neutral) {
button_state_neutral = reading_neutral;
if (button_state_neutral) {
neutral_button();
}
}
}
/*-------------------------------------------PIT-LANE-LIMITER-------------------------------------------------*/
void set_up_pit_limiter_button(int pit_lane_limiter_button_pin){
set_up_button(pit_lane_limiter_button_pin);
}
void pit_limiter(){
bool reading_pit_limiter = read_button(PIT_LANE_LIMITER_BUTTON_PIN);
delay(0.5);
if (reading_pit_limiter != button_state_pit_limiter) {
button_state_pit_limiter = reading_pit_limiter;
if (button_state_pit_limiter) {
Serial.print("Pit Limiter\n");
}
}
}
/*-------------------------------------------FCY-AND-SAFETY-CAR-----------------------------------------------*/
void set_up_fcy_and_safety_car_button(int fcy_and_safety_car_button_pin){
set_up_button(fcy_and_safety_car_button_pin);
}
void fcy_and_safety_car(){
bool reading_fcy_and_safety_car = read_button(FCY_AND_SAFETY_CAR_BUTTON_PIN);
delay(0.5);
if (reading_fcy_and_safety_car != button_state_fcy_and_safety_car) {
button_state_fcy_and_safety_car = reading_fcy_and_safety_car;
if (button_state_fcy_and_safety_car) {
Serial.print("FCY and Safety Car\n");
}
}
}