5.Digital Signal Input
-switch input
-stable switch input
-measure a digital signal period
-keypad input
디지털 신호
0과 1 혹은 HIGH LOW 두가지 값으로 표현되는 신호
noise에 강하고 데이터의 저장 및 처리가 용이하다.
<pull-up / pull-down>
풀업을 설명하고 있는 그림이다.
스위치가 연결된 경우 전류가 GND로 빠지면서 PIN의 값은 0(LOW)이 되고
스위치가 연결되지 않은 경우는 전류가 PIN쪽으로 흐르면서 PIN값이 1(HIGH)이 된다.
풀다운의 경우는 반대임.
Vcc – 스위치 – 2번핀 이렇게 연결시 floating이라는 외부 간섭 때문에 스위치off인데도 전류가 흐르는 문제생김
floating 현상을 해결하기 위해 GND도 같이 연결. + 저항 추가
<switch>
void setup(){
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
}
void loop(){
int swInput = digitalRead(inputPin);
if(swInput ==LOW)
digitalWrite(13,HIGH);
else
digitalWrite(13,LOW);
}
<토글형 switch>
const int ledPin = 13;
const int inputPin=2;
int count=0;
void setup(){
pinMode(ledPin,OUPUT);
pinMode(inputPin,INPUT_PULLUP);
Serial.begin(9600);
}
void loop(){
int swInput = digitalRead(inputPin);
int ledOutput = digitalRead(ledPin); //현재 led핀의 출력상태를 읽음
if(swInput == LOW){
if(ledOutput ==HIGH)
digitalWrite(ledPin,LOW);
else
digitalWrite(lednPin,HIGH);
count++;
Serial.println(count); //스위치 입력 횟수를 전송함
}
}
위 코드를 그대로 실행하게 되면, 스위치가 작동될 때 순간적으로 전류가 흘렀다 끊겼다 반복하는 현상
Bouncing이 발생함. 이를 해결하기 위한 코드가 필요함
const int ledPin = 13;
const int inputPin=2;
const int swCountTime = 10; //입력이 연속10번 일어나면 스위치를 동작시킬 것임
int count=0;
int swCountTimer =0; //스위치가 연속 몇 번 눌렸는지 셀 변수
void setup(){
pinMode(ledPin,OUPUT);
pinMode(inputPin,INPUT_PULLUP);
Serial.begin(9600);
}
void loop(){
int ledOutput = DigitalRead(ledPin);
if(swCheck(inputPin)){
if(ledOutput ==HIGH)
digitalWrite(ledPin,LOW);
else
digitalWrite(lednPin,HIGH);
count++;
Serial.println(count); //스위치 입력 횟수를 전송함
}
}
bool swCheck(int pin){
bool swInput = digitalRead(pin);
bool state;
if(swInput == LOW){//스위치가 눌린 경우
if(swCountTimer >= swCountTime){
if(swCountTimer == swCountTime)
state = HIGH;
else
state = LOW;
else{
swCountTimer++;}}
else{
state = LOW;
swCountTimer = 0;}
return state;
<스위치 시간측정하기>
const int inputPin=2;
long startTime =0;
long swCountTimer = 0;
void setup(){
pinMode(ledPin,OUPUT);
pinMode(inputPin,INPUT_PULLUP);
Serial.begin(9600);
}
void loop(){
int swInput = digitalRead(inputPin);
if(swInput == LOW){ //스위치가 눌린 경우
startTime = millis(); //시간측정시작
while(digitalRead(inputPin)==LOW); //누르는동안 아무것도 안함
swCountTimer = millis() - startTime;
Serial.println(swCountTimer); //스위치 입력 횟수를 전송함
}
}
위 코드는 Bouncing을 고려하지 않았으므로 문제가 발생할 것임
<KeyPad>
행 개수+열 개수 만큼의 핀이 필요
COL는 HIGH OUTPUT으로 세팅,
ROW은 PULLUP 세팅한다.
const int numRows =4;
const int numCols=4;
char keys[numRows][numCols] ={
{‘1’,‘2’,‘3’,‘A’},
{‘4’,‘5’,‘6’,‘B’},
{‘7’,‘8’,‘9’,‘C’},
{‘*’,‘0’,‘#’,‘D’}};
int rowPins[] = {2,3,4,5};
int colPins[] = {6,7,8,9};
void setup(){
for(int i=0;i<numRows;i++){
pinMode(rowPins[i],INPUT_PULLUP);}
for(int i=0; i<numCols;i++){
pinMode(colPins[i],OUTPUT);
digitalWrite(colPins[i], HIGH);
Serial.begin(9600);
}
void loop(){
char key = keypadRead();
if(key !=0){
Serial.print(key);
}
char keypadRead(){
char key;
for(int i=0;i<numCols;i++){
digitalWrite(colPins[i],LOW);
for(int j=0;j< numRows;j++){
if(digitalRead(rowPins[j] == LOW)//스위치 눌린거면
delay(10);//바운싱 방지를 위해 잠ᄁᆞᆫ대기
while(digitalRead(rowPins[j])==LOW); //키 놓을 때까지 대기
key = keys[j][i];
}
}
digitalWrite(colPins[i],HIGH); //원상복구
}
return key;}
'2022-2 > 마이크로프로세서' 카테고리의 다른 글
7. Motor Drive (0) | 2022.11.07 |
---|---|
6. Analog Input (1) | 2022.11.01 |
아두이노와 기타등등 알아보기 (0) | 2022.10.14 |
4-2 LED (0) | 2022.10.10 |
4장 - LED (1) | 2022.10.06 |
댓글