/*
Forum: https://forum.arduino.cc/t/arduino-nano-projekt-led-array-und-tastersteuerung-fur-magisches-quadrat-funktionieren-nicht-wie-erwartet/1312361
Wokwi: https://wokwi.com/projects/412017639012413441
Original:
Wokwi: https://wokwi.com/projects/412016357755096065
Teilweise modifizierter Sketch, jedoch immer noch viel Raum für Verbesserungen!
ec2021
*/
// LED-Pins
const byte ledPins[3][3] = {
{2, 3, 4},
{5, 6, 7},
{8, 9, 10}
};
// Taster-Pins
const byte tasterUntenPin = 11;
const byte tasterRechtsPin = 12;
const byte tasterSpeichernPin = 13;
const byte tasterResetPin = A0;
// RGB-LED-Pins
const byte pinRot = A1;
const byte pinGruen = A2;
const byte pinBlau = A3;
// 3x3 Array für das magische Quadrat
byte quadrat[3][3];
// Zahlen für das magische Quadrat
byte zahlen[9] = {5, 47, 17, 29, 71, 89, 59, 113, 101};
byte aktuelleZahl = 0;
// Startposition
byte posX = 0, posY = 0;
const unsigned long SLOW = 300;
const unsigned long QUICK = 150;
unsigned long lastBlink = 0;
byte blinkState = HIGH;
class Taster {
private:
byte pin;
byte state;
byte lastState = HIGH;
unsigned long lastChange = 0;
public:
Taster(byte aPin) {
pin = aPin;
pinMode(pin, INPUT_PULLUP);
}
boolean pressed() {
byte actState = digitalRead(pin);
if (actState != lastState) {
lastChange = millis();
lastState = actState;
}
if (state != actState && millis() - lastChange > 30) {
state = actState;
return (state == LOW);
}
return false;
}
};
Taster tasterUnten(tasterUntenPin);
Taster tasterRechts(tasterRechtsPin);
Taster tasterReset(tasterResetPin);
Taster tasterSpeichern(tasterSpeichernPin);
void setup() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
pinMode(ledPins[i][j], OUTPUT);
digitalWrite(ledPins[i][j], LOW);
}
}
pinMode(pinRot, OUTPUT);
pinMode(pinGruen, OUTPUT);
pinMode(pinBlau, OUTPUT);
resetSpiel();
}
void loop() {
if (tasterUnten.pressed()) {
bewegeUnten();
}
if (tasterRechts.pressed()) {
bewegeRechts();
}
if (tasterSpeichern.pressed()) {
speichereZahl();
}
if (tasterReset.pressed()) {
resetSpiel();
}
blinken();
}
void blinken() {
if (aktuelleZahl >= 9) {
return;
}
unsigned long interval = (quadrat[posX][posY] == 0) ? SLOW : QUICK;
if (millis() - lastBlink > interval) {
digitalWrite(ledPins[posX][posY], blinkState);
lastBlink = millis();
blinkState = !blinkState;
}
}
void bewegeUnten() {
digitalWrite(ledPins[posX][posY], (quadrat[posX][posY] == 0) ? LOW : HIGH);
posX = (posX + 1) % 3;
lastBlink = 0;
}
void bewegeRechts() {
digitalWrite(ledPins[posX][posY], (quadrat[posX][posY] == 0) ? LOW : HIGH);
posY = (posY + 1) % 3;
lastBlink = 0;
}
void speichereZahl() {
if (quadrat[posX][posY] == 0) {
quadrat[posX][posY] = zahlen[aktuelleZahl];
aktuelleZahl++;
digitalWrite(ledPins[posX][posY], HIGH);
}
sucheNaechstePosition();
}
void sucheNaechstePosition() {
byte startX = posX;
byte startY = posY;
byte count = 0;
while (quadrat[startX][startY] != 0 && count < 9) {
count++;
startY++;
if (startY > 2 ) {
startY = 0;
startX = startX + 1;
if (startX > 2) {
startX = 0;
}
}
}
if (count < 9) {
digitalWrite(ledPins[posX][posY], (quadrat[posX][posY] == 0) ? LOW : HIGH);
posX = startX;
posY = startY;
digitalWrite(ledPins[posX][posY], HIGH);
} else {
signalRot();
}
}
void resetSpiel() {
aktuelleZahl = 0;
posX = 0;
posY = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
quadrat[i][j] = 0;
digitalWrite(ledPins[i][j], LOW);
}
}
signalGruen();
}
void signalRot() {
setRGB(HIGH, LOW, LOW);
}
void signalGruen() {
setRGB(LOW, HIGH, LOW);
}
void setRGB(byte r, byte g, byte b) {
digitalWrite(pinRot, r);
digitalWrite(pinGruen, g);
digitalWrite(pinBlau, b);
}