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
Schaltplan
Experimentelle Vorgehensweise
Schritt 1: Bauen Sie die Schaltung auf.
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.
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