2

我正在使用 Arduino Micro 在我拥有的前端触发特定事件。然而,出于某种原因,一些关键组合只是随机触发。发生这种情况时,我什至没有碰 arduino。

我已经设置好了,所以当你按下一个按钮时,它只会触发一次击键,而不是在按下按钮时重复它。

我错过了什么,或者搞砸了什么?

int escButton = 12, valEsc, valEsc2, stateEsc;
int volUp = 11, valVup, valVup2, stateVup;
int volDown = 10, valVdown, valVdown2, stateVdown;
int rebootButton = 9, valReboot, valReboot2, stateReboot;

char ctrlKey = KEY_LEFT_GUI;
char shiftKey = KEY_LEFT_SHIFT;

void pressKeyCombos(int combo){
 switch(combo) {
   case 1:
       Keyboard.press(KEY_ESC);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 2:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F1);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 3:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F3);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 4:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F2);
       delay(100);
       Keyboard.releaseAll();
   break;
 }
}

void setup() {
     pinMode(escButton, INPUT);
     stateEsc = digitalRead(escButton);
     Keyboard.begin();
}

void loop(){
     valEsc = digitalRead(escButton);
     delay(10);
     valEsc2 = digitalRead(escButton);

     valVup = digitalRead(volUp);
     delay(10);
     valVup2 = digitalRead(volUp);

     valVdown = digitalRead(volDown);
     delay(10);
     valVdown2 = digitalRead(volDown);

     valReboot = digitalRead(rebootButton);
     delay(10);
     valReboot2 = digitalRead(rebootButton);

     if (valVup == valVup2) {                 
       if (valVup != stateVup) {           
         if (valVup == LOW) {              
           pressKeyCombos(4);
         }
       }
       stateVup = valVup;
     }

     if (valVdown == valVdown2) {                 
       if (valVdown != stateVdown) {           
         if (valVdown == LOW) {              
           pressKeyCombos(3);
         }
       }
       stateVdown = valVdown;
     }

     if (valReboot == valReboot2) {                 
       if (valReboot != stateReboot) {           
         if (valReboot == LOW) {              
           pressKeyCombos(2);
         }
       }
       stateReboot = valReboot;
     }

     if (valEsc == valEsc2) {                 
       if (valEsc != stateEsc) {           
         if (valEsc == LOW) {              
           pressKeyCombos(1);
         }
       }
       stateEsc = valEsc;
     }
}
4

1 回答 1

3

默认情况下,输入为高阻抗。根据您对行为的描述,我可以猜测您没有添加外部上拉/下拉电阻,并且引脚连接到常开开关。随机输入将与预期的一样,并在 digitialRead() 的文档中注明:

笔记

如果引脚没有连接到任何东西,digitalRead() 可以返回
HIGH 或 LOW(这可以随机更改)。

请参阅 digitalRead() 的参考页

微型确实有能力提供内部上拉。您的代码未显示您已启用内部上拉电阻。这是通过写入输入引脚以一种看起来很奇怪的方式完成的。来自 Arduino 文档:

Atmega 芯片中还内置了方便的 20K 上拉电阻,可以通过软件进行访问。这些内置上拉电阻可以通过以下方式访问。

pinMode(引脚,输入);// 将 pin 设置为输入
digitalWrite(pin, HIGH); //开启上拉电阻

见数字引脚

所以在你的情况下,在 setup() 中添加四个 digitalWrite() 来启用引体向上,你看起来不错。

于 2013-01-06T05:06:29.417 回答