Bespaar Arduino-pins: Sluit een 4x3-toetsenblok aan met slechts 3 verbindingen
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| 4x3 matrix 12-toets keypad | 1 |
| Weerstand 330Ω | 1 |
| Weerstand 1kΩ | 3 |
| Weerstand 3kΩ | 1 |
Benodigde tools
- Solderbout
Apps en online diensten
- Arduino IDE
Over dit project
Inleiding
Een standaard 4x3-matrix-keypad vereist 4+3 = 7 digitale pinnen. Op een Uno of Nano is dat veel. Dit project reduceert dat tot 3 analoge ingangen met een slimme weerstandsladder.
Mijn oplossing
Elke kolom heeft een eigen weerstandsladder (R5=R6=R7=1kΩ). De rijen hebben verschillende weerstanden: R1=0Ω (draad), R2=330Ω, R3=1kΩ, R4=3kΩ. Wanneer een toets wordt ingedrukt, ontstaat een spanningsdeler met een unieke spanning per toets per kolom.
De resulterende ADC-waarden (0–1023) liggen ver uit elkaar, zelfs met 5% tolerante weerstanden:
- Rij 1 (R1=0): ~1023 (5V)
- Rij 2 (330Ω): ~669–869
- Rij 3 (1kΩ): ~412–612
- Rij 4 (3kΩ): ~156–356
- Geen toets: 0V
Met een extra analoge ingang en weerstand kan dit uitgebreid worden naar 4x4.
Arduino-aansluiting
Kolom 1 → A0, Kolom 2 → A1, Kolom 3 → A2. (Pinnen vrij te kiezen, mits analoge ingang).
Ik bouwde een prototype met gerecycled toetsen en een 5-pins connector. Werkt perfect.
Code
Analog4x3Keybf.ino – Testprogramma
/* Analog4x3Keybf - test 4x3 keypad met 3 analoge uitgangen
* G. Carrera - 19/11/2018
*/
const int NADCm100[4] = {923, 669, 412, 156}; // ondergrenzen
const int NADCp100[4] = {1123, 869, 612, 356}; // bovengrenzen
const char key[13] = {'1','4','7','C','2','5','8','0','3','6','9','E'};
int keyval[3];
int i, colp, val;
void setup() {
Serial.begin(9600);
}
void loop() {
char k = KeyPad();
if (k != 'N') {
Serial.print("toets = ");
Serial.println(k);
delay(500);
}
}
char KeyPad() {
KeyScan();
if (keyval[0] + keyval[1] + keyval[2] < 40) return 'N'; // niets ingedrukt
delay(10); // anti-bounce
KeyScan();
for (i = 0; i < 3; i++) {
if (keyval[i] > 40) {
colp = i;
val = keyval[i];
for (int j = 0; j < 4; j++) {
if (val >= NADCm100[j] && val <= NADCp100[j]) {
return key[colp * 4 + j];
}
}
}
}
return 'N';
}
void KeyScan() {
keyval[0] = analogRead(A0); delay(1);
keyval[1] = analogRead(A1); delay(1);
keyval[2] = analogRead(A2); delay(1);
}
Schema
Zie schematische tekening: 3 kolommen, elk met R5/R6/R7 (1kΩ) naar GND. Rijen: R1 (draad), R2 (330Ω), R3 (1kΩ), R4 (3kΩ) naar 5V. Kolom-uitgangen naar A0, A1, A2.
Productieproces
- Bouw en programmeer 8x8 & 16x16 WS2812 RGB LED-matrix animaties met Arduino en Excel
- Slimme Plantenalarmer – DIY Sensor voor Optimale Hydratatie
- Bouw een Italiaanse Woordklok met Arduino Nano, NeoPixel, LCD en RTC
- Bouw een Betrouwbare Sigfox kWh Meter met Arduino MKR Fox 1200
- Bluetooth Temperatuurmeter met Arduino Nano
- Contactloos Gebaarslot: Veilige toegang met APDS-9960 en Arduino
- Arduino Nano Companion Kit – Essentiële Componenten & Hulpmiddelen voor DIY Electronica
- USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst
- Geïsoleerde analoge ingangsschakeling voor Arduino bouwen
- RGB 32-band audio-spectrumvisualisator – Arduino LED-matrixproject
- Precisie Reactietijd Test met Arduino UNO