const int rows = 4; // Satır sayısı
const int cols = 4; // Sütun sayısı
const int rowPins[rows] = {14, 15, 16, 17};
const int colPins[cols] = {8, 9, 10, 11};
int currentX = 0; // Şu anki X pozisyonu
int currentY = 0; // Şu anki Y pozisyonu
bool direction = true; // True: İleri, False: Geri
bool atEncoderLimit = false; // Enkoder sınırı kontrolü
bool matrix[rows][cols] = { // 4x4 LED matrisinin başlangıç durumu
{LOW, LOW, LOW, LOW},
{LOW, LOW, LOW, LOW},
{LOW, LOW, LOW, LOW},
{LOW, LOW, LOW, LOW}
};
const int encoderButtonPin = 4;
const int encoderPinA = 2;
const int encoderPinB = 3;
int encoderPinAState = LOW;
int encoderPinALast = LOW;
int encoderPinBState = LOW;
void setup() {
for (int i = 0; i < rows; i++) {
pinMode(rowPins[i], OUTPUT);
}
for (int i = 0; i < cols; i++) {
pinMode(colPins[i], OUTPUT);
}
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(encoderButtonPin, INPUT_PULLUP);
Serial.begin(9600);
drawMatrix(); // Matrisi çiz
}
void setPixel(int x, int y) {
matrix[y][x] = HIGH; // İlgili pikseli aç
drawMatrix(); // Matrisi güncelle
}
void clearPixel(int x, int y) {
matrix[y][x] = LOW; // İlgili pikseli kapat
drawMatrix(); // Matrisi güncelle
}
void drawMatrix() {
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
digitalWrite(rowPins[row], LOW);
digitalWrite(colPins[col], matrix[row][col]);
delay(1); // Görsel netlik için kısa bir gecikme ekleyebilirsiniz
digitalWrite(colPins[col], LOW);
digitalWrite(rowPins[row], HIGH);
}
}
}
void loop() {
encoderPinAState = digitalRead(encoderPinA);
encoderPinBState = digitalRead(encoderPinB);
if (encoderPinAState != encoderPinALast) {
if (!atEncoderLimit) {
if (encoderPinBState != encoderPinAState) {
if (direction) {
clearPixel(currentX, currentY);
currentX++;
if (currentX >= cols) {
currentX = cols - 1;
direction = !direction;
currentY++;
if (currentY >= rows) {
currentY = 0;
atEncoderLimit = true;
}
}
setPixel(currentX, currentY);
} else {
clearPixel(currentX, currentY);
currentX--;
if (currentX < 0) {
currentX = 0;
direction = !direction;
currentY++;
if (currentY >= rows) {
currentY = 0;
atEncoderLimit = true;
}
}
setPixel(currentX, currentY);
}
}
} else {
// Enkoder sınırına ulaşıldığında burada ek işlem yapabilirsiniz
// Bu durumda mevcut LED yanık kalmaya devam eder
clearPixel(currentX, currentY); // Mevcut LED'i temizleme
setPixel(currentX, currentY); // Mevcut LED'i tekrar aydınlatma
}
}
if (digitalRead(encoderButtonPin) == LOW) {
atEncoderLimit = false; // Enkoder sınırını sıfırla
// Enkoder butonuna basıldığında hareket yönünü değiştir
direction = !direction;
}
encoderPinALast = encoderPinAState;
}