2012-04-04 12 views
1

との不可解な行動私はいくつかのTeensyさんとTeensy ++さんとのArduinoのの世界に掘り下げるために始めているとこれまでのところ、それはからの入力を取るしようとしたとき、私はなってきている、非常に奇妙な行動を除いて素晴らしい行ってきました複数のボタン。アルドゥイーノ:ボタン

かなり多く、私が持っているすべてはteensy ++、LCDディスプレイと3つのボタンです。コードは、3つのボタンの状態をすべて読み取った後、0または1の結果を画面に表示します。単純ではないので、なぜ機能していないのか分かりません。

1つのボタンで、上記の操作は問題ありません。しかし、他のボタンの1つをミックスに追加するとすぐに、正しく動作するのではなく、ボタン1を押すと、ボタン1とボタン2の両方が1に変わります。ボタン2は何もしません。ボタン3も何もせず、他のボタンが押されても1に切り替わりません。

私の最初の傾斜は私の不器用なお尻がボード上のはんだで一部のトレースを橋渡ししているということでした。私は新しいものをつかみ、それを新たにはんだ付けし、すべての連絡先をチェックしてそれが良いことを確認した。そうだった。私が普段使用しているブレッドボードのワイヤーを使用する代わりに、ワイヤーが問題ではないことを確認するためにソリッドコアのワイヤーを使用しました。私はブレッドボードを交換しました。

同じ問題。私はこれがうまくいかない原因となるかどうかはわかりません。

#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); 
}  
:私はそれがすべて

で動作していない理由を私は理解することはできませんので、これは私のコードで、あなたの1グルさんは急降下し、私は完全に間違って何かをやっていることを私に伝えることができることを期待しています

アイデアはありますか?

+0

配線スキーマを転記できますか?あなたのコードを見て、私はいくつかの奇妙なものを参照してください。 1)あなたのボタンの電源として出力を使用しないでくださいgndを使用して、5Vはarduino [チュートリアル](http://arduino.cc/ja/Tutorials)のようにボタンと5vの間で直列に抵抗を追加します/ DigitalReadSerial) – Sibster

+0

正確に私が間違っていたこと、ありがとう。私は、LEDが爆発するのを止めるために抵抗器が必要だと思ったが、それをもっと慎重に読んだので、なぜそれが必要なのかが分かる。それは今働いている。 –

答えて

0

loop()関数の最後にボタンの状態を保持するために使用する3つの変数resp1、resp2およびresp3の値をリセットする必要があります。

+0

'digitalRead'は、値が状態を定義していることを確認します。 –

0

関数digitalRead()は、TRUE、FALSEまたは1,0に対応するHIGHまたはLOWを返します。ところで、値をリセットする必要はありません、彼らは各ループのボタンの状態に辞任されます。その場合は、あなたが(すなわちなし抵抗など)他に何もすることなく、チップの言及ピンに

を各ボタンの両側を接続することを私は推測するボタンピンのコメントを読む

1

、その後、

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

であればボタンが開放されているような高インピーダンスモードにHIGHと、ピン13、ピン21を駆動します。これは、入力ピンが基本的に「フローティング」であることを意味します。環境の影響によってトグルが切り替わります。基本的にランダムな入力です。

ボタンを閉じると、入力ピンはHIGHに接続され、HIGHも強くなります。 - それは開いているときにボタンがオープンととき

あなたは両方の状況で定義され、「強い」状態に入力ピンを持参する必要があります:あなたが必要なもの

あなたはこのようにそれを行うことができます:

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

今すぐボタンの1足は常にLOWである(地面に)。ボタンが開いていると、入力ピンはCPUの内部抵抗によって「プルアップ」されてHIGHになります。ボタンが閉じられると、ある電流がHIGHから抵抗を通ってボタンを通って、まだLOWである他のピンに流れる。これにより、入力ピンもLOWにドライブされます。

詳しくはチュートリアルのDigial Pinsを参照してください。

ワン注視に値する副作用:ボタンが閉じているときにボタンが(0)オープンとLOWである場合には、(1)HIGH読みます:

あなたは入力を「否定」しています。