Skip Navigation
 

das Schema

der Testaufbau

Amateurfunk - HAM info » Funduino (Arduino) Projekte

3/2018 Tastatur Encoder für 25 Tasten

Ein Tastenfeld abzufragen und einen Code daraus zu generieren kann man auf verschiedene Arten lösen.
- Einen Key Encoder Baustein
- mit Matrix-Anschluss Eingängen
- mit einer Widerstands Reihe
       
Die Winderstands Reihe hat den grossen Vorteil dass man gerade mal einen analogen Eingang für alle 25 Tasten belegt.
   
Grund für die Tastatur (die dann an der Frontplatte des Gehäuses zu bedienen ist):
Ich will den Antrieb der Sat Steuerung auch von Hand einstellen können.
Ich hatte dazu einfach mal die IR-Fermbedienung programmiert, doch im realen Betrieb ist eine Fernsteuerung nicht nötig.
Also per Tastenfeld.
Man könnte die auch in einem Menu System lösen. Dagegen spricht dass alles schnell und unkompliziert zu bedienen ist.


Der Arduino hat auch Analog Eingänge mit einer 10 Bit Auflösung (1024).
Nehme ich die 5 Volt, teile sie durch die gewünschen 25 Tasten so erhalte ich einen Spannungswert der problemlos aufgelöst werden kann.
Gehe ich von ca 10 kOhm aus die an 5 Volt hängen, ergibt dies bei 25 Tasten einen Wert von 400 Ohm, der nächste Wert ist 390 Ohm. Bei 1% Toleranz (SMD 1206) sind die Werte gut zu lesen.

   

Ich habe hier nun testhalber einen Sketch geschrieben der mit die Werte decodiert, besser gesagt mapt.
Der map Befehl erzeugt aus einer Reihe analog Werte Long Werte zB:

xy = map(eingang, 4, 1022, 0, 25)

dh also der Wert xy wird generiert aus dem Wert eingang.
Und zwar ergibt der eingang 4 ein xy von 0, der eingang 1022 ergibt dann xy 25.
Alle anderen Werte schön linear dazwischen.
Inwiefern die 1% Windestände dann genau passen wird sich im realen Aufbau zeigen. Doch das kann mit den map Werten etwas korrigiert werden.
Ggf gibt es zum Nachhelfen noch den Befehl constrain dafür.

 
Dazu die Hardware aufgebaut mit:
- Arduino UNO
- I2C LCD Display
- 10 kOhm Potentiometer
Mit dem10 kOhm Potentiometer simuliere ich die Widerstandsreihe.

                               

Hier nun der Sketch:
************************************************************************************
// Version 28.3.2018 Erich Rieder HB9FIH
// das Programm liest den Spannungswert an A3 und gibt den digital aus
// für ein Tastenfeld mit 25 Tasten mit 390 1% Ohm Widerständen die gedrückte Taste zu codieren

int eingang = A3 ; // analog kommt von Pin A3
long wert = 0;
long wertm = 0;
long wertmv = 0;
boolean anzeigen= false;    // Werte anzeigen
String StepsEingabeT = "";
#include <Wire.h>                     //Wire  Library
#include <LiquidCrystal_I2C.h>        //I2C LCD Display Library
LiquidCrystal_I2C lcd(0x27, 16, 2); // Instanz lcd initialisieren, I2C Adresse sowie Type (16 Zch auf 2 Zln)  bestimmen.
// A5 = SCL / A4 = SDA


void setup() {

delay(1000);

//  Serial.begin(9600);
//  Wire.begin();
wert = analogRead(eingang);

lcd.begin();                      // LCD starten und erste Anzeige
lcd.backlight();
lcd.clear();
lcd.print("Taste: ");
lcd.setCursor(0, 1);
lcd.print("M :");
lcd.print(wertm);
lcd.print(" W :");
lcd.print(wert);
}


void loop() {

wert = analogRead(eingang);
wertm = map(wert, 4, 1022, 0, 25);

 
anzeigen = true;
//  Serial.println("Taste: ");
//  Serial.print(results.value, DEC);


delay(300);

switch (wertm) {
  case 0:
     StepsEingabeT = "CH-";
    break;
  case 1:
      StepsEingabeT = "CH";
    break;
      case 2:
      StepsEingabeT = "CH+";
    break;
  case 3:
      StepsEingabeT = "<<-";
    break;  
  case 4:
      StepsEingabeT = "->>" ;
    break;   
  case 5:
      StepsEingabeT = ">||";
    break; 
  case 6:
      StepsEingabeT = "-";
     break;
  case 7:
      StepsEingabeT = "+";
         break;
  case 8:
      StepsEingabeT = "EQ";
    break; 
  case 9:
      StepsEingabeT = "0"; 
    break;
  case 10:
      StepsEingabeT = "1";
    break;
  case 11:
      StepsEingabeT = "2";
    break;
  case 12:
      StepsEingabeT = "3";
    break;
  case 13:
      StepsEingabeT = "4";
    break;
  case 14:
      StepsEingabeT = "5";
    break;  
  case 15:
      StepsEingabeT = "6";
    break;
  case 16:
      StepsEingabeT = "7";
    break;
  case 17:
      StepsEingabeT = "8";
    break;  
  case 18:
      StepsEingabeT = "9";
    break;
  case 19:
      StepsEingabeT = "100+";
    break;
  case 20:
      StepsEingabeT = "200+";
     break;
  case 21:
      StepsEingabeT = "LD";
    break;   
  case 22:
      StepsEingabeT = "22";
    break;
  case 23:
      StepsEingabeT = "23";
    break;  
  case 24:
      StepsEingabeT = "24";
    break;
  case 25:
      StepsEingabeT = "25";
    break;                  
  default:
    anzeigen = false;
  break;
      
}

// nur wenn der wertm (wert map) gleich ist als der wertmv (wert map vorher) dann nicht anzeigen
if (wertmv == wertm) {
   anzeigen = false;
  }

// Anzeige der Taste und Werte
if (anzeigen == true) {
lcd.clear();
lcd.print("Taste: ");
lcd.print(StepsEingabeT);    // anzeigen des gedrückten Tasten Codes
lcd.setCursor(13, 0);
lcd.print(" ");             // anzeigen der gedrückten Taste
lcd.setCursor(0, 1);
lcd.print("M :");
lcd.print(wertm);
lcd.print(" W :");
lcd.print(wert);
anzeigen = false;
wertmv = wertm;
}

}
*************************************************

 
 
« zurück|drucken