스위치 2

magicdrill·2025년 1월 25일

4x4 키패드

16개의 스위치가 행열로 배치되어 있음.
키패드를 편하게 사용하기 위래 라이브러리가 필요함.

tool -> manage library -> keypad 검색으로 라이브러리 설치함.

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;

char myKeys[ROWS][COLS] ={
  {'0', '1', '2', '3'},
  {'4', '5', '6', '7'},
  {'8', '9', 'A', 'B'},
  {'C', 'D', 'E', 'F'}
};

byte rowPins[ROWS] = {5,4,3,2};
byte colPins[COLS] = {8,9,10,11};

Keypad customKeypad = Keypad(makeKeymap(myKeys), rowPins, colPins, ROWS, COLS);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  char customKey = customKeypad.getKey();

  if(customKey){
    Serial.println(customKey);
  }
}

Page 105 Example

명세

  • 스위치 1을 누르면 누를 때마다 RGB LED가 빨강 -> 노랑 -> 초록 -> 하늘 -> 파랑 -> 자주 순서로 변함
  • 스위치 2를 누르면 RGB LED가 자주 -> 파랑 0> 하늘 -> 초록 -> 노랑 -> 빨강 순으로 변함
int ledR = 8;
int ledG = 9;
int ledB = 10;
int switch1 = 3;
int switch2 = 4;
int step = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(switch1, INPUT);
  pinMode(switch2, INPUT);

  digitalWrite(ledR, HIGH);
  digitalWrite(ledG, LOW);
  digitalWrite(ledB, LOW);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(switch1) == 1) {
    step++;
    Serial.println("switch1 누름");
  }
  if (digitalRead(switch2) == 1) {
    step--;
    Serial.println("switch2 누름");
  }
  if (step > 5) {
    step = 0;
  }
  if (step < 0) {
    step = 5;
  }
  Serial.println(step);

  ledColor(step);
  delay(200);
}

//정렬은 ctrl + t
void ledColor(int step) {
  if (step == 0) {  //빨강
    digitalWrite(ledR, HIGH);
    digitalWrite(ledG, LOW);
    digitalWrite(ledB, LOW);
  } 
  else if (step == 1) {  //노랑
    digitalWrite(ledR, HIGH);
    digitalWrite(ledG, HIGH);
    digitalWrite(ledB, LOW);
  } 
  else if (step == 2) {  //초록
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, HIGH);
    digitalWrite(ledB, LOW);
  } 
  else if (step == 3) {  //하늘
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, HIGH);
    digitalWrite(ledB, HIGH);
  } 
  else if (step == 4) {  //파랑
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, LOW);
    digitalWrite(ledB, HIGH);
  } 
  else if(step == 5) {  //step == 5 //자주
    digitalWrite(ledR, HIGH);
    digitalWrite(ledG, LOW);
    digitalWrite(ledB, HIGH);
  }
}

오류 해결

무한 업로딩

처음 코드 작성할 때 스위치 1, 2를 D1, D2에 저장했다.
이때 코드 업로딩이 멈추지 않는 문제가 발생했다.
참고 : https://blog.naver.com/dreve/221800796010
아두이노 0번과 1번 핀은 컴퓨터에서 코드를 업로드할때 사용하는 핀이라고 한다. 0, 1번은 피하는게 좋고, 어쩔 수 없을 때는 업로드 할 때만 핀을 빼줘야 한다.

플로팅 현상

딱 17page와 동일한 현상으로 발생했다. 택트 스위치에 저항 말고 전선으로 연결을 했더니 끊임없이 스위치를 누르고 있다고 인식되던가 안 누른다고 인식되는 일정하게 인식할 수 없었다.

page 17을 다시 정리하자면, 디지털 신호는 0(LOW, 0V) / 1(HIGH, 5V)로 이루어져야 하는데 어디에도 연결되어 있지 않은 것처럼 인식되어 신호 인식이 불가능한 현상을 플로팅이라고 한다.
이를 해결하기 위해 풀업, 풀다운 저항을 사용해야 한다.

  • 풀업저항은 전원쪽에 저항을 연결해 플로팅 현상을 해결한다.
  • 풀다운저항은 저항을 그라운드에 연결해 플로팅 현상을 해결한다.

0개의 댓글