Arduino 键盘矩阵示例? (青少年杜伊诺)

Arduino keypad matrix example? ( teensyduino )

我是初学者,使用带有 Teensy 3.2 板的 Arduino 并将其编程为 USB 键盘。 我有两个 4 键薄膜开关。它们的按钮触点位于引脚 1-8 上,第 9 引脚将两个薄膜开关的 "ground" 线或任何它的真实名称焊接在一起;完成电路的线路。

基本上,当您按下按钮时,它们应该分别简单地键入 "a, b, c..."。有人告诉我我需要为此使用矩阵。

我正在寻找一个示例,说明如何编写有效支持一个 row/9 列行的键盘矩阵(反之亦然?)我一直无法在线找到该解决方案。

到目前为止我只有这段代码,当按下第二个引脚上的按钮时,它会发送大量 "AAAAAAAAAAAAAAAA" 击键。

void setup() {
  // make pin 2 an input and turn on the 
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  //if the button is pressed
  if(digitalRead(2)==LOW){
    //Send an ASCII 'A', 
    Keyboard.write(65);
  }
}

有人能帮忙吗?

首先,1 行键盘不是矩阵。或者更好,从技术上讲,它可以被认为是一个矩阵,但是......矩阵键盘是这样的:

看到了吗?为了扫描这个你必须

  1. 将第 1 行接地,同时让第 2-4 行悬空
  2. 读取 Col1-4 的值。这些是开关 1-4
  3. 的值
  4. 将第 2 行接地,同时让第 1 行和第 3-4 行悬空
  5. 读取 Col1-4 的值。这些是开关 5-8
  6. 的值

依此类推,对于所有行

至于另一个问题,当按钮处于低位时,您正在打印 A。您想要实现的是仅在引脚的下降沿打印 A(理想情况下每个压力打印一次),因此

char currValue = digitalRead(2);
if((currValue==LOW) && (oldValue==HIGH))
{
    //Send an ASCII 'A', 
    Keyboard.write(65);
}
oldValue = currValue;

当然需要在loop函数外声明oldValue,在main中初始化为HIGH

使用此代码,您不会收到大量的“A”,但是每次按下按钮时您都会看到大约 5-10 个“A”。为什么?因为按钮的弹跳。这就是去抖动技术的用途!

我建议您查看 class Bounce2 以获得易于使用的 class 按钮。如果你更喜欢一些代码,我为另一个问题写了这个小代码:

#define CHECK_EVERY_MS 20
#define MIN_STABLE_VALS 5

unsigned long previousMillis;
char stableVals;
char buttonPressed;

...

void  loop() {
    if ((millis() - previousMillis) > CHECK_EVERY_MS)
    {
        previousMillis += CHECK_EVERY_MS;
        if (digitalRead(2) != buttonPressed)
        {
            stableVals++;
            if (stableVals >= MIN_STABLE_VALS)
            {
                buttonPressed = !buttonPressed;
                stableVals = 0;

                if (buttonPressed)
                {
                    //Send an ASCII 'A', 
                    Keyboard.write(65);
                }
            }
        }
        else
            stableVals = 0;
    }
}

在这种情况下,不需要检查以前的值,因为函数已经有一个点,只有在状态改变时才会到达。

但是,如果您必须将此用于更多按钮,则必须复制整个代码(并且还要使用更多 stableVals 变量)。这就是我建议您使用 Bounce2 class 的原因(它会做类似这样的事情,但是,因为它全部包含在 class 中,您不需要为变量操心)。