如何在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
相关产品推荐
相关产品推荐

