Arduino:按钮无法解释的行为

时间:2012-04-04 03:25:50

标签: arduino

我刚刚开始用几种Teensy和Teensy ++来钻研arduino的世界,到目前为止它已经很好了,除了我试图从多个按钮输入输入时非常奇怪的行为。

差不多,我所拥有的只是一个小小的++,一个LCD显示屏和3个按钮。我刚刚读取了所有三个按钮的状态,然后将结果发布到屏幕上,0或1.这可能不简单,这就是为什么我无法弄清楚它为什么不起作用的原因。

只需一个按钮,上面的工作正常。但是,只要我将其中一个按钮添加到混音中,而不是正常工作,当我按下按钮1时,按钮1和按钮2都会变为1.按钮2不执行任何操作。按钮3也不执行任何操作,并且在按下任何其他按钮时甚至不会转到一个按钮。

我的第一个倾向是我的笨拙的屁股已经在电路板上用焊料桥接了一些痕迹。我抓住了我的一个新的并重新焊接它,检查每个接触以确保它是好的,它就是。而不是使用我经常使用的面包板电线,我使用实心芯线来确保电线不是问题。我也换了面包板,以防出现故障。

同样的问题。我不确定是什么导致这不起作用。我希望你们中的一个大师可以突然告诉我,我做了一些完全错误的事情,因为我无法弄清楚为什么它根本不起作用

这是我的代码:

#include <LiquidCrystal.h>

LiquidCrystal lcd(5,6,7,8,9,10);

void setup(){

pinMode(13,INPUT);pinMode(21,OUTPUT);  //Button one
pinMode(12,INPUT);pinMode(20,OUTPUT);  //Button two
pinMode(11,INPUT);pinMode(19,OUTPUT);  //Button three

digitalWrite(21,HIGH); //Power buttons
digitalWrite(20,HIGH);
digitalWrite(19,HIGH);

lcd.begin(16,4);

}

int resp1 = 3;  //Variables for responses 
int resp2 = 3;
int resp3 = 3;

void loop(){

 resp1 = digitalRead(13); //Read button 1
 resp2 = digitalRead(12); //Read button 2
 resp3 = digitalRead(11); //Read button 3

 //Print it to screen
 lcd.clear();
 lcd.print("Mike's Devboard");
 lcd.setCursor(0,1);
 lcd.print("Btn 1:");
 lcd.print(resp1);
 lcd.print("    Btn 2:");
 lcd.print(resp2);
 lcd.setCursor(0,2);
 lcd.print("Btn 3:");
 lcd.print(resp3);
 delay(48);
}    

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

读取按钮引脚的注释我想,你将每个按钮的两侧连接到所提到的芯片引脚而没有任何其他东西(即没有电阻等)。

如果是这样的话那么

pinMode(13,INPUT);pinMode(21,OUTPUT);
digitalWrite(21,HIGH); //Power buttons
只要按钮打开,

就会将引脚21驱动为高电平,将引脚13驱动为高阻抗模式。这意味着输入引脚基本上是“浮动的” - 环境的任何影响都会使其切换。它基本上是随机输入。

如果您关闭按钮,输入引脚将连接到HIGH并同时提供强HIGH。

你需要什么:

当按钮打开 时,您需要将输入引脚置于两种情况下定义的“强”状态。

你可以这样做:

pinMode(13,INPUT); digitalWrite(13, HIGH);  // input pin with internal pullup enabled
pinMode(21,OUTPUT); digitalWrite(21,LOW);   // other pin to ground

现在按钮的一条腿总是低(地面)。当按钮打开时,输入引脚通过CPU的内部电阻“上拉”至高电平。当按钮闭合时,一些电流从HIGH通过电阻器通过按钮流入另一个仍处于低电平的引脚。这也将输入引脚驱动为低电平。

有关详情,请参阅教程中的Digial Pins

一个值得注意的副作用:

您将有“否定”输入:如果按钮打开,您将读取HIGH(1),当按钮关闭时,您将读取LOW(0)。

答案 1 :(得分:0)

您必须重置三个变量resp1,resp2和resp3的值,这些变量用于保持循环()函数末尾的按钮状态。

答案 2 :(得分:0)

注意,函数digitalRead()返回HIGH或LOW,对应于TRUE,FALSE或1,0。 BTW没有必要重置值,它们将在每个循环中重新分配按钮的状态。