You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 Wroom 38引脚版按键捕获串口输出故障求助

ESP32 键盘矩阵扫描无输出问题排查方案

1. 优先解决引脚冲突问题

你的行引脚使用了GPIO1(Serial TX)和GPIO0(BOOT引脚),这两个引脚有特殊功能,会干扰正常工作:

  • GPIO1是ESP32默认的串口发送引脚,当你把它设为INPUT_PULLUP时,会和串口输出冲突,导致按键信息无法正常发送到串口监视器。
  • GPIO0是启动模式引脚,虽然运行时可作为普通IO,但硬件连接若导致该引脚电平异常,可能影响系统启动或信号检测。

修复方案:替换这两个引脚为普通IO口,比如38引脚ESP32 Wroom的GPIO5、GPIO18这类闲置引脚,修改行/列引脚定义:

const byte rowPins[numRows] = {5, 3, 17, 4}; // 替换GPIO1为GPIO5
const byte colPins[numCols] = {16, 18, 2, 15, 13, 12, 14, 27, 26, 25, 33, 32}; // 替换GPIO0为GPIO18

2. 硬件连接验证

  • 用万用表检测:未按键时,所有行引脚应为高电平(INPUT_PULLUP生效);按下某按键后,对应的行引脚应被拉低(因为连接到拉低的列引脚)。
  • 检查键盘矩阵的焊接/接线:确认每个按键的一端接行引脚,另一端接列引脚,无虚焊、短路或接反情况。

3. 优化扫描逻辑与防抖

当前代码的防抖逻辑仅在检测到按键时延迟,会导致扫描效率低且可能漏检,修改为等待按键释放+防抖的逻辑,避免重复触发:

void loop() {
  for (int col = 0; col < numCols; col++) {
    digitalWrite(colPins[col], LOW);
    delayMicroseconds(10); // 等待电平稳定
    for (int row = 0; row < numRows; row++) {
      if (digitalRead(rowPins[row]) == LOW) {
        char key = keyMap[row][col];
        if (key != ' ') {
          Serial.print(key);
        }
        // 等待按键释放,避免重复输出
        while (digitalRead(rowPins[row]) == LOW);
        delay(20); // 防抖延迟
      }
    }
    digitalWrite(colPins[col], HIGH);
  }
}

4. 添加调试输出定位问题

在代码中加入行列电平的调试打印,确认扫描逻辑是否正常:

void loop() {
  for (int col = 0; col < numCols; col++) {
    digitalWrite(colPins[col], LOW);
    delayMicroseconds(10);
    for (int row = 0; row < numRows; row++) {
      int pinState = digitalRead(rowPins[row]);
      // 打印当前行列的电平状态
      Serial.print("Col: "); Serial.print(col);
      Serial.print(" | Row: "); Serial.print(row);
      Serial.print(" | State: "); Serial.println(pinState);
      
      if (pinState == LOW) {
        char key = keyMap[row][col];
        if (key != ' ') {
          Serial.print("Pressed Key: "); Serial.println(key);
        }
        while (digitalRead(rowPins[row]) == LOW);
        delay(20);
      }
    }
    digitalWrite(colPins[col], HIGH);
    delay(10); // 列扫描间隔,降低CPU占用
  }
}

通过串口监视器的输出,你可以清楚看到每个行列的电平变化,判断是硬件连接问题还是代码逻辑问题。

5. 内部上拉电阻验证

如果行引脚未按键时电平不是高电平,说明内部上拉电阻未生效:

  • 检查引脚是否被正确配置为INPUT_PULLUP;
  • 若键盘连线较长,可在每个行引脚与VCC之间外接10kΩ的上拉电阻,增强信号稳定性。

内容的提问来源于stack exchange,提问作者user22397127

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:54:52