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

如何在Arduino上同时读取3×3干簧管阵列?

如何在Arduino上同时读取3×3干簧管阵列状态

嘿,我看你已经搭好了3×3干簧管阵列的基础代码框架,接下来咱们把它补全,实现完整的状态读取功能。首先得明确干簧管的连接方式:每个干簧管的一端接对应的行引脚,另一端接对应的列引脚,这样我们就能用矩阵扫描的方式快速读取所有干簧管的通断状态。

完整实现代码

const byte rows = 3; 
const byte cols = 3; 
byte rowPins[rows] = {3, 4, 5}; 
byte colPins[cols] = {7, 8, 9}; 
// 可选:给每个干簧管对应一个标识,方便识别位置
char keys[rows][cols] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'} }; 
// 存储每个干簧管的状态:0=断开,1=闭合
int result[rows][cols] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; 

void setup() { 
  Serial.begin(9600); 
  pinMode(13, OUTPUT); 

  // 配置行引脚:输出模式,初始设为高电平
  for (int i = 0 ; i < rows; i++) {
    pinMode(rowPins[i], OUTPUT);
    digitalWrite(rowPins[i], HIGH);
  }

  // 配置列引脚:输入模式,启用内部上拉电阻
  // 这样干簧管断开时,列引脚会保持高电平;闭合时会被行引脚拉低
  for (int j = 0 ; j < cols; j++) {
    pinMode(colPins[j], INPUT_PULLUP);
  }
} 

void loop() { 
  // 逐行扫描
  for (int row = 0; row < rows; row++) {
    // 拉低当前行引脚
    digitalWrite(rowPins[row], LOW);
    
    // 读取当前行所有列的状态
    for (int col = 0; col < cols; col++) {
      // 因为启用了上拉,干簧管闭合时列引脚会读到LOW
      if (digitalRead(colPins[col]) == LOW) {
        result[row][col] = 1; // 标记为闭合状态
        digitalWrite(13, HIGH); // 可选:触发板载LED提示有干簧管闭合
      } else {
        result[row][col] = 0; // 标记为断开状态
        digitalWrite(13, LOW); // 可选:无闭合时关闭LED
      }
    }
    
    // 恢复当前行引脚为高电平,避免影响下一行扫描
    digitalWrite(rowPins[row], HIGH);
  }

  // 打印所有干簧管的状态(可选,用于调试)
  Serial.println("当前干簧管状态:");
  for (int row = 0; row < rows; row++) {
    for (int col = 0; col < cols; col++) {
      Serial.print(result[row][col]);
      Serial.print(" ");
    }
    Serial.println();
  }
  Serial.println("-------------------");
  delay(500); // 控制打印频率,避免串口输出太频繁
}

代码工作原理

  • 引脚配置:行引脚设为输出,初始高电平;列引脚设为输入并启用内部上拉,这样干簧管断开时列引脚默认是高电平。
  • 矩阵扫描:逐行拉低行引脚,此时如果某一列对应的干簧管闭合,该列引脚会被拉低,我们通过digitalRead就能检测到这个状态,并存入result数组。
  • 状态输出:扫描完成后,把result数组的内容通过串口打印,你可以在Arduino IDE的串口监视器里看到每个干簧管的通断状态。

注意事项

  • 确保干簧管的连接正确:每个干簧管的两端分别连接对应的行引脚和列引脚,正反不影响导通,但要保证行列对应关系准确。
  • 如果干簧管闭合时串口没检测到状态变化,可以检查引脚接线是否松动,或者尝试把INPUT_PULLUP换成外部10kΩ上拉电阻。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:49