2012-04-04 75 views
1

我刚刚开始深入研究Arduino的几个Teensy和Teensy ++的世界,到目前为止,除了极端奇怪的行为,我试图从输入多个按钮。Arduino:使用按钮的难以理解的行为

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

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

我的第一个倾向是,我笨拙的屁股已桥接板上的焊料痕迹。我抓住了一个新的,并重新焊接,检查每一个接触,以确保它是好的,它是。我没有使用通常使用的面包板导线,而是使用坚固的芯线来确保导线不是问题。如果出现故障,我也换了面包板。

同样的问题。我不确定可能是什么原因导致无法正常工作。我希望你大师的一个可以一举,告诉我,我在做一些完全错误的,因为我想不通为什么它是不是在所有

这工作是我的代码:

#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); 
}  

任何想法的?

+0

你可以发布布线架构吗?看着你的代码,我看到了一些奇怪的东西。 1)不要使用输出作为按钮的电源使用gnd和5V在按钮和5v之间串联一个电阻,就像在arduino [教程]中一样(http://arduino.cc/en/Tutorial/DigitalReadSerial) – Sibster 2012-04-04 06:20:43

+0

准确地说,我做错了,谢谢。我认为电阻器只是用来防止LED烧毁,但更仔细地阅读,我明白为什么我需要它。现在正在工作。 – 2012-04-04 16:50:48

回答

0

您必须重置三个变量resp1,resp2和resp3的值,这些变量用于在loop()函数结束时保持按钮的状态。

+0

'digitalRead's将确保值已经定义了状态。 – 2012-04-04 19:53:50

0

请注意函数digitalRead()返回一个HIGH或LOW,这对应于TRUE,FALSE或1,0。顺便说一句,没有必要重新设置值,他们将退出每个循环的按钮状态。

1

阅读按钮销我猜的评论,你的每个按钮的芯片提到销两侧连接而无需其他任何东西(即没有电阻等)

如果是这样的话,那么

pinMode(13,INPUT);pinMode(21,OUTPUT); 
digitalWrite(21,HIGH); //Power buttons 

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

如果关闭该按钮,则输入引脚连接到高电平并且也会产生强烈的高电平。

你需要什么:

你需要把输入引脚定义,“强”国情况 - 当按钮被打开当它是开放的。

你可以做这样的:

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了解更多信息。

一个noteable副作用:

你将有“否定”输入:你会读到高(1)如果按钮是打开的和低(0)时,该按钮被关闭。