我正在使用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;
}
}
答案 0 :(得分:3)
默认情况下,输入为高阻抗。根据你对行为的描述,我猜你没有添加外部上拉/下拉电阻,并且引脚连接到常开开关。随机输入将与预期的一样,并在documentialRead()的文档中注明:
请注意
如果引脚未连接到任何东西,则digitalRead()可以返回
高或低(这可以随机改变)。
微型确实具有提供内部上拉的能力。 您的代码未显示您已启用内部上拉电阻。通过写入输入引脚,可以看起来很奇怪。来自Arduino文档:
Atmega内置了方便的20K上拉电阻 可以从软件访问的芯片。这些内置上拉 以下列方式访问电阻器。
pinMode(引脚,INPUT); //设置引脚输入
digitalWrite(pin,HIGH); //打开上拉电阻
所以在你的情况下,在setup()中添加四个digitalWrite()以启用上拉,你看起来很棒。