Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie nach dem Kauf auftretende Probleme und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.

  • Spezielle Rabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und festlichen Aktionen teil.

👉 Bereit, mit uns zu entdecken und zu kreieren? Klicken Sie auf [hier] und treten Sie noch heute bei!

2.1.5 Tastenfeld

Einführung

Ein Tastenfeld ist ein rechteckiges Array von Tasten. In diesem Projekt werden wir es verwenden, um Zeichen einzugeben.

Komponenten

../_images/list_2.1.5_keypad1.png

Schaltplan

../_images/image3151.png ../_images/image3161.png

Experimentelle Vorgehensweise

Schritt 1: Bauen Sie die Schaltung auf.

../_images/image1861.png

Schritt 2: Öffnen Sie die Code-Datei.

cd ~/davinci-kit-for-raspberry-pi/nodejs/

Schritt 3: Führen Sie den Code aus.

sudo node keypad.js

Nach dem Ausführen des Codes werden die Werte der gedrückten Tasten auf dem Tastenfeld (Tastenwert) auf dem Bildschirm angezeigt.

Code

const Gpio = require('pigpio').Gpio;

var rowsPins = [18,23,24,25];
var colsPins = [10,6,27,17];
var keys = ["1","2","3","A",                "4","5","6","B",                "7","8","9","C",                "*","0","#","D"];

for(let i=0;i<rowsPins.length;i++){
    rowsPins[i] = new Gpio(rowsPins[i],{mode: Gpio.OUTPUT})
}
for(let i=0;i<colsPins.length;i++){
    colsPins[i] = new Gpio(colsPins[i],{
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.RISING_EDGE
    })
}

var last_key_pressed = 0;

var col=-1;
for(let i=0;i<colsPins.length;i++){
    colsPins[i].on('interrupt',()=>{
        col=i;
        pressed_keys=keys[row*colsPins.length+col];
        if(last_key_pressed!=pressed_keys){
            console.log(`${pressed_keys}`);
        }
        last_key_pressed = pressed_keys;
    });
}

var row=-1;
setInterval(() => {
    row=(row+1)%rowsPins.length;
    for(let i=0;i<rowsPins.length;i++){
        rowsPins[i].digitalWrite(0);
    }
    rowsPins[row].digitalWrite(1);
}, 10);

Code Erklärung

const Gpio = require('pigpio').Gpio;

var rowsPins = [18,23,24,25];
var colsPins = [10,6,27,17];
var keys = ["1","2","3","A",                "4","5","6","B",                "7","8","9","C",                "*","0","#","D"];

for(let i=0;i<rowsPins.length;i++){
    rowsPins[i] = new Gpio(rowsPins[i],{mode: Gpio.OUTPUT})
}
for(let i=0;i<colsPins.length;i++){
    colsPins[i] = new Gpio(colsPins[i],{
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.RISING_EDGE
    })
}

Deklarieren Sie im Stil des Tastenfelds zwei Sets von Pins und eine Matrix.

Vier der Pins sind die Zeilen des Tastenfelds, setzen Sie diese Pins auf OUTPUT-Modus; Die anderen vier Pins sind die Spalten des Tastenfelds, setzen Sie diese Pins auf INPUT-Modus und aktivieren Sie den steigenden Flankeninterrupt für sie.

Das Prinzip, nach dem der Hauptcontroller den Tastenwert erhalten kann, ist wie folgt: Die vier Zeilen-Pins liefern nacheinander ein hohes Signal. Wenn eine Taste gedrückt wird, wird der entsprechende Spalten-Pin das hohe Signal des Zeilen-Pins erhalten, was den steigenden Flankeninterrupt auslösen wird.

Beispielsweise, wenn ich die Taste 3 drücke, hat das Freisetzen des hohen Signals durch die 2., 3. und 4. Zeilen-Pins keinen Effekt; Wenn der Zeilen-Pin in der ersten Position das hohe Signal freisetzt, wird der dritte Spalten-Pin das hohe Signal erhalten und den steigenden Flankeninterrupt auslösen. Zu diesem Zeitpunkt lösen der 1., 2. und 4. Spalten-Pin keine Ereignisse aus.

Dann kann der Hauptcontroller anhand des 1. Zeilen-Pins, der das hohe Signal freisetzt, und des 3. Spalten-Pins, der das hohe Signal erhält, wissen, dass die Position der gedrückten Taste (1,3) ist, was die Taste 3 ist.

../_images/image1871.png
var row=-1;
setInterval(() => {
    row=(row+1)%rowsPins.length;
    for(let i=0;i<rowsPins.length;i++){
        rowsPins[i].digitalWrite(0);
    }
    rowsPins[row].digitalWrite(1);
}, 10);

Die vier Zeilen-Pins werden periodisch mit hoher Spannung versorgt, und die Variable row wird verwendet, um den aktuell arbeitenden Zeilen-Pin zu lokalisieren.

var col=-1;
for(let i=0;i<colsPins.length;i++){
    colsPins[i].on('interrupt',()=>{
        col=i;
        // pressed_keys=keys[row*colsPins.length+col];
        // if(last_key_pressed!=pressed_keys){
        //     console.log(`${pressed_keys}`);
        // }
        // last_key_pressed = pressed_keys;
    });
}

Richten Sie Interrupt-Funktionen für die vier Spalten-Pins ein, und die Variable col wird verwendet, um die Spalten-Pins zu lokalisieren, die das Ereignis des steigenden Flankeninterrupts auslösen.

pressed_keys=keys[row*colsPins.length+col];
if(last_key_pressed!=pressed_keys){
    console.log(`${pressed_keys}`);
}
last_key_pressed = pressed_keys;

Es gibt auch einen Codeabschnitt in der Interrupt-Funktion, um den spezifischen Tastenwert aus der keys-Matrix gemäß row und col zu erhalten. Und jedes Mal, wenn Sie einen neuen Tastenwert erhalten, drucken Sie den Wert aus.

Phänomenbild

../_images/image1881.jpeg