仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值
问题背景
标准 4×3 矩阵键盘需 7 个数字 IO(4 行 + 3 列),在 Uno/Nano 等引脚紧张的场景下占用过多。本文提出仅用 3 个模拟输入引脚(A0/A1/A2),通过精心设计的电阻分压网络,将 12 个按键映射为 3 路互不重叠的电压区间,实现零库依赖、低资源占用的按键检测。
电路原理
拓扑结构
每列接一只公共下拉电阻 R5=R6=R7=1kΩ 至地;每行通过不同阻值电阻接 VCC:
- Row1(键 1,2,3):直接接 VCC(等效 R1=0Ω)
- Row2(键 4,5,6):R2=1kΩ
- Row3(键 7,8,9):R3=3kΩ
- Row4(键 *,0,#):R4=10kΩ(原文为 330Ω+1k+3k 组合,简化为单一上拉电阻)
按下某键时,对应列被拉高至该行分压电压,其余列保持 0V。ADC 读取三列电压,非零列即为按键所在列,电压幅度对应行号。
电压区间设计(5V 供电,10-bit ADC,0~1023)
| 行 | 按键 | 理论电压(V) | ADC 值 | 容差窗口(±100) |
|---|---|---|---|---|
| Row1 | 1/2/3 | 5.00 | 1023 | 923~1123 |
| Row2 | 4/5/6 | 2.50 | 512 | 412~612 |
| Row3 | 7/8/9 | 1.25 | 256 | 156~356 |
| Row4 | */0/# | 0.45 | 92 | 0~192(需调整) |
原文给出的实测窗口:Row1 923~1123、Row2 669~869、Row3 412~612、Row4 156~356(单位 ADC 值)。通过选用 1% 精度电阻或软件校准可进一步扩大间隔。
Arduino 实现代码
/* Analog 4x3 Keypad - 3 Analog Inputs
* G. Carrera 2018
*/
const int NADCmin[4] = {923, 669, 412, 156};
const int NADCmax[4] = {1123, 869, 612, 356};
const char keyMap[12] = {'1','4','7','*', // Col0: Row1~Row4
'2','5','8','0', // Col1
'3','6','9','#'}; // Col2
int keyVal[3];
void setup() { Serial.begin(9600); }
void loop() {
char k = readKeypad();
if (k != 'N') {
Serial.print("Key: "); Serial.println(k);
delay(300); // 简单去抖
}
}
char readKeypad() {
scanColumns();
// 无按键:三列和 < 40 (约 0.2V)
if (keyVal[0] + keyVal[1] + keyVal[2] < 40) return 'N';
delay(10); // 去抖
scanColumns();
// 识别哪列非零
for (int c = 0; c < 3; c++) {
if (keyVal[c] > 40) {
int v = keyVal[c];
for (int r = 0; r < 4; r++) {
if (v >= NADCmin[r] && v <= NADCmax[r]) {
return keyMap[c * 4 + r];
}
}
}
}
return 'N';
}
void scanColumns() {
keyVal[0] = analogRead(A0); delay(1);
keyVal[1] = analogRead(A1); delay(1);
keyVal[2] = analogRead(A2); delay(1);
}
扩展至 4×4 键盘
增加第 4 列:再接一路模拟输入 A3,复用相同的行电阻网络,即可支持 16 键。同理可扩展至更多列,仅受限于可用模拟输入数量(Uno 6 路,最多 5 列 20 键)。
优缺点分析
| 优点 | 缺点 |
|---|---|
| 节省数字 IO,释放引脚给其他外设 | 需精密电阻(建议 1%)或软件校准 |
| 无需扩展芯片(如 MCP23017、74HC165) | 长导线易受干扰,ADC 抖动需软件滤波 |
| 元件成本极低(6 个电阻) | 不支持多键同时按下(单键扫描) |
| 代码简单,无第三方库依赖 | 3.3V 系统下 ADC 参考电压变化,阈值需重标定 |
实物原型

作者用废弃按键手工搭建原型,5 针排针接 Arduino,验证方案可行。
原理图

制造工艺
- Arduino + Excel 驱动 8×8 与 16×16 WS2812 RGB 矩阵动画编程
- 智能缺水报警器 – DIY植物土壤湿度监测装置
- 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
- 基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
- 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
- 为Arduino构建隔离模拟输入电路
- RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
- 两个电阻自制 Arduino UNO 视频输出线(RCA/TVout)
- Arduino UNO 精准视觉反应时间测试仪