Arduino:按钮的莫名其妙的行为



我刚刚开始深入研究arduino的世界,有几个Teensy和Teensy++,到目前为止,除了我在尝试从多个按钮接受输入时遇到的极其奇怪的行为外,一切都很顺利。

差不多,我只有一个小小的++,一个液晶显示屏和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);
}    

有什么想法吗?

阅读按钮引脚的注释,我想你可以将每个按钮的两侧连接到芯片的上述引脚,而不需要任何其他东西(即没有电阻器等)

如果是这样的话,那么

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

只要按钮打开,将驱动引脚21 HIGH和引脚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。当按钮关闭时,一些电流从HIGH流过电阻器,通过按钮进入另一个仍为LOW的引脚。这也驱动输入引脚LOW。

有关此方面的详细信息,请参阅教程中的数字引脚。

一个值得注意的副作用:

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

您必须重置三个变量resp1、resp2和resp3的值,您使用这三个变量来保持loop()函数末尾按钮的状态。

请注意,函数digitalRead()返回HIGH或LOW,对应于TRUE、FALSE或1,0。BTW不需要重置值,它们将在每个循环中辞职到按钮的状态。

最新更新