#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#define TFT_DC 21
#define TFT_CS 22
#define SWITCH 35
#define JOY_X 33
#define JOY_Y 32
// Структуры для хранения данных
struct Brush // Структура для хранения данных кисти
{
uint16_t R; // Радиус
uint16_t BG; // Цвет фона
uint16_t FG; // Цвет кисти
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); // Иницализация дисплея
Brush brush{10, ILI9341_BLACK, ILI9341_YELLOW};
Joystick joystick{1200, 2800};
Canvas canvas{4};
void draw(Brush &brush, Adafruit_ILI9341 &display, bool mode) {
if (brush.px != brush.x || brush.py != brush.y) {
if (mode) {
display.fillCircle(brush.px, brush.py, brush.R, brush.BG); // стереть старый
}
display.fillCircle(brush.x, brush.y, brush.R, brush.FG); // нарисовать новый
}
}
void updateCoords(Brush &brush, Joystick &joystick, Canvas &canvas, int horz, int vert) {
brush.px = brush.x;
brush.py = brush.y;
if (vert > joystick.HIGH_TH) brush.y = max(brush.y - canvas.STEP, brush.R);
if (vert < joystick.LOW_TH) brush.y = min(brush.y + canvas.STEP, canvas.MAX_Y - brush.R);
if (horz > joystick.HIGH_TH) brush.x = max(brush.x - canvas.STEP, brush.R);
if (horz < joystick.LOW_TH) brush.x = min(brush.x + canvas.STEP, canvas.MAX_X - brush.R);
}
void setup() {
display.begin();
display.setRotation(1);
display.fillScreen(brush.BG);
canvas.MAX_X = display.width() - brush.R;
canvas.MAX_Y = display.height() - brush.R;
brush.x = canvas.MAX_X / 2;
brush.y = canvas.MAX_Y / 2;
pinMode(JOY_X, INPUT);
pinMode(JOY_Y, INPUT);
pinMode(SWITCH, INPUT_PULLUP);
draw(brush, display, true);
}
void loop() {
updateCoords(brush, joystick, canvas, analogRead(JOY_X), analogRead(JOY_Y));
draw(brush, display, digitalRead(SWITCH));
delay(100);
}