Led Matrix Probleme mit switch case

Hallo zusammen,

ich habe eine 16x16 LED Matrix ich hatte eigentlich ganz normale switch schalter on/off da war es einfach. schalter einschalten die matrix blinkt so wie ich es will und so lange bis ich den schalter ausschalte.

Aber jetzt habe ich heute mal eine button matrix bzw eig so ein keypad 4x4 nachgebaut. Weil so habe ich wesentlich mehr schalter mit wesentlich weniger kabel.

Aber jetzt habe ich das problem dass ich zum beispiel den button 1 drücke und der eine case fall läuft einmal durch und das wars. erst wenn ich den button wieder drücke läuft der ablauf wieder einmal ab.
Ich möchte aber gerne das es so lange durchläuft bis ich einen anderen knopf drücke bzw. den "D" Button.

Was mache ich falsch oder was muss ich anders schreiben??

#include <Keypad.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 11


int pot1        = A0;
int pot2        = A1;
int pot3        = A2;
int pot4        = A3;
int pot5        = A4;
int pot6        = A5;


int del1        = 0;
int del2        = 0;
int bright      = 0;
int rot         = 0;
int gruen       = 0;
int blau        = 0;

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

char keys[ROWS][COLS] = { // Define the Keymap
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );// Create the Keypad
Adafruit_NeoPixel strip = Adafruit_NeoPixel(256, PIN, NEO_GRB + NEO_KHZ800);



void setup()
{
  strip.begin();
  strip.show();
  Serial.begin(9600);
}

void loop()
{
  bright    = analogRead(pot5); // wir legen fest, dass die Variable pot1_wert für uns den Wert des Potis speichert
  bright    = map(bright, 0, 1023, 0, 240);
  del1      = analogRead(pot1);
  del2      = analogRead(pot6);
  
  rot       = analogRead(pot2);
  rot       = map(rot, 0, 1023, 0, 255);
  gruen     = analogRead(pot3);
  gruen     = map(gruen, 0, 1023, 0, 255);
  blau      = analogRead(pot4);
  blau      = map(blau, 0, 1023, 0, 255);

  
 
 char key = kpd.getKey();
  if (key) // Check for a valid key.
  {
    switch (key)
    {
     
     case '1':
      

        strip.fill(strip.Color(0, 0, 255), 8, 8);
        strip.fill(strip.Color(0, 0, 255), 16, 8);
        strip.fill(strip.Color(0, 0, 255), 40, 8);
        strip.fill(strip.Color(0, 0, 255), 48, 8);
        strip.fill(strip.Color(0, 0, 255), 72, 8);
        strip.fill(strip.Color(0, 0, 255), 80, 8);
        strip.fill(strip.Color(0, 0, 255), 104, 8);
        strip.fill(strip.Color(0, 0, 255), 112, 8);
        strip.fill(strip.Color(0, 0, 255), 136, 8);
        strip.fill(strip.Color(0, 0, 255), 144, 8);
        strip.fill(strip.Color(0, 0, 255), 168, 8);
        strip.fill(strip.Color(0, 0, 255), 176, 8);
        strip.fill(strip.Color(0, 0, 255), 200, 8);
        strip.fill(strip.Color(0, 0, 255), 208, 8);
        strip.fill(strip.Color(0, 0, 255), 232, 8);
        strip.fill(strip.Color(0, 0, 255), 240, 8);
        strip.setBrightness(bright);
        strip.show();
        delay(del2);
        strip.clear();
        strip.show();
        delay(del2);
 break;

     
     case '2':
         strip.setPixelColor(49, (strip.Color(255, 90, 0)));
        strip.setPixelColor(50, (strip.Color(255, 90, 0)));
        strip.setPixelColor(51, (strip.Color(255, 90, 0)));
        strip.setPixelColor(52, (strip.Color(255, 90, 0)));
        strip.setPixelColor(53, (strip.Color(255, 90, 0)));
        strip.setPixelColor(54, (strip.Color(255, 90, 0)));
        strip.setPixelColor(78, (strip.Color(255, 90, 0)));
        strip.setPixelColor(81, (strip.Color(255, 90, 0)));
        strip.setPixelColor(110, (strip.Color(255, 90, 0)));
        strip.setPixelColor(113, (strip.Color(255, 90, 0)));
        strip.setPixelColor(114, (strip.Color(255, 90, 0)));
        strip.setPixelColor(115, (strip.Color(255, 90, 0)));
        strip.setPixelColor(116, (strip.Color(255, 90, 0)));
        strip.setPixelColor(117, (strip.Color(255, 90, 0)));
        strip.setPixelColor(118, (strip.Color(255, 90, 0)));
        strip.setPixelColor(137, (strip.Color(255, 90, 0)));
        strip.setPixelColor(150, (strip.Color(255, 90, 0)));
        strip.setPixelColor(169, (strip.Color(255, 90, 0)));
        strip.setPixelColor(182, (strip.Color(255, 90, 0)));
        strip.setPixelColor(201, (strip.Color(255, 90, 0)));
        strip.setPixelColor(202, (strip.Color(255, 90, 0)));
        strip.setPixelColor(203, (strip.Color(255, 90, 0)));
        strip.setPixelColor(204, (strip.Color(255, 90, 0)));
        strip.setPixelColor(205, (strip.Color(255, 90, 0)));
        strip.setPixelColor(206, (strip.Color(255, 90, 0)));
        strip.setPixelColor(62, (strip.Color(255, 90, 0)));
        strip.setPixelColor(61, (strip.Color(255, 90, 0)));
        strip.setPixelColor(60, (strip.Color(255, 90, 0)));
        strip.setPixelColor(59, (strip.Color(255, 90, 0)));
        strip.setPixelColor(58, (strip.Color(255, 90, 0)));
        strip.setPixelColor(57, (strip.Color(255, 90, 0)));
        strip.setPixelColor(70, (strip.Color(255, 90, 0)));
        strip.setPixelColor(89, (strip.Color(255, 90, 0)));
        strip.setPixelColor(102, (strip.Color(255, 90, 0)));
        strip.setPixelColor(121, (strip.Color(255, 90, 0)));
        strip.setPixelColor(134, (strip.Color(255, 90, 0)));
        strip.setPixelColor(153, (strip.Color(255, 90, 0)));
        strip.setPixelColor(166, (strip.Color(255, 90, 0)));
        strip.setPixelColor(185, (strip.Color(255, 90, 0)));
        strip.setPixelColor(198, (strip.Color(255, 90, 0)));
        strip.setPixelColor(197, (strip.Color(255, 90, 0)));
        strip.setPixelColor(196, (strip.Color(255, 90, 0)));
        strip.setPixelColor(195, (strip.Color(255, 90, 0)));
        strip.setPixelColor(194, (strip.Color(255, 90, 0)));
        strip.setPixelColor(193, (strip.Color(255, 90, 0)));
        strip.setBrightness(bright);
        strip.show();
        delay(del1);
        strip.clear();
        strip.show();
        delay(del1);
       break;
     
      
      case '3':


        strip.setPixelColor(84, (strip.Color(139, 0, 139)));
        strip.setPixelColor(83, (strip.Color(139, 0, 139)));
        strip.setPixelColor(82, (strip.Color(139, 0, 139)));
        strip.setPixelColor(81, (strip.Color(139, 0, 139)));
        strip.setPixelColor(80, (strip.Color(139, 0, 139)));
        strip.setPixelColor(109, (strip.Color(139, 0, 139)));
        strip.setPixelColor(114, (strip.Color(139, 0, 139)));
        strip.setPixelColor(141, (strip.Color(139, 0, 139)));
        strip.setPixelColor(146, (strip.Color(139, 0, 139)));
        strip.setPixelColor(89, (strip.Color(139, 0, 139)));
        strip.setPixelColor(86, (strip.Color(139, 0, 139)));
        strip.setPixelColor(102, (strip.Color(139, 0, 139)));
        strip.setPixelColor(104, (strip.Color(139, 0, 139)));
        strip.setPixelColor(105, (strip.Color(139, 0, 139)));
        strip.setPixelColor(120, (strip.Color(139, 0, 139)));
        strip.setPixelColor(121, (strip.Color(139, 0, 139)));
        strip.setPixelColor(118, (strip.Color(139, 0, 139)));
        strip.setPixelColor(134, (strip.Color(139, 0, 139)));
        strip.setPixelColor(137, (strip.Color(139, 0, 139)));
        strip.setPixelColor(150, (strip.Color(139, 0, 139)));
        strip.setPixelColor(153, (strip.Color(139, 0, 139)));
        strip.setPixelColor(93, (strip.Color(139, 0, 139)));
        strip.setPixelColor(92, (strip.Color(139, 0, 139)));
        strip.setPixelColor(91, (strip.Color(139, 0, 139)));
        strip.setPixelColor(94, (strip.Color(139, 0, 139)));
        strip.setPixelColor(95, (strip.Color(139, 0, 139)));
        strip.setPixelColor(100, (strip.Color(139, 0, 139)));
        strip.setPixelColor(123, (strip.Color(139, 0, 139)));
        strip.setPixelColor(124, (strip.Color(139, 0, 139)));
        strip.setPixelColor(125, (strip.Color(139, 0, 139)));
        strip.setPixelColor(126, (strip.Color(139, 0, 139)));
        strip.setPixelColor(127, (strip.Color(139, 0, 139)));
        strip.setPixelColor(128, (strip.Color(139, 0, 139)));
        strip.setPixelColor(155, (strip.Color(139, 0, 139)));
        strip.setPixelColor(156, (strip.Color(139, 0, 139)));
        strip.setPixelColor(157, (strip.Color(139, 0, 139)));
        strip.setPixelColor(158, (strip.Color(139, 0, 139)));
        strip.setPixelColor(159, (strip.Color(139, 0, 139)));
        strip.setBrightness(bright);
        delay(del1);
        strip.show();
        strip.clear();
        delay(del1);
       
        break;




      case 'A':

        strip.fill(strip.Color(255, 255, 255), 0, 256);
        strip.setBrightness(bright);
        strip.show();
        break;


      case '4':
        strip.fill(strip.Color(rot, gruen, blau), 0, 256);
        strip.setBrightness(bright);
        strip.show();
        break;

      
      //case '5':
      //break;
      //case '6':
      //break;
      //case 'B':
      //break;
      //case '7':
      //case '8':
      //case '9':
      //case 'C':
      //case '*':
      //case '0':
      //case '#':

      case 'D':

        strip.clear();
        strip.show();



      default:
Serial.println(key);

    }
  }

 }
  

Du hast es doch genauso programmiert. "key" wird ständig überschrieben. Somit geht verloren dass du mal was gedrückt hast. Du musst den aktuellen Status vom Tastendruck trennen

ich weiß nicht wie das geht :frowning:

  if (key) // Check for a valid key.
  {
    switch (key)
    {

das problem liegt also hier ??

In der IDE:
STRG-T drücken.

DATEI - VOREINSTELLUNGEN - den Haken setzen bei: AUSFÜHRLICHE AUSGABE WÄHREND # KOMPILIERUNG
Da drunter:
COMPILER-WARNUNGEN: ALLE

Tata:

/tmp/arduino_modified_sketch_53505/sketch_aug15b.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_53505/sketch_aug15b.ino:214:19: warning: this statement may fall through [-Wimplicit-fallthrough=]
         strip.show();
         ~~~~~~~~~~^~
/tmp/arduino_modified_sketch_53505/sketch_aug15b.ino:215:7: note: here
       default:
       ^~~~~~~

Und dann schaun und staun:

      case 'D':
        strip.clear();
        strip.show();
      default:
        Serial.println(key);
    }

hmmm
Ich weiß leider nicht was ich damit anfangen soll / kann :confused:

So ich habe es jetzt formatiert und herumprobiert.
Wenn ich das default weg lasse ist es das selbe es blinkt einmal...
wenn ich das von D bei default schreibe ist es auch das selbe :frowning:

Du brauchst 2 Variablen:

static char key ='';
char keyIn = kpd.getKey();
  if (keyIn) key = keyIn;
  if (key) // Check for a valid key.

Gruß Tommy

1 Like

DANKE!!!!!!

magst du es mir bitte erklären?
Was habe ich jetzt verändert?

was macht das static char??
so wie ich es verstehe:
"char" ordnet einer bestimmte "sache" einem wort zu in meinem fall das wort key ist eigentlich kpd.getKey()

static hat sehr viele Bedeutungen je nachdem wo und wie man es verwendet. Hier geht es aber um die Lebenszeit der Variablen

Die Variable überlebt das Ende der Funktion loop (ähnlich wie eine globale Variable) ist aber nur in loop sichtbar. D.h. in der merkst Du Dir den letzten eingegebenen Wert, den Du erst überschreibst, wenn wieder eine Taste betätigt wurde.

Gruß Tommy

Danke für eure antworten un d erklärungen!!!!!

Jetzt muss ich aber nochmal was anderes fragen :see_no_evil:

Irgendwas habe ich falsch gemacht....
Aber diesmal in der Hardware.

Weil immer wieder überlaste ich wohl das arduino und ich muss es erstmal wieder ausstecken und "neu starten". Das passiert wenn ich es bisl heller machen möchte.

Liegt das wirklich an dem dc dc wandler? Weil von der amper zahl würde es genau passen nur die wattzahl ist mit 75 um 1,8W zu wenig.
Aber dass kann ja nicht so ein problem sein oder?
Muss ich es anders anschließen? Soll ich das arduino anders mit strom versorgen?
Wenn ja wie???

ich habe es so angeschloßen:

Das ist der dc-dc wandler:

Das die led Matrix:

Na ich hab Dir das versucht zu zeigen.
Dann im Original-Code:

Da fehlen doch breaks oder?
Findest Du das lesbar :wink:

Du verbindest 5V und GND vom Step_UP mit dem Arduino? USB-Kabel auch dran?

Dann find ich sowas im Code:

strip.fill(strip.Color(255, 255, 255), 0, 256);

Bist Du sicher, das da 256 passen?

Und dann überarbeite das mal:

#define PIN 11


int pot1        = A0;
int pot2        = A1;
int pot3        = A2;
int pot4        = A3;
int pot5        = A4;
int pot6        = A5;


int del1        = 0;
int del2        = 0;
int bright      = 0;
int rot         = 0;
int gruen       = 0;
int blau        = 0;

Was constant sein kann, wird const.
Was nicht negativ werden kann wird unsigned.
Und wenn Du nur ein byte brauchst, dann keinen integer nehmen.

Das delay ist böse.

        strip.show();
        delay(del1);
        strip.clear();
        strip.show();
        delay(del1);

Für diese Zeit steht der Code hier fest.
Du kannst nichts anderes machen.

Noch ne Menge Baustellen :wink:

zwischen case D und dem default?? Aber da braucht es doch so wie ich es verstanden habe keinen break oder doch?

naja eigentlich 12V vom Auto gehen zum step_UP von da zur matrix und von der aus zum uno.
Aber zum programmieren und testen bekommt der Step_UP so gar keine externe versorgung.

Tastächlich das ist ein fehlerchen :see_no_evil:

Das verstehe ich noch nicht. bzw habe ich so noch nicht selbst verwendet also habe ich es so gemacht.

Ja das delay blockiert so eigentlich wirklich alles andere. Aber das ist ja im grunde in dem fall nicht all zu schlimm. Na gut es nervt ein wenig dass sich die Blinkrate/Helligkeit und "aus" nicht direkt "umgesezt" werden sondern der abschnitt erstmal durchläuft :see_no_evil: Da muss ich das mit dem millis bzw. blink without delay noch mal genauer anschauen....
und
noch gaaanz viel lernen :slight_smile:

Ja, wenn natürlich beim case D: auch das ausgeführt werden soll, was in default steht:
und das dann so aussehen würde:

      case 'D':
        strip.clear();
        strip.show();
        Serial.println(key);
        break;
      default:
        Serial.println(key);
        break;
    }

ja, dann kann man das so machen wie Du, aber dann auch kommentieren, das das break absichtlich weg gelassen.

Und das ist Dein Problem.
Das schafft der Arduino nicht.

Du kannst den +5V vom Arduino zum Step_UP/Matrix trennen und den Arduino dauerhaft - solange wie programmiert wird - aus dem USB versorgen.w
Nur GND muss überall angesetzt sein.

Ansatz:

const uint8_t PIN = 11; //kein define für Pins!

const uint8_t pot1 = A0; // pins ändern während des Betriebes wirste ja nicht - also const

unsigned int del1 = 0; // delay kann nicht negativ werden - Auf die Variablengrösse achten!

uint8_t rot         = 0; // achtung da gehört noch was dazu:

/* alt
  rot = analogRead(pot2);
  rot = map(rot, 0, 1023, 0, 255);
*/
// neu:
 rot = map(analogRead(pot2), 0, 1023, 0, 255);

Ach das ist gar nicht schlimm. Du musst nur wissen, wo Du was nachlesen kannst.

Einmal jeden Abend ein paar Seiten. Von vorne bis hinten.
Nicht auswendig lernen. Nur wissen, wo was steht.
https://www.arduinoforum.de/code-referenz
Da das pdf runterladen.
Sehr gute-Nacht-Lektüre.

Danke für deine Hilfe!!!!!

dazu muss ich nochmal nachfragen....
Ich habe es ja so gemacht damit entweder das arduino über usb oder im "einsatz" von der matrix her versorgt wird....
Trenne ich +5V vom arduino, wie soll ich es dann versorgen?
Ein altes usb kabel "auf trennen" und einfach + und - von dem zum Step_UP in oder out machen und so das ardu versorgen?

Ah das ist glaube ich dann einfacher bzw. übersichtlicher :slight_smile:

Ui das kannte ich tatsächlich noch nicht und ich fang heute abend an zu lesen :slight_smile:

DANKESCHÖN!!!!!

Und die Warnung unterdrücken!
Das geht sogar gleichzeitig, alles drei in einer Zeile.

    case 'D':
        strip.clear();
        strip.show();
        Serial.println(key);
       /* fall through  */ // break;
      default:
        Serial.println(key);
        break;
    }

Danke.

Ist eine Variante die funktioniert.
Das USB-Kabel ganz sicher vom 5V-Pin trennen.
Dann den Ardu mit den 5V vom Step_Up Dauerhaft versorgen.
Aber Vorsicht! Wenn Du das vergisst und dann ein voll beschaltenes Kabel nimmst, kann es Rauch geben.