#include <FastLED.h>
#define LED_PIN 3
#define NUM_LEDS 256
#define MATRIX_WIDTH 16
#define MATRIX_HEIGHT 16
CRGB leds[NUM_LEDS];
// Пины кнопок
#define BUTTON_UP 4
#define BUTTON_DOWN 5
#define BUTTON_LEFT 6
#define BUTTON_RIGHT 7
// Переменные для кнопок
int lastStateUp = HIGH;
int lastStateDown = HIGH;
int lastStateLeft = HIGH;
int lastStateRight = HIGH;
int currentStateUp;
int currentStateDown;
int currentStateLeft;
int currentStateRight;
unsigned long lastDebounceTimeUp = 0;
unsigned long lastDebounceTimeDown = 0;
unsigned long lastDebounceTimeLeft = 0;
unsigned long lastDebounceTimeRight = 0;
const unsigned long debounceDelay = 50; // Задержка устранения дребезга
// Текущее положение точки
int posX = MATRIX_WIDTH / 2;
int posY = MATRIX_HEIGHT / 2;
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.clear();
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_LEFT, INPUT_PULLUP);
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
// Рисуем начальную точку
drawDot(posX, posY, CRGB::Red);
FastLED.show();
Serial.begin(9600); // Для отладки
shiftLEDsRight();
}
void loop() {
// Проверка кнопки вверх
if (debouncedButton(BUTTON_UP, lastStateUp, currentStateUp, lastDebounceTimeUp)) {
moveDot(0, 1); // Вверх
}
// Проверка кнопки вниз
if (debouncedButton(BUTTON_DOWN, lastStateDown, currentStateDown, lastDebounceTimeDown)) {
moveDot(0, -1); // Вниз
}
// Проверка кнопки влево
if (debouncedButton(BUTTON_LEFT, lastStateLeft, currentStateLeft, lastDebounceTimeLeft)) {
moveDot(-1, 0); // Влево
}
// Проверка кнопки вправо
if (debouncedButton(BUTTON_RIGHT, lastStateRight, currentStateRight, lastDebounceTimeRight)) {
moveDot(1, 0); // Вправо
}
FastLED.show();
}
// Функция устранения дребезга для кнопки
bool debouncedButton(int buttonPin, int &lastState, int ¤tState, unsigned long &lastDebounceTime) {
int reading = digitalRead(buttonPin);
// Проверка изменения состояния
if (reading != lastState) {
lastDebounceTime = millis(); // Сброс таймера
}
// Если прошло достаточно времени с момента изменения состояния
if ((millis() - lastDebounceTime) > debounceDelay) {
// Если состояние изменилось
if (reading != currentState) {
currentState = reading;
// Если кнопка нажата
if (currentState == LOW) {
return true;
}
}
}
// Обновляем предыдущее состояние
lastState = reading;
return false;
}
// Функция для перемещения точки
void moveDot(int dx, int dy) {
// Очищаем текущую точку
drawDot(posX, posY, CRGB::Black);
// Обновляем положение точки
posX += dx;
posY += dy;
// Ограничиваем движение в пределах матрицы
posX = constrain(posX, 0, MATRIX_WIDTH - 1);
posY = constrain(posY, 0, MATRIX_HEIGHT - 1);
// Рисуем новую точку
drawDot(posX, posY, CRGB::Red);
// Отладка
Serial.print("posX: ");
Serial.print(posX);
Serial.print(" posY: ");
Serial.println(posY);
}
// Функция для рисования точки
void drawDot(int x, int y, CRGB color) {
int index = x + y * MATRIX_WIDTH;
leds[index] = color;
}
void shiftLEDsRight()
{
for(int i = 0; i < NUM_LEDS; i++)
{
leds[i] =CRGB::Blue;
}
FastLED.show();
}