Arduino Micro触发,无接触

时间:2013-01-05 17:05:13

标签: arduino

我正在使用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;
     }
}

1 个答案:

答案 0 :(得分:3)

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

  

请注意

     

如果引脚未连接到任何东西,则digitalRead()可以返回
  高或低(这可以随机改变)。

     

see reference page for digitialRead()

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

  

Atmega内置了方便的20K上拉电阻   可以从软件访问的芯片。这些内置上拉   以下列方式访问电阻器。

     

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

     

see Digital Pins

所以在你的情况下,在setup()中添加四个digitalWrite()以启用上拉,你看起来很棒。