Programmierung von der Eingabe

Hallo Leute, ich habe ein Problem

Also ich habe eine Folientastatur, und habe nun zum testen der einzelnen tasten folgendes geschrieben

Headerdatei

#ifndef ANMAKEYPAD_H
#define ANMAKEYPAD_H

#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#define KEY_NOT_PRESSED '-'
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_A 'A'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_B 'B'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_C 'C'
#define KEY_STAR '*'
#define KEY_0 '0'
#define KEY_HASH '#'
#define KEY_D 'D'

class AnalogMatrixKeypad{
public:
AnalogMatrixKeypad(byte analogPin);
void setDebounceTime(unsigned int debounceTime);
void setThresholdValue(byte tv);
char readKey();
private:
byte analogPin;
unsigned int debounceTime;
long lastValue;
byte threshold;
};
#endif

Als C++ Datei

#include "AnalogMatrixKeypad.h"

AnalogMatrixKeypad::AnalogMatrixKeypad(byte ap){
analogPin = ap;
debounceTime = 250;
threshold = 4;
}

void AnalogMatrixKeypad::setDebounceTime(unsigned int time){
debounceTime = time;
}

void AnalogMatrixKeypad::setThresholdValue(byte tv){
threshold = tv;
}

char AnalogMatrixKeypad::readKey(){
char key = KEY_NOT_PRESSED;
int aValue = analogRead(analogPin);
if((aValue > 0)&&(millis() -lastValue >= debounceTime)){
if((aValue > (925 -threshold)) &&(aValue < (925 + threshold)))
key = KEY_1;
if((aValue > (907 -threshold)) &&(aValue < (907 + threshold)))
key = KEY_2;
if((aValue > (890 -threshold)) &&(aValue < (890 + threshold)))
key = KEY_3;
if((aValue > (873 -threshold)) &&(aValue < (873 + threshold)))
key = KEY_A;
if((aValue > (849 -threshold)) &&(aValue < (849 + threshold)))
key = KEY_4;
if((aValue > (834 -threshold)) &&(aValue < (834 + threshold)))
key = KEY_5;
if((aValue > (819 -threshold)) &&(aValue < (819 + threshold)))
key = KEY_6;
if((aValue > (805 -threshold)) &&(aValue < (805 + threshold)))
key = KEY_B;
if((aValue > (784 -threshold)) &&(aValue < (784 + threshold)))
key = KEY_7;
if((aValue > (771 -threshold)) &&(aValue < (771 + threshold)))
key = KEY_8;
if((aValue > (759 -threshold)) &&(aValue < (759 + threshold)))
key = KEY_9;
if((aValue > (746 -threshold)) &&(aValue < (746 + threshold)))
key = KEY_C;
if((aValue > (729 -threshold)) &&(aValue < (729 + threshold)))
key = KEY_STAR;
if((aValue > (717 -threshold)) &&(aValue < (717 + threshold)))
key = KEY_0;
if((aValue > (707 -threshold)) &&(aValue < (707 + threshold)))
key = KEY_HASH;
if((aValue > (696 -threshold)) &&(aValue < (696 + threshold)))
key = KEY_D;
lastValue = millis();
}
return key;
}

und nun das Problem, die Tasten einzeln erkennt er, aber ich möchte jetzt Eine Zahl zwischen 0-999 eingeben und diese in in eine Variable abspeichern. Aber das funktioniert leider nicht :frowning:

Gruß

Aso und die Eingabe soll abgespeichert werden, wenn die Taste A gedrückt wird

Und wenn du jetzt deinen Sketch noch in Code-Tags setzen würdest, könnten wir den besser lesen.

Zunächst: Bitte den Code in Codetags einbetten, dann ist er besser lesbar (das ist das </> Symbol oben links)
Dann: dein Code ist unvollständig, ich finde keine loop()

Deine Funktion readkey liefert einen Char-Wert der gedrückten Taste zurück.

Diese musst du dann weiter verarbeiten und ggf zu einer Zahl zusammenbasteln.
Aber Teil fehlt in deinem Code.

Muck93: Aso und die Eingabe soll abgespeichert werden, wenn die Taste A gedrückt wird

Was möchtest Du uns in diesem Thread jetzt eigentlich mitteilen?

Du hast eine Library geschrieben mit .h und .cpp Datei und Du hast dabei aber vergessen, auch noch einen Arduino-Sketch zu schreiben, der das macht, was Du möchtest?

Wie hast Du denn überhaupt getestet, dass die Library vom Prinzip her mit Deiner Hardware zusammen soweit funktioniert, dass man sie in einem Sketch verwenden könnte?

Hast Du echt eine analoge Folientastatur mit so engen Toleranzen, dass Du damit Tasten mit dem von Dir verwendeten threshold = 4; zuverlässig abfragen kannst?

Header

#ifndef ANMAKEYPAD_H
#define ANMAKEYPAD_H

#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#define KEY_NOT_PRESSED '-'
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_A 'A'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_B 'B'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_C 'C'
#define KEY_STAR '*'
#define KEY_0 '0'
#define KEY_HASH '#'
#define KEY_D 'D'

class AnalogMatrixKeypad{
 public:
 AnalogMatrixKeypad(byte analogPin);
 void setDebounceTime(unsigned int debounceTime);
 void setThresholdValue(byte tv);
 char readKey();
 private:
 byte analogPin;
 unsigned int debounceTime;
 long lastValue;
 byte threshold;
};
#endif

C++

#include "AnalogMatrixKeypad.h"

AnalogMatrixKeypad::AnalogMatrixKeypad(byte ap){
 analogPin = ap;
 debounceTime = 250;
 threshold = 4;
}

void AnalogMatrixKeypad::setDebounceTime(unsigned int time){
 debounceTime = time;
}

void AnalogMatrixKeypad::setThresholdValue(byte tv){
 threshold = tv;
}

char AnalogMatrixKeypad::readKey(){
 char key = KEY_NOT_PRESSED;
 int aValue = analogRead(analogPin);
 if((aValue > 0)&&(millis() -lastValue >= debounceTime)){
 if((aValue > (925 -threshold)) &&(aValue < (925 + threshold)))
 key = KEY_1;
 if((aValue > (907 -threshold)) &&(aValue < (907 + threshold)))
 key = KEY_2;
 if((aValue > (890 -threshold)) &&(aValue < (890 + threshold)))
 key = KEY_3;
 if((aValue > (873 -threshold)) &&(aValue < (873 + threshold)))
 key = KEY_A;
 if((aValue > (849 -threshold)) &&(aValue < (849 + threshold)))
 key = KEY_4;
 if((aValue > (834 -threshold)) &&(aValue < (834 + threshold)))
 key = KEY_5;
 if((aValue > (819 -threshold)) &&(aValue < (819 + threshold)))
 key = KEY_6;
 if((aValue > (805 -threshold)) &&(aValue < (805 + threshold)))
 key = KEY_B;
 if((aValue > (784 -threshold)) &&(aValue < (784 + threshold)))
 key = KEY_7;
 if((aValue > (771 -threshold)) &&(aValue < (771 + threshold)))
 key = KEY_8;
 if((aValue > (759 -threshold)) &&(aValue < (759 + threshold)))
 key = KEY_9;
 if((aValue > (746 -threshold)) &&(aValue < (746 + threshold)))
 key = KEY_C;
 if((aValue > (729 -threshold)) &&(aValue < (729 + threshold)))
 key = KEY_STAR;
 if((aValue > (717 -threshold)) &&(aValue < (717 + threshold)))
 key = KEY_0;
 if((aValue > (707 -threshold)) &&(aValue < (707 + threshold)))
 key = KEY_HASH;
 if((aValue > (696 -threshold)) &&(aValue < (696 + threshold)))
 key = KEY_D;
 lastValue = millis();
 }
if(Key==KEY_A)
 return key;
}

Sorry, das man das so angeben kann wusste ich nicht :smiley:

ich muss doch die Tasten als Char auslesen wegen den Buchstaben, aber die Zahlen sollten ja als int behandelt werden und wo abgespeichert werden, aber ich weiß einfach nicht wie das funktionieren soll.

und das void loop ist

void loop(){
  char Key = AnMatrixKeypad.readKey();
  if(Key != KEY_NOT_PRESSED)
    Serial.println(Key);
}

Aber ich möchte ja das alles nicht auf dem Serial haben, sondern auf einer int Variablen abspeichern, diese einmal ausgeben auf einer LCD anzeigen, und die int Zahl soll benutzt werden um eine bestimmte Anzahl als Schleifen durchgänge zu bestreiten

Die Idee war nicht nochmal alles schreiben sondern den ersten Post zu modifizieren.

Grüße Uwe

Du würdest dir das einfacher machen, wenn du erst alles in einem "normalen" Sketch schreibst, bis es so funktioniert wie du es haben möchtest. Und danach eine Library daraus baust.

Sorry, das man das so angeben kann wusste ich nicht :-D

Und das steht hier:

How to use this forum - please read.

Muck93: void loop(){   char Key = AnMatrixKeypad.readKey();   if(Key != KEY_NOT_PRESSED)     Serial.println(Key); }

jetzt wird es klarer.

Du musst die einzelnen Charakter einer Stelle deiner Zahl zuordnen und in einer integer Variablen abspeichern.

das kann man z.B. so machen:

byte digit =0;
int number = 0;

void loop(){
  char Key = AnMatrixKeypad.readKey();
  if(Key != KEY_NOT_PRESSED){
    Serial.println(Key);
    switch (digit){
      case 0:  // erste Ziffer (1er-Stelle) wird eingelesen
        number = Key - 48;    // char wird umgerechnet in int (nach ASCII-Tabelle)
        digit++;
      break;
      case 1:   // 2. Ziffer (10-er Stelle) wird eingelesen.
        number = number + (Key - 48)*10;  // Taste mit 10 multiplizieren und zu number addieren
        digit++;
      break;
      case 2:   // 3. Stelle (100er) wird eingelesen
        number = number + (Key - 48)*100;  // mit 100 multiplizieren und addieren
        digit++;
      break;
      case 3:  // "4.Stelle" muss 'A' sein zum Abschluss
        if (Key == KEY_A){
          Serial.print("Eingegebene Zahl: ");
          Serial.println(number);
          digit = 0;
        }
      break;
      default:
        Serial.println(" Eingabefehler ");
        digit = 0;
        number = 0;
      break;
     } // end switch
  } // end if KEYPRESSED
} // end loop

Der Nachteil dieser Methode ist, dass die Zahl "von hinten" eingegeben wird. Es ist auch keinerlei Überprüfung gegen "Vertippen" drin. aber das kriegst du sicher hin. :)

@guntherb

Du bist Genial, vielen vielen dank für die schnelle hilfe :-)