KeyPad-Lib macht Probleme?

Hallo zusammen,

ich arbeite ja z. Z. die Feinheiten an meinen Code`s raus. Mein Steuergerät mag da besonders widerspenstig sein.

Ich hab die Vermutung, dass die KeyPad-lib oder änhliches dran Schuld ist. Aber erst mal zum Fehler:

Software soweit fertig geschrieben und auf den Atmega238P-PU geschoben. Display ist schon angelötet, Tastatur jetzt auch angeschlossen. Also drück ma mal die und schauen was passiert:

Pfeiltasten: Nichts. Haken: Springt zwei Menü's weit Kreuz: Nichts Einsammel-/Austeilbefehl: Macht, was er soll.

Und so ist es aber nicht die ganze Zeit. Hab mir mal die Tasten auf'm Display ausgeben lassen:

Eine Zeit lang lassen sich die Tasten sporadisch drücken und werden dann auch richtig angezeigt. Die Befehle werden mal mehr, mal weniger korrekt ausgeführt: Beim Haken drücken, sollte man eigentlich nur ein Menü springen, aber es wird gleich zwei Menü's gesprungen (ich rede von Ebenen, mehr als 3 gibt's aber auch nicht). Wenn ich abwechselnd Einsammeln und Austeilen drück, macht es auch das entsprechende. Ein paar mal. Dann passiert nichts mehr. Egal, welche Taste ich drück, es passiert nichts mehr. Auch, wenn ich in anderen Menü's bin. Nach einer gewissen Zeit (unterschiedlich: 20 - 60 Sekunden) interessiern ihn die Tastenaktionen nicht mehr - welche er annimmt, entscheidet er auch nach Ene-Mene-Miste.. Als lib benutze ich übrigens die von Alexander Breving, CustomKeyPad.

Ich hab dann mal alle Displaybefehle und Tastenverarbeitungen, die ich für mein Testurnier nicht brauche (schreib ich die Daten halt fest in den IC für den Test), auskommentiert. Wenn was auskommentiert wird, wird's ja nicht auf den IC geschrieben, oder? Kann es sein, dass ich mit über 22,5 kB den IC überlade? (Obwohl er mit 32 kB ist).

Mein loop ist eigentlich auch relativ lahm, wenn ich keine Tasten drück, oder Daten sende: Es laufen immer nur if-Abfragen durch, erst wenn eine if-Abfrage passt, wird in diesem loop auch was getan. Ansonsten ist er immer im "leerlauf"/bereitschaft. Also überfordern sollte ich ihn eigentlich auch nicht.

Wegen der KeyPad-lib nochmal: Ist schon bisschen her, aber ich kann mich erinnern, dass gesagt wurde, dass die Tastatur über die lib bereits entprellt ist und ich mir auch wegen der "Tastendrucklänge" (einmal drücken als einmal erkannt oder für jeden loopdurchlauf einmal) keine Gedanken machen muss, das würde die lib erledigen. Bei der Hardware hab ich auch wirklich nur meine Tastaturmatrix gelötet, mehr nicht.

Ich hoffe, ihr könnt mir ein wenig auf die Sprünge helfen, warum ich so Probleme damit hab.

Vielen Dank schon mal

LG

Fipsi

und wo bleibt der Sketch? Meine Kugel sagt, dass der Fehler in der loop versteckt ist.

Ups… ich wusste, ich hab was vergessen… ich bitte um Entschuldigung^^

(Ich kopier jetzt nur den Tastatur-relevanten Teil)

#include <Keypad.h>

// Keyboard
const byte ROWS = 2;
const byte COLS = 4;

char keys[ROWS][COLS] = {
  { 'r','b','n','l' }, // Rechts, Rauf, Runter, Links
  { 'k','h','e','a' } };  // Kreuz, Haken, Einsammeln, Austeilen

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

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void loop()
{
  // Keypad abfragen
  char key = kpd.getKey();
  if (key)
  {
    switch(key)
    {
      // Taste Pfeil nach oben
      /*case 'b':
        // Im Menü navigieren
        if (((in_menue == 0) || (in_menue == 1) || (in_menue == 4)) && (cursor_position_z > 0))
          cursor_position_z - 1;
        
        // IP-Adresse einstellen
        if (in_menue == 2)
        {
          if (server_ip[position_ip - 1] == 9)
          {
            server_ip[position_ip - 1] = 0;
          }
          else
          {
            server_ip[position_ip - 1] + 1;
          }
        }
        
        display_new = 1;
        break;
        
      // Taste Pfeil nach unten
      case 'n':
        // Im Menü navigieren
        if ((in_menue == 0) && (cursor_position_z < 2))
          cursor_position_z + 1;
          
        if ((in_menue == 1) && (cursor_position_z < 1))
          cursor_position_z + 1;
        
        if ((in_menue == 4) && (cursor_position_z < 3))
          cursor_position_z + 1;
        
        // IP-Adresse einstellen
        if (in_menue == 2)
        {
          if (server_ip[position_ip - 1] == 0)
          {
            server_ip[position_ip - 1] = 9;
          }
          else
          {
            server_ip[position_ip - 1] - 1;
          }
        }
        
        display_new = 1;
        break;
        
      // Taste Pfeil nach links
      case 'l':
        // IP-Adresse Ziffern auswählen
        if ((in_menue == 2) && (position_ip > 1))
        {
          if (position_ip == 4)
            cursor_position_s = 2;
          else if (position_ip == 7)
            cursor_position_s = 8;
          else if (position_ip == 10)
            cursor_position_s = 10;
          else
            cursor_position_s - 1;
          
          position_ip - 1;
        }
        
        display_new = 1;
        break;

      // Taste Pfeil nach rechts
      case 'r':
        // IP-Adresse Ziffern auswählen
        if ((in_menue == 2) && (position_ip < 12))
        {
          if (position_ip == 3)
            cursor_position_s = 4;
          else if (position_ip == 6)
            cursor_position_s = 8;
          else if (position_ip == 9)
            cursor_position_s = 12;
          else
            cursor_position_s + 1;
          
          position_ip + 1;
        }
        
        display_new = 1;
        break;
        
      // Taste mit Haken (Enter)
      case 'h':
        // In Untermenü Einstellungen gehen
        if ((in_menue == 0) && (cursor_position_z == 0))
          in_menue = 1;
        
        // In Untermenü IP-Adresse gehen
        if ((in_menue == 1) && (cursor_position_z == 0))
          in_menue = 2;
        position_ip = 0;
        
        // IP-Adresse speichern und zu Untermenü Einstellungen wechseln
        if ((in_menue == 2) && (cursor_position_z == 1))
        {
          in_menue = 1;
        }
        
        // In Untermenü Ethernet Start wechseln
        if ((in_menue == 1) && (cursor_position_z == 1))
        {
          in_menue = 3; 
        }
        
        // Ethernet Start und zu Untermenü Einstellungen wechseln
        if (in_menue == 3)
        {
          Ethernet.begin(mac,ip);
          while(!client){
            ;
          }
          ethernet_on = 1;
          ethernet_error = 0;
          in_menue = 1;
        }
        
        // In Untermenü Scheibennummern wechseln
        if ((in_menue == 0) && (cursor_position_z == 1))
          in_menue = 4;
        
        // In Untermenü von/bis wechseln
        if ((in_menue == 4) && (cursor_position_z == 0))
          in_menue = 5;
        
        // Scheiben von/bis speichern und in Untermenü Scheibennummern wechseln
        if ((in_menue == 5) && (scheibe_von) && (scheibe_bis))
        {
          EEPromSave((byte*)&scheibe_von,2,11);
          EEPromSave((byte*)&scheibe_bis,2,15);
          in_menue = 4;
        }
        
        // In Untermenü Scheibennummern eintragen wechseln
        if ((in_menue == 4) && (cursor_position_z == 1))
          in_menue = 6;
        
        // Befehl senden und in Untermenü Scheibennummern wechseln
        if (in_menue == 6)
        {
          digitalWrite(2,HIGH);
	    Serial << "999,1" << endl;
	  digitalWrite(2,LOW);
          in_menue = 4;
        }
        
        // In Untermenü Scheibennummern einsammeln wechseln
        if ((in_menue == 4) && (cursor_position_z == 2))
          in_menue = 7;
        
        // Befehl senden und in Untermenü Scheibennummern wechseln
        if (in_menue == 7)
        {
          check_scheiben_new = scheibe_von;
          in_menue = 4;
        }
        
        // In Untermenü nicht reagierende Scheiben wechseln
        if ((in_menue == 4) && (cursor_position_z == 3))
          in_menue == 8;
        
        // fehlende Scheiben quittieren und in Untermenü Scheibennummern wechseln
        if (in_menue == 8)
        {
          scheibe_fehlt_quittier = 1;
          in_menue = 4;
        }
        
        // In Schießbetrieb wechseln
        if ((in_menue == 0) && (cursor_position_z == 2))
          in_menue = 9;
        
        display_new = 1;
        break;
        
      // Taste mit Kreuz (ESC)
      case 'k':
        // Menü wechseln
        if (in_menue == 1)
          in_menue = 0;
        
        if (in_menue == 2)
          in_menue = 1;
        
        if (in_menue == 3)
          in_menue = 1;
        
        if (in_menue == 4)
          in_menue = 0;
        
        if (in_menue == 5)
          in_menue = 4;
        
        if (in_menue == 6)
          in_menue = 4;
        
        if (in_menue == 7)
          in_menue = 4;
        
        if (in_menue == 8)
          in_menue = 4;
        
        if (in_menue == 9)
          in_menue = 0;
        
        display_new = 1;
        break;*/
	
      case 'e':
        check_scheibe = 0;
        get_scheiben_data = scheibe_von;
        terminal_status = 1;
        in_menue = 9;
        display_new = 1;
        break;
	
      case 'a':
        give_scheibe_data = scheibe_von;
        check_scheibe = 0;
        terminal_status = 2;
        in_menue = 9;
        display_new = 1;
        break;
    }
    //display_new = 1;
  }
}

LG

Fipsi

P.S.: Zu Testzwecken waren die case’ im switch-Teil natürlich nicht auskommentiert…

Lass den ganzen Kram erst mal weg und gib einfach die gedrückte Taste auf Serial aus. Geht das wenigstens?

Eventuell mal mit der Debounce-Zeit rumspielen. Das kann man mit setDebounceTime() einstellen.

Im Serial Monitor kommt jeder Tastendruck klar und deutlich an. Und auch wenn ich ne Taste 5 Sekunden drück, wird das als nur einmal erkannt.

Also hängt's doch im Code.. na Bravo..

LG

Fipsi

Fehler gefunden

cursor_position_z - 1;
server_ip[position_ip - 1] + 1;

Das macht nichts. Du musst das Ergebnis schon etwas zuweisen. Du meinst hier wohl += 1 und -= 1. Oder ++ und --

Und so geht es dann weiter...

Ouh man.. klasse.. Danke.. das erklärt mir, warum die Pfeiltasten nicht gehen..

Aber das Problem, dass er von (Display; "in_menue") 0 (Homescreen) zu 2 ("IP-Adresse") springt und dabei nicht in 1 ("Konfigurationen") geht, ist damit doch noch nicht erklärt?

LG

Fipsi

So, jetzt hab ich gerade wieder die Gaudi, dass, sobald ich eine Taste drück - egal, welche - ein Reset ausgelöst wird. Das hatte ich heute schon mal, allerdings war dass sofort immer nach jedem Setup.

Das einzige, was ich verändert hab, war, dass ich die Auskommentierungen zurück genommen hab. Woran liegt das? Ist das in der Keypad-lib als Schutz vor irgendwas eingebettet oder was?

LG

Fipsi