INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LED Zustand abfragen
13.10.2016, 22:03
Beitrag #9
RE: LED Zustand abfragen
(13.10.2016 20:49)Nafetz schrieb:  Hallo zusammen,
ich bin neu hier und hab im Forum bis jetzt nichts gefunden was mir weiter hilft ich hoffe ihr könnt es Smile

Ich habe mir eine 12x12 Led-Matrix mit einem WS2812B Led-Streifen aufgebaut.
Damit habe ich mir bis jetzt 4-Gewinnt programmiert, klappt auch alles so weit.
Was ich noch nicht geschafft habe ist es zu prüfen wann 4 Leds der selben Farbe nebeneinander oder wie auch immer leuchten.
Meine Frage, gibt es einen Befehl mit dem man an einer Position der Matrix abfragen kann in welcher Farbe die Led gerade leuchtet.
Ich habe es mit der Adafruit NeoMatrix Bibliothek programmiert.

Vielen Danke für alle Tipps Wink Rolleyes
Hast Du die Zustände der einzelnen LED im Arduino irgendwo gespeichert?
Ansonsten baue Dir ein 12x12 Array auf, in dem Du die Farben der LED einträgst (Da du wahrscheinlich weniger als 256 Farben hast, genügt der Datentyp byte).

Ohne Sketch ist das alles immer Kaffeesatzlesen.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.10.2016, 22:09 (Dieser Beitrag wurde zuletzt bearbeitet: 13.10.2016 22:37 von Bitklopfer.)
Beitrag #10
RE: LED Zustand abfragen
Danke für eure Antworten Smile
ein Array scheint sinnvoll. Allerdings bin ich damit leider noch nicht so vertraut befasse mich erst seit ca. 1 - 2 Monaten mit dem Arduino und auch der Programmierung.

Hier der bisherige Sketch: (wobei der Array Position nur ein Versuch war der keine Auswirkung hat Blush )

Code:
//USB Library integrieren

#include <XBOXUSB.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

USB Usb;
XBOXUSB Xbox(&Usb);
#include <Wire.h>

//MATRIX Library integrieren

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
#define PSTR // Make Arduino Due happy
#endif

#define PIN 6

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(12, 12, 6,
  NEO_MATRIX_BOTTOM     + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);


int x = 4;
int y = 3;
int Reihe1 = 10;
int Reihe2 = 10;
int Reihe3 = 10;
int Reihe4 = 10;
int Reihe5 = 10;
int Reihe6 = 10;
int Reihe7 = 10;

int Player = 0;

//Farb Variablen
int r = 200;
int g = 0;
int b = 0;
//Gewinner Pruefen
int senkrecht = 0;

void setup() {
Serial.begin(9600);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(80);   //Helligkeit einstellen


//Spielfeld anlegen
matrix.drawRect(0,4,9,8,matrix.Color(0,0,200)); // (Start x,Start y, Länge x, Länge y, Farbe)


//Für USB
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
}
[b]byte Position[12][12] = {
  {0,0,0,0,0,0,0,0,0,0,1,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0}
};[/b]


void loop() {
  Usb.Task();

//Spiel zurueck setzen
if (Xbox.getButtonClick(START))
{
matrix.fillRect(1,5,7,6,matrix.Color(0,0,0));
matrix.drawLine(0,3,8,3,matrix.Color(0,0,0));
x = 4;
y = 3;
Reihe1 = 10;
Reihe2 = 10;
Reihe3 = 10;
Reihe4 = 10;
Reihe5 = 10;
Reihe6 = 10;
Reihe7 = 10;
Player = 0;
r = 200;
g = 0;
b = 0;
  matrix.show();
}

//Start
matrix.drawPixel(x,y,matrix.Color(r,g,b));
matrix.show();


//Bewegung Links / Rechts

if (x>1 && (Xbox.getButtonClick(LEFT)) )
  {
    Serial.println(F("Left"));
    x = x - 1;
    matrix.drawPixel(x,y,matrix.Color(r,g,b)); //Neuen Pixel Anzeigen
     matrix.drawPixel(x+1,y,matrix.Color(0,0,0)); //Alten Pixel Löschen
    matrix.show();
  }

if ( x<7 && (Xbox.getButtonClick(RIGHT)))
  {
    Serial.println(F("Right"));
    x = x + 1;
    matrix.drawPixel(x,y,matrix.Color(r,g,b));
     matrix.drawPixel(x-1,y,matrix.Color(0,0,0));
    matrix.show();
  }

//Steine Fallen lassen

if (x == 1 && (Reihe1>4) && (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe1,matrix.Color(r,g,b));
  Reihe1 = Reihe1 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
  if (x == 2 && Reihe2>4 && (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe2,matrix.Color(r,g,b));
  Reihe2 = Reihe2 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
if (x == 3 && Reihe3>4 &&  (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe3,matrix.Color(r,g,b));
  Reihe3 = Reihe3 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
if (x == 4 && Reihe4>4 &&  (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe4,matrix.Color(r,g,b));
  Reihe4 = Reihe4 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
if (x == 5 && Reihe5>4 &&  (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe5,matrix.Color(r,g,b));
  Reihe5 = Reihe5 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
if (x == 6 && Reihe6>4 &&  (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe6,matrix.Color(r,g,b));
  Reihe6 = Reihe6 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
if (x == 7 && Reihe7>4 &&  (Xbox.getButtonClick(A)))
{
  matrix.drawPixel(x,Reihe7,matrix.Color(r,g,b));
  Reihe7 = Reihe7 -1;
  matrix.show();
  if (Player == 0)
  {
    Player = 1;
    r = 0;
    g = 200;
    b=0;
  }
  else{
    Player = 0;
    r = 200;
    g = 0;
    b=0;
  }
}
...es ist immer von Vorteil für die lesende Gemeinde den Code in Code Tags zu setzen... siehe oben im Menü als "#" ...dann ergibt sich das.... Close Tags nicht vergessen...
lgbk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.10.2016, 22:20
Beitrag #11
RE: LED Zustand abfragen
Der Code ist unformatiert schwer lesbar, deshalb habe ich ihn nicht tiefer durchforstet..
Entweder es gibt in der Matrix auch Funktionen, wo Du den Zustand einer Zelle abfragen kannst oder Du nutzt Dein vorhandenenes 12x12 Array und trägst immer eine Zahl für den Farbwert ein.

Wenn Du z.B. 16 Farben hast, dann 0 bis 15. Und immer da, wo Du einen Punkt setzt, setzt Du auch den Farbwert in das Array.
Das kannst Du dann auswerten.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2016, 11:32 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2016 11:37 von StephanBuerger.)
Beitrag #12
RE: LED Zustand abfragen
Hallo,

eine kurze Idee zu dem Array:
Ich würde kein zweidimensionales Array mit 12x12 sondern eines von 0-143 (nenne ich mal matrix) verwenden. Jetzt kannst Du relativ einfach rechnen.

Horizonalte prüfung
Das erste Feld einer Zeile ist immer 0 x zeilennummer (erste zeile hat die Nummer 0). Somit kannst Du einfach prüfen ob vier felder neben einander belegt sind. (z.B. in Reihe 3 die Felder 3,4,5,6) =

2 x 12 = 24
Also von 24+3 bis 24+6 = 27-30 belegt.

Vertikal:
Jedes Feld oberhalb ist genau 12 positionen weiter in der Matrix als das akutuelle.

Diagonal:
Jedes Feld links oberhalb ist genau 11 Positionen weiter
Jedes Feld rechts oberhalb it genau 13 Positionen weiter.

P.S.: Natürlich müssen die Ränder bedacht werden bei der Prüfung. z.B. Feld 23 (zweite Reihe ganz rechts) hat kein Feld rechts oder rechts oben.

Gruß
Stephan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2016, 11:34 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2016 12:02 von Nafetz.)
Beitrag #13
RE: LED Zustand abfragen
Danke Tommy 56 für deine Antwort.
Ich habe mich jetz ein wenig mit den Array auseinandergesetzt und die Abfrage ob vier Leds der selben Farbe nebeneinander leuchten funktioniert Smile
Ich habe es jetzt allerding nur für die unterste Zeile realisiert. Theoretisch müsste ich die if Anweisung jetzt für jede einzelne der 6 Zeilen überprüfen was mir nicht so wirklich gefällt.
Mein gedanke ist, ich würde gern von dort aus wo der Letzte Wert des Arrays geändert wurde eine Prüfung in alle Richtungen ausführen. Ist es möglich abzufragen welcher Wert in meinem 12x12 Array zuletzt geändert wurde, damit ich von dort aus dann eine Abfrage starten kann? Huh
(Ich habe es so gestaltet,dass wenn die Rote Led angeht der Array Wert auf 1 und wenn die grüne Led angeht der Wert auf 2 gesetzt wird.)

Danke auch an deinen Tipp Stephan.
Allerdings komm ich da persönlich gerade etwas an meine Grenzen dass nachzuvollziehen Blush bzw. es umzusetzen. Ich werde mich aber noch einmal damit auseinandersetzen.
Anbei 2 Bilder um den jetzigen Stand vllt etwas besser nachvollziehen zu können Smile
(Hoffe es klappt Confused)

   

   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2016, 12:28 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2016 14:07 von Tommy56.)
Beitrag #14
RE: LED Zustand abfragen
(14.10.2016 11:34)Nafetz schrieb:  Danke Tommy 56 für deine Antwort.
Ich habe mich jetz ein wenig mit den Array auseinandergesetzt und die Abfrage ob vier Leds der selben Farbe nebeneinander leuchten funktioniert Smile
Ich habe es jetzt allerding nur für die unterste Zeile realisiert. Theoretisch müsste ich die if Anweisung jetzt für jede einzelne der 6 Zeilen überprüfen was mir nicht so wirklich gefällt.
Mein gedanke ist, ich würde gern von dort aus wo der Letzte Wert des Arrays geändert wurde eine Prüfung in alle Richtungen ausführen. Ist es möglich abzufragen welcher Wert in meinem 12x12 Array zuletzt geändert wurde, damit ich von dort aus dann eine Abfrage starten kann? Huh
(Ich habe es so gestaltet,dass wenn die Rote Led angeht der Array Wert auf 1 und wenn die grüne Led angeht der Wert auf 2 gesetzt wird.)

Danke auch an deinen Tipp Stephan.
Allerdings komm ich da persönlich gerade etwas an meine Grenzen dass nachzuvollziehen Blush bzw. es umzusetzen. Ich werde mich aber noch einmal damit auseinandersetzen.
Anbei 2 Bilder um den jetzigen Stand vllt etwas besser nachvollziehen zu können Smile
(Hoffe es klappt Confused)

Du brauchst doch das Array nicht abzufragen was Du zuletzt geändert hast. Das weißt Du doch, weil Du es gerade geändert hast.
Du brauchst auch nicht 13 if sondern kannst das in einer FOR-Schleife prüfen, die Du über die 4 Edit: 3 möglichen Nachbarn pro Richtung laufen lässt und raus gehst, wenn die Farbe nicht stimmt.
Die Variante von Stephan hat auch ihre Vorteile.
Mal Dir mal beide Varianten auf, das erleichtert das Verständnis.

Gruß Tommy

Ich habe Dir mal eine mögliche Auswertung des Arrays gebaut. Sie ist hoffentlich verständlich.
Experimentiere damit herum, baue bei Bedarf noch Ausgaben ein, so dass Du sie verstehst.
Code:
// Spielfeld
byte feld [12][12] = {
   //0 1 2 3 4 5 6 7 8 9 10 11 X
    {0,1,1,1,1,0,0,2,2,2,0,0}, // 0
    {0,0,1,0,0,0,0,0,0,0,0,0}, // 1
    {0,0,1,0,0,0,0,0,0,0,0,0}, // 2
    {0,0,1,0,0,0,0,0,0,0,0,0}, // 3
    {0,0,0,0,0,0,0,0,0,0,0,0}, // 4
    {0,0,0,0,0,0,0,0,0,0,0,0}, // 5
    {0,0,0,0,0,0,0,0,0,0,0,0}, // 6
    {0,0,0,0,0,0,0,0,0,0,0,0}, // 7
    {0,0,1,0,0,0,0,0,0,0,0,0}, // 8
    {0,0,1,0,0,2,2,2,2,1,0,0}, // 9
    {0,0,1,0,0,0,0,2,0,0,0,0}, // 10
    {0,0,1,0,0,0,0,2,0,0,0,0}  // 11 Y
};

// Prüft, ob 4 gleiche Farben in einer Reihe nebeneinander sind.
// Ausgangspunkt ist der zuletzt gesetzte Punkt
boolean is4(const byte x, const byte y) {
byte wert;
boolean found;
    // Achtung Zugriff [Y][X]
    wert = feld[y][x];
    if (wert == 0) {
        Serial.println("nicht gesetzt");
        return false;
    }
    Serial.print("X: ");Serial.print(x);
    Serial.print(" Y: ");Serial.print(y);
    Serial.print(" Wert: ");Serial.print(wert);
    found = true;
    // immer die 3 Nachbarn prüfen (der eigene Wert ist ja bekannt
    // nach rechts
    if (x >= 9) {
        // da passen keine 4 mehr hin
        found = false;
    }
    else {
        for(byte i = 1;i <= 3; i++) {
            if (feld[y][x+i] != wert) {
                found = false;
                break;
            }
        }
    }
    if (found) {
        Serial.println(" rechts gefunden");
        // fertig und raus
        return found;
    }
    // nach links
    found = true;
    if (x <= 2) {
        // da passen keine 4 mehr hin
        found = false;
    }
    else {
        for(byte i = 1;i <=3; i++) {
            if (feld[y][x-i] != wert) {
                found = false;
                break;
            }
        }
    }
    if (found) {
        Serial.println(" links gefunden");
        // fertig und raus
        return found;
    }
    // nach oben
    found = true;
    if (y <= 2) {
        // da passen keine 4 mehr hin
        found = false;
    }
    else {
        for(byte i = 1;i <= 3; i++) {
            if (feld[y-i][x] != wert) {
                found = false;
                break;
            }
         }
    }
    if (found) {
        Serial.println(" oben gefunden");
        // fertig und raus
        return found;
    }
    // nach unten
    found = true;
    if (y >= 9) {
         // da passen keine 4 mehr hin
         found = false;
    }
    else {
        for(byte i = 1;i <=3 ; i++) {
            if (feld[y+i][x] != wert) {
                found = false;
                break;
            }
        }
    }
    if (found) {
        Serial.println(" unten gefunden");
        // fertig und raus
        return found;
    }
    Serial.println(" nichts gefunden");
    return found;
}

void setup() {
boolean ok;
    Serial.begin(9600);
    Serial.println("Start");
    ok = is4(1,0);
    ok = is4(4,0);
    ok = is4(7,9);
    ok = is4(2,3);
    ok = is4(2,8);
}

void loop() {
  
}

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2016, 16:17 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2016 16:19 von Nafetz.)
Beitrag #15
RE: LED Zustand abfragen
Vielen dank für den Sketch Tommy.
was ich gerade nicht verstehe ist warum der Teil mit den If anweisungen und der Abfrage nicht im Loop-Teil sitzt sondern noch vor dem Setup könntest du mir das erklären? Ich versuche gerade damit rumzuspielen und ihn genau zu verstehen Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2016, 16:34
Beitrag #16
RE: LED Zustand abfragen
(14.10.2016 16:17)Nafetz schrieb:  Vielen dank für den Sketch Tommy.
was ich gerade nicht verstehe ist warum der Teil mit den If anweisungen und der Abfrage nicht im Loop-Teil sitzt sondern noch vor dem Setup könntest du mir das erklären? Ich versuche gerade damit rumzuspielen und ihn genau zu verstehen Smile

Bei Dir wird er in den Loop rein kommen, immer dann wenn Du das Array geschrieben hast.

Zum Testen ist es im Setup einfacher, ich will ja nur ein Mal sehen, was z.B. bei is4(1,0); raus kommt und nicht laufend in jedem Loopdurchlauf.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Byte Shiften und Bit abfragen.... comfan 4 203 02.09.2016 20:30
Letzter Beitrag: comfan
  Taster abfragen Rudi 3 688 25.02.2016 14:03
Letzter Beitrag: hotsystems
  Ein- u. Ausgänge abfragen magifix 0 389 07.01.2016 16:50
Letzter Beitrag: magifix
  Webserver abfragen mit einem Programm arduinofan 2 729 28.11.2015 15:54
Letzter Beitrag: arduinofan
  Guthaben einer Prepaid Karte abfragen DickerPauli 0 836 03.05.2015 16:02
Letzter Beitrag: DickerPauli
  Aktuellen zustand eines relais auslesen Keith 7 1.151 23.02.2015 23:16
Letzter Beitrag: Foto-Ralf
  gelöst - mehrere Wechselschalter abfragen Foto-Ralf 3 1.181 30.01.2015 22:55
Letzter Beitrag: Foto-Ralf
  mehrere Taster abfragen DL1AKP 8 8.577 04.11.2014 18:13
Letzter Beitrag: Corvus
  Taster abfragen basst_scho 6 1.647 21.10.2014 08:45
Letzter Beitrag: Stefan
  TFT_Extension, wie Button abfragen? alpenpower 0 962 17.09.2014 17:23
Letzter Beitrag: alpenpower

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste