본문 바로가기
2022-2/마이크로프로세서

5. Digital Signal Input

by 철없는민물장어 2022. 10. 23.
728x90
반응형

5.Digital Signal Input

-switch input

-stable switch input

-measure a digital signal period

-keypad input

 

디지털 신호

01 혹은 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>

행 개수+열 개수 만큼의 핀이 필요

COLHIGH OUTPUT으로 세팅,

ROWPULLUP 세팅한다.

 

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

 

 
728x90
반응형

'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

댓글