#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#define TFT_DC 21
#define TFT_CS 22
#define SEL_PIN 35
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// --- Параметры шарика и управления ---
const int16_t R = 10; // радиус
const uint16_t BG = ILI9341_BLACK;
const uint16_t FG = ILI9341_YELLOW;
const int JOY_X = 33; // VRx (ADC)
const int JOY_Y = 32; // VRy (ADC)
const int LOW_TH = 1200; // «влево/вверх»
const int HIGH_TH = 2800; // «вправо/вниз»
const int STEP = 4; // шаг в пикселях
int16_t x, y; // текущая позиция
int16_t px, py; // предыдущая позиция
int16_t maxX, maxY;
void setup() {
Serial.println("Begin setup");
tft.begin();
tft.setRotation(1);
tft.fillScreen(BG);
maxX = tft.width() - 1;
maxY = tft.height() - 1;
x = px = maxX / 2;
y = py = maxY / 2;
pinMode(JOY_X, INPUT);
pinMode(JOY_Y, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
tft.fillCircle(x, y, R, FG);
Serial.println("Start");
}
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;
}
void loop() {
int horz = analogRead(JOY_X); // вправо растёт
int vert = analogRead(JOY_Y); // вниз растёт
// сохранить прошлую позицию
px = x; py = y;
if (vert > HIGH_TH) y = max(y - STEP, R);
if (vert < LOW_TH) y = min(y + STEP, maxY - R);
if (horz > HIGH_TH) x = max(x - STEP, R);
if (horz < LOW_TH) x = min(x + STEP, maxX - R);
if (x != px || y != py) {
if (digitalRead(SEL_PIN) == HIGH) {
tft.fillCircle(px, py, R, BG); // стереть старый
}
tft.fillCircle(x, y, R, FG); // нарисовать новый
}
delay(100);
}