Neopixel Farbe zuweisen bei Tastendruck

Guten Morgen

Die Beispiele in der IDE bringen mich nicht auf den springenden Punkt.
Dort geht es immer nur um Farbwechsel und nicht gezielte Ansteuerung einzelner Pixel.
Genau das benötige ich aber, da ich sie wie ein Keypad verwenden möchte.
Ich möchte nämlich folgendes erreichen:
if pixels.setPixelColor(0, pixels.Color(0,255,255)); gedrückt wird, dann set auf (255,255,255);
und wenn dann dieser Pixel erneut gedrückt wird, wieder die urpsüngliche Farbe, also (0,255,255).

Wie fange ich denn am besten erst einmal an, das sich überhaupt die Farbe 1x auf ausgewählte Farbe ändert? Kann mir jemand Hilfestellung geben?

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause=100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] = {            // The symbols of the keys
  {'1', '2', '3', '4', '5'},
  {'6', '7', '8', '9', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

SimpleKeypad kp1((char*)key_chars, rowPins, colPins, nb_rows, nb_cols);   // New keypad called kp1

void setup() {
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
}

void loop() {
  char key = kp1.getKey();                      // The getKey function scans the keypad every 10 ms and returns a key only one time, when you start pressing it
  if (key) {                                    // If getKey returned any key
    Serial.println(key);                        // it is printed on the serial monitor

pixels.setPixelColor(0, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.   
pixels.setPixelColor(9, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(10, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(19, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.

pixels.setPixelColor(1, pixels.Color(255,255,0));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(8, pixels.Color(255,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(11, pixels.Color(255,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(18, pixels.Color(0,255,0));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.

pixels.setPixelColor(2, pixels.Color(255,255,255)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(7, pixels.Color(0,255,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(12, pixels.Color(0,255,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(17, pixels.Color(0,255,255)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.

pixels.setPixelColor(3, pixels.Color(0,0,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(6, pixels.Color(0,0,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert. 
pixels.setPixelColor(13, pixels.Color(0,0,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(16, pixels.Color(0,0,0)); //
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.

pixels.setPixelColor(4, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(5, pixels.Color(255,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.    
pixels.setPixelColor(14, pixels.Color(255,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.
pixels.setPixelColor(15, pixels.Color(0,255,255));
pixels.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, in dieser Zeit wird nichts verändert.

  }
}

Wie wäre es mit

if (key == 'A') pixels.setPixelColor(0,pixels.Color(255,255,255));
else pixels.setPixelColor(0,pixels.Color(0,255,255));
1 Like

Wow
Werde mich gleich mal dran setzen und gucken. Vielen Dank!

Etwas läuft noch nicht rund dabei. Denn beim betätigen der besagten Taste verändert sich zwar die Farbe, sie schaltet aber nicht bei erneutem Druck wieder um. Zudem scheint es eine sehr lange verzögerung zu geben.

Also wenn ich Taste in blau drücke, bleibt sie blau bis ich eine andere Taste drücke. Dann wird sie in die definierte Farbe umgestellt. Drücke ich dann diese Taste erneut, wird sie in die davor definierte Farbe gestellt. Die Richtung ist aber schon 10x besser als das was ich vorher hatte :slight_smile:

Du könntest mal dies probieren:

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] = {            // The symbols of the keys
  {'1', '2', '3', '4', '5'},
  {'6', '7', '8', '9', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

SimpleKeypad kp1((char*)key_chars, rowPins, colPins, nb_rows, nb_cols);   // New keypad called kp1

void setup() {
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
  pixels.show();
}

void loop() {
  char key = kp1.getKey();                      // The getKey function scans the keypad every 10 ms and returns a key only one time, when you start pressing it
  if (key) {                                    // If getKey returned any key
    Serial.println(key);
    for (byte j = 0; j < NUMPIXELS; j++) {
      pixels.setPixelColor(j, pixels.Color(0, 0, 0));
    }
    for (byte r = 0; r < nb_rows; r++) {
      for (byte c = 0; c < nb_cols; c++) {
        if ( key == key_chars[r][c] ) {
          pixels.setPixelColor((r * nb_cols + c), pixels.Color(0, 25, 25));
        }
      }
    }
    pixels.show(); // Durchführen der Pixel-Ansteuerung
  }
}

Getestet mit Keypad.h.

1 Like

Das muss so wohl aussehen:

        if (pixels.getPixelColor(0) != pixels.Color(0, 255, 255))
        {
          pixels.setPixelColor(0, pixels.Color(0, 255, 255));
        }
        else
        {
          pixels.setPixelColor(0, pixels.Color(255, 255, 255));
        }

Aber: Das geht nur, wenn Du darauf achtest, das das keypad auch losgelassen wurde.
Und dann ist die Frage: Du hast in Deinem Code oben alle Pixel dran und dazwischen immer ein delay etc...
Soll das so werden, das Du auf Taste 1 z.B. mit Pixel 0, Taste 2 mit Pixel 9 u.s.w reagierst?

1 Like

Zunächst vielen Dank für eure Hilfe.
Der Sketch von Agmue ist ganz anders. Es bleibt alles dunkel, und wenn ich eine Taste drücke, wird irgendwo auf dem Pad eine andere hell.

Der delay war in dem Sketch bereits eingebaut. Ich habe ihn nur auf meine Farben und Tasten umgebaut. So habe ich die Tasten so leuchten lassen, wie ich das gerne hätte. 1. Reihe blau, 2.gemischt, 3. gemischt, 4. bleibt aus usw
Daher ja, Taste 1 steuert Pixel 0 usw :slight_smile:

Möchtest mal probieren? Ist jetzt nur bis Taste 5 - aber vielleicht gehts ja.

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] =              // The symbols of the keys
{
  {'1', '2', '3', '4', '5'},
  {'6', '7', '8', '9', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

SimpleKeypad kp1((char *)key_chars, rowPins, colPins, nb_rows, nb_cols);  // New keypad called kp1

void setup()
{
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
}

void loop()
{
  static char lastKey = "";
  char key = kp1.getKey();                      // The getKey function scans the keypad every 10 ms and returns a key only one time, when you start pressing it
  if (key != lastKey)                                      // If getKey returned any key
  {
    Serial.println(key);                        // it is printed on the serial monitor
    lastKey = key;
    switch (key)
    {
      case '1':
        if (pixels.getPixelColor(0) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(0, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(0, pixels.Color(255, 255, 255));}
        break;
      case '2':
        if (pixels.getPixelColor(9) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(9, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(9, pixels.Color(255, 255, 255));}
        break;
      case '3':
        if (pixels.getPixelColor(10) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(10, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(10, pixels.Color(255, 255, 255));}
        break;
      case '4':
        if (pixels.getPixelColor(19) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(19, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(19, pixels.Color(255, 255, 255));}
        break;
      case '5':
        if (pixels.getPixelColor(1) != pixels.Color(255, 255, 0))
        {   pixels.setPixelColor(1, pixels.Color(255, 255, 0)); }
        else
        {   pixels.setPixelColor(1, pixels.Color(0, 255, 255));}
        break;
    }
    pixels.show(); // Durchführen der Pixel-Ansteuerung
    delay (pause); // Pause, in dieser Zeit wird nichts verändert.
  }
}
// Ausgelagert:
/*

        pixels.setPixelColor(1, pixels.Color(255, 255, 0));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(8, pixels.Color(255, 255, 255));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(11, pixels.Color(255, 255, 255));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(18, pixels.Color(0, 255, 0));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(2, pixels.Color(255, 255, 255)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(7, pixels.Color(0, 255, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(12, pixels.Color(0, 255, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(17, pixels.Color(0, 255, 255)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(3, pixels.Color(0, 0, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(6, pixels.Color(0, 0, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(13, pixels.Color(0, 0, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(16, pixels.Color(0, 0, 0)); //
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(4, pixels.Color(0, 255, 255));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(5, pixels.Color(255, 255, 255));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(14, pixels.Color(255, 255, 255));
        pixels.show(); // Durchführen der Pixel-Ansteuerung
        delay (pause); // Pause, in dieser Zeit wird nichts verändert.
        pixels.setPixelColor(15, pixels.Color(0, 255, 255));
*/
1 Like

Das ist ja nett. Ich hatte deinen Code bereits getestet und die Taste schaltet sofort um, wenn auch noch träge. Liegt vermutlich an dem Kram der davor geschrieben war. Ich mache das mal eben zu ende.
Also ganz zum Schluss 1x pixels.show und delay

liegt bestimmt daran oder?

Es funktioniert! Sogar flott. Allerdings hast du Case 1, Case 2 etc benannt.
In meinem Fall muss es wie folgt lauten:

case '1':
if (pixels.getPixelColor(0) != pixels.Color(0, 255, 255))
{ pixels.setPixelColor(0, pixels.Color(0, 255, 255)); }
else
{ pixels.setPixelColor(0, pixels.Color(255, 255, 255));}
break;
case '6':
if (pixels.getPixelColor(9) != pixels.Color(0, 255, 255))
{ pixels.setPixelColor(9, pixels.Color(0, 255, 255)); }
else
{ pixels.setPixelColor(9, pixels.Color(255, 255, 255));}
break;

sonst muss man Taste 2 drücken um 6 auszuschalten :smiley:
mega wirklich vielen Danke das hätte ich nicht alleine hin bekommen

Ich hatte ja nur ne Ahnung, was Du willst..
Würde das delay() jetzt noch elemenieren.
Na dann mal schaun...

Bitte gerne :slightly_smiling_face:

So hatte ich Dich verstanden, war dann wohl nix :roll_eyes:

Macht alles nichts. Dadurch habe ich das mit den Tasten und dessen Möglichkeiten für mich logisch viel besser nachvollziehen können.

Eine Sache hätte ich noch:

Gibt es die Möglichkeit, das sich die Tasten nicht immer resetten, nachdem man den Arduino ausgesteckt hat? Sprich, beim einstecken ist alles dunkel :slight_smile:

Ja.
wenn Du ausprobierst, ob das geht:

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] =              // The symbols of the keys
{
  {1, 2, 3, 4, 5},
  {6, 7, 8, 9, 10},
  {11, 12, 13, 14, 15},
  {16, 17, 18, 19, 20}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

uint32_t pinColor[] =
{
  pixels.Color(0, 255, 255), pixels.Color(255, 255, 0), pixels.Color(0, 255, 0), pixels.Color(255, 0, 255)
};
SimpleKeypad kp1((char *)key_chars, rowPins, colPins, nb_rows, nb_cols);  // New keypad called kp1

void setup()
{
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
}
void loop()
{
  static char lastKey = "";
  char key = kp1.scan();
  if (key != lastKey)
  {
    Serial.println(key);
    lastKey = key;
    if (pixels.getPixelColor(key - 1) != pinColor[key - 1])
       {pixels.setPixelColor(key - 1, pinColor[key - 1]); }
    else
       {pixels.setPixelColor(key - 1, pixels.Color(255, 255, 255));}
  }
}

Ich hab das jetzt für 4 wilde Tasten gemacht - erstmal sehen, ob das geht. Welchedas sind weiss ich nicht :wink:

Nö da tut sich gar nichts mehr. Aber auch kein Error. Der Monitor spuckt jetzt statt der definierten Ziffern aber schöne verschiedene Symbole aus :smiley:

So schaut es jetzt schon einmal aus :slight_smile:

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] =              // The symbols of the keys
{
  {'1', '2', '3', '4', '5'},
  {'6', '7', '8', '9', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

SimpleKeypad kp1((char *)key_chars, rowPins, colPins, nb_rows, nb_cols);  // New keypad called kp1

void setup()
{
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
}

void loop()
{
  static char lastKey = "";
  char key = kp1.getKey();                      // The getKey function scans the keypad every 10 ms and returns a key only one time, when you start pressing it
  if (key != lastKey)                                      // If getKey returned any key
  {
    Serial.println(key);                        // it is printed on the serial monitor
    lastKey = key;
    switch (key)
    {
      case '1':
        if (pixels.getPixelColor(0) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(0, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(0, pixels.Color(0, 0, 0));}
        break;
      case '6':
        if (pixels.getPixelColor(9) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(9, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(9, pixels.Color(0, 0, 0));}
        break;
      case 'B':
        if (pixels.getPixelColor(10) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(10, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(10, pixels.Color(0, 0, 0));}
        break;
      case 'G':
        if (pixels.getPixelColor(19) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(19, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(19, pixels.Color(0, 0, 0));}
        break;


      case '2':
        if (pixels.getPixelColor(1) != pixels.Color(255, 255, 0))
        {   pixels.setPixelColor(1, pixels.Color(255, 255, 0)); }
        else
        {   pixels.setPixelColor(1, pixels.Color(0, 0, 0));}
        break;
        case '7':
        if (pixels.getPixelColor(8) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(8, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(8, pixels.Color(0, 0, 0));}
        break;
        case 'C':
        if (pixels.getPixelColor(11) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(11, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(11, pixels.Color(0, 0, 0));}
        break;
        case 'H':
        if (pixels.getPixelColor(18) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(18, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(18, pixels.Color(0, 0, 0));}
        break;

        case '3':
        if (pixels.getPixelColor(2) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(2, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(2, pixels.Color(0, 0, 0));}
        break;
        case '8':
        if (pixels.getPixelColor(7) != pixels.Color(0, 255, 0))
        {   pixels.setPixelColor(7, pixels.Color(0, 255, 0)); }
        else
        {   pixels.setPixelColor(7, pixels.Color(0, 0, 0));}
        break;
        case 'D':
        if (pixels.getPixelColor(12) != pixels.Color(0, 255, 0))
        {   pixels.setPixelColor(12, pixels.Color(0, 255, 0)); }
        else
        {   pixels.setPixelColor(12, pixels.Color(0, 0, 0));}
        break;
        case 'I':
        if (pixels.getPixelColor(17) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(17, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(17, pixels.Color(0, 0, 0));}
        break;

        case '4':
        if (pixels.getPixelColor(3) != pixels.Color(0, 0, 0))
        {   pixels.setPixelColor(3, pixels.Color(0, 0, 0)); }
        else
        {   pixels.setPixelColor(3, pixels.Color(0, 0, 0));}
        break;
        case '9':
        if (pixels.getPixelColor(6) != pixels.Color(0, 0, 0))
        {   pixels.setPixelColor(6, pixels.Color(0, 0, 0)); }
        else
        {   pixels.setPixelColor(6, pixels.Color(0, 0, 0));}
        break;
        case 'E':
        if (pixels.getPixelColor(13) != pixels.Color(0, 0, 0))
        {   pixels.setPixelColor(13, pixels.Color(0, 0, 0)); }
        else
        {   pixels.setPixelColor(13, pixels.Color(0, 0, 0));}
        break;
        case 'J':
        if (pixels.getPixelColor(16) != pixels.Color(0, 0, 0))
        {   pixels.setPixelColor(16, pixels.Color(0, 0, 0)); }
        else
        {   pixels.setPixelColor(16, pixels.Color(0, 0, 0));}
        break;

        case '5':
        if (pixels.getPixelColor(4) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(4, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(4, pixels.Color(0, 0, 0));}
        break;
        case 'A':
        if (pixels.getPixelColor(5) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(5, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(5, pixels.Color(0, 0, 0));}
        break;
        case 'F':
        if (pixels.getPixelColor(14) != pixels.Color(255, 255, 255))
        {   pixels.setPixelColor(14, pixels.Color(255, 255, 255)); }
        else
        {   pixels.setPixelColor(14, pixels.Color(0, 0, 0));}
        break;
        case 'K':
        if (pixels.getPixelColor(15) != pixels.Color(0, 255, 255))
        {   pixels.setPixelColor(15, pixels.Color(0, 255, 255)); }
        else
        {   pixels.setPixelColor(15, pixels.Color(0, 0, 0));}
        break;
    }
    pixels.show(); // Durchführen der Pixel-Ansteuerung
    delay (pause); // Pause, in dieser Zeit wird nichts verändert.
  }
}

Ach stimmt - versuch mal den:

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
char key_chars[nb_rows][nb_cols] =              // The symbols of the keys
{
  {1, 2, 3, 4, 5},
  {6, 7, 8, 9, 10},
  {11, 12, 13, 14, 15},
  {16, 17, 18, 19, 20}
};
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

uint32_t pinColor[] =
{
  pixels.Color(0, 255, 255), pixels.Color(255, 255, 0), pixels.Color(0, 255, 0), pixels.Color(255, 0, 255)
};
SimpleKeypad kp1((char *)key_chars, rowPins, colPins, nb_rows, nb_cols);  // New keypad called kp1

void setup()
{
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
  for (byte b = 0; b < 20; b++)
  {
    pixels.setPixelColor(b, pixels.Color(255, 255, 255));
  }
}
void loop()
{
  char key = kp1.scan();
  if (key)
  {
    //Serial.println(key);
    if (pixels.getPixelColor(key - 1) != pinColor[key - 1])
    {pixels.setPixelColor(key - 1, pinColor[key - 1]); }
    else
    {pixels.setPixelColor(key - 1, pixels.Color(255, 255, 255));}
    pixels.show();
    delay(pause);
  }
}

(NACHTRAG Ich hab das loop() nopchmal geändert - da fehlte das show() ;( )
Da ist auch drin, wie die am Anfang alle gestellt werden :wink:

1 Like

Muss ich da selber noch was nachtragen zum testen? Weil so sind alle hell und bei drücken zufällige gehen an und bunt oder blinken oder flackern bei gedrückt halten.

Edit:

Oh an sind sie schon mal in der definierten Farbe weiß wie du angegeben hast vermute ich mal. Jedoch ist es dann so, das wenn ich nun die Taste gedrückt habe und sie ist blau, nach dem abschalten und wieder anschalten, die Tasten weiß leuchten und nicht blau (die die man gedrückt hat versteht sich).

Ist das vielleicht zu kompliziert? Ich kann aus dem Code zB jetzt nicht mehr wirklich viel ableiten.

Da ich Neuling bin darf ich 24 Stunden keinen Beitrag mehr schreiben. Es tut mir sehr leid :frowning:

Die Zuordnung kann man mit einem eigenen Feld machen. Außerdem habe ich delay rausgeworfen und mich hemmungslos bei #8 bedient:

#include <SimpleKeypad.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 20
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const byte nb_rows = 4;                         // four rows
const byte nb_cols = 5;                         // four columns
const char key_chars[nb_rows][nb_cols] = {      // The symbols of the keys
  {'1', '2', '3', '4', '5'},
  {'6', '7', '8', '9', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};
const byte led_pos[nb_rows][nb_cols] = {
  { 0,  9, 10, 19,  1},
  { 8, 11, 18,  2,  7},
  {12, 17,  3,  6, 13},
  {16,  4,  5, 14, 15}
};
const uint32_t WEISS = 0xFFFFFF, AKTIV = 0x00FFFF;
byte rowPins[nb_rows] = {2, 3, 4, 5};
byte colPins[nb_cols] = {7, 8, 9, 10, 11};

SimpleKeypad kp1((char*)key_chars, rowPins, colPins, nb_rows, nb_cols);   // New keypad called kp1

void setup() {
  Serial.begin(9600);
  Serial.println("Press any key on the keypad and it will show up here :");
  pixels.begin(); // Initialisierung der NeoPixel
  for (byte j = 0; j < NUMPIXELS; j++) {
    pixels.setPixelColor(j, WEISS);
  }
  pixels.show();
}

void loop() {
  uint32_t jetzt = millis();
  static uint32_t vorhin = 0;
  const uint32_t ENTPRELL_INTERVALL = 100;
  if (jetzt - vorhin >= ENTPRELL_INTERVALL) {
    char key = kp1.getKey();                      // The getKey function scans the keypad every 10 ms and returns a key only one time, when you start pressing it
    if (key) {                                    // If getKey returned any key
      vorhin = jetzt;
      Serial.println(key);
      for (byte r = 0; r < nb_rows; r++) {
        for (byte c = 0; c < nb_cols; c++) {
          if ( key == key_chars[r][c] ) {
            if (pixels.getPixelColor(led_pos[r][c]) != AKTIV) {
              pixels.setPixelColor(led_pos[r][c], AKTIV);
            } else {
              pixels.setPixelColor(led_pos[r][c], WEISS);
            }
          }
        }
      }
      pixels.show(); // Durchführen der Pixel-Ansteuerung
    }
  }
}

Getestet mit Keypad.h.


Ich wollte nicht in Konkurrenz treten, bin nur langsamer :innocent:

1 Like