2012-04-04 4 views
1

저는 몇 가지 Teensy 's와 Teensy ++로 arduino의 세계를 탐구하기 시작했습니다. 지금까지 입력을 시도 할 때 얻었던 매우 이상한 행동을 제외하고는 아주 훌륭했습니다. 여러 단추.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); 
}  
: 나는 내가이 모든

에서 작동하지 않는 이유를 알아낼 수 있기 때문에 전문가의의 중 하나가 급습 내가 완전히 뭔가를 잘못하고 있어요 것을 말해 줄 수 바라고은 내 코드입니다

아이디어가 있으십니까?

+0

배선 스키마를 게시 할 수 있습니까? 코드를 보면 몇 가지 이상한 것을 볼 수 있습니다. 1) 귀하의 버튼에 대한 전원 공급 장치로 출력을 사용하지 말고 gnd를 사용하고 5V는 버튼과 5v 사이의 직렬 연결을 arduino [튜토리얼] (http://arduino.cc/en/Tutorial/DigitalReadSerial) – Sibster

+0

정확히 내가 뭘 잘못하고 있었는지, 고마워. 저항기가 LED가 날아 가지 못하도록 막는 것만으로는 생각했지만 더 조심스럽게 읽었습니다. 왜 내가 필요한지 알 수 있습니다. 이제 작동 중입니다. –

답변

0

loop() 함수의 끝에서 단추의 상태를 유지하는 데 사용하는 resp1, resp2 및 resp3의 세 변수의 값을 다시 설정해야합니다.

+0

'digitalRead'는 값들이 상태를 정의했는지 확인합니다. –

0

digitalRead() 함수는 TRUE, FALSE 또는 1,0에 해당하는 HIGH 또는 LOW를 반환합니다. BTW 값을 다시 설정할 필요가 없습니다, 그들은 버튼의 상태를 각 루프에 사임됩니다.

1

그런 경우 다음

의 경우 다른 작업 (예 : 없음 저항 등)

없이 칩의 한 핀에 각 버튼의 양쪽을 연결하는 것이, 내가 추측 버튼 핀에 대한 의견을 읽고

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 

지금 버튼의 한쪽 다리는 항상 LOW입니다 (바닥에). 버튼이 열리면 입력 핀은 CPU의 내부 저항에 의해 HIGH로 "pull up"됩니다. 버튼이 닫히면 일부 전류가 HIGH에서 저항을 통해 버튼을 통해 다른 핀으로 흐릅니다.이 핀은 여전히 ​​LOW입니다. 이것은 입력 핀을 LOW로 구동한다.

자세한 내용은 자습서의 Digial Pins을 참조하십시오.

하나 주목할만한 부작용 :

하면 입력이 "무효"것이다 : 당신은 HIGH 판독한다 (1) 버튼 열고 LOW 인 경우 (0)의 버튼이 닫히면.

관련 문제