#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include "yandexRover.h"
#define TFT_DC 21
#define TFT_CS 22
#define SWITCH 35
#define JOY_X 33
#define JOY_Y 32
// Структуры для хранения данных
struct Sprite // Структура для хранения данных спрайта
{
uint16_t SIZE; // Размер квадрата
uint16_t BG; // Цвет фона
const uint16_t* DATA;
int16_t x, y; // текущая позиция
int16_t px, py; // предыдущая позиция
};
struct Joystick {
int16_t LOW_TH; // «влево/вверх»
int16_t HIGH_TH; // «вправо/вниз»
};
struct Canvas {
int16_t STEP; // Шаг кисти
int16_t MAX_X; // Размеры экрана
int16_t MAX_Y; // Размеры экрана
};
// Вспомогательные функции
int max(int value1, int value2) {
if (value1 > value2) return value1;
return value2;
}
int min(int value1, int value2) {
if (value1 < value2) return value1;
return value2;
}
// Инициализация данных
Adafruit_ILI9341 display = Adafruit_ILI9341(TFT_CS, TFT_DC); // Иницализация дисплея
Sprite sprite{50, ILI9341_BLACK, (const uint16_t*)yandexRoverSprite};
Joystick joystick{1200, 2800};
Canvas canvas{4};
void draw(Sprite &sprite, Adafruit_ILI9341 &display) {
if (sprite.px != sprite.x || sprite.py != sprite.y) {
display.fillRect(sprite.px, sprite.py, sprite.SIZE, sprite.SIZE, sprite.BG);
display.drawRGBBitmap(sprite.x, sprite.y, sprite.DATA, sprite.SIZE, sprite.SIZE);
}
}
void updateCoords(Sprite &sprite, Joystick &joystick, Canvas &canvas, int horz, int vert) {
sprite.px = sprite.x;
sprite.py = sprite.y;
if (vert > joystick.HIGH_TH) sprite.y = max(sprite.y - canvas.STEP, 0);
if (vert < joystick.LOW_TH) sprite.y = min(sprite.y + canvas.STEP, canvas.MAX_Y - sprite.SIZE);
if (horz > joystick.HIGH_TH) sprite.x = max(sprite.x - canvas.STEP, 0);
if (horz < joystick.LOW_TH) sprite.x = min(sprite.x + canvas.STEP, canvas.MAX_X - sprite.SIZE);
}
void setup() {
display.begin();
display.setRotation(1);
display.fillScreen(sprite.BG);
canvas.MAX_X = display.width();
canvas.MAX_Y = display.height();
sprite.x = canvas.MAX_X / 2 - sprite.SIZE/2;
sprite.y = canvas.MAX_Y / 2 - sprite.SIZE/2;
pinMode(JOY_X, INPUT);
pinMode(JOY_Y, INPUT);
draw(sprite, display);
}
void loop() {
updateCoords(sprite, joystick, canvas, analogRead(JOY_X), analogRead(JOY_Y));
draw(sprite, display);
delay(100);
}