// 스스로 짤수 있게 되기
const int L_LED = 13;
const int encoderA = 2;
const int encoderB = 3;
const int SW = 4;
int lastStateA;
int lastStateSW;
long cnt = 0;
int flag = LOW;
int dir = LOW; //LOW : CW(시계방향), HIGH : CCW(반시계방향)
void setup() {
pinMode(L_LED, OUTPUT);
pinMode(encoderA, INPUT);
pinMode(encoderB, INPUT);
attachInterrupt(digitalPinToInterrupt(encoderA), readEncoderA, FALLING);
attachInterrupt(digitalPinToInterrupt(encoderB), readEncoderB, FALLING);
pinMode(SW, INPUT_PULLUP);
lastStateSW = digitalRead(lastStateSW);
Serial.begin(9600);
}
void loop() {
int stateA = digitalRead(encoderA);
if(flag == HIGH && stateA == LOW){
if(dir){
Serial.println("Rotated counterclockwise ⏪");
Serial.println(cnt);
}
else{
Serial.println("Rotated clockwise ⏩");
Serial.println(cnt);
}
flag = LOW;
}
int sw_state = digitalRead(SW);
if(lastStateSW != sw_state){ //요게 없으면 바운싱 현상 발생
if(sw_state == LOW){
Serial.println("cnt Reset");
Serial.println(cnt);
cnt = 0;
}
lastStateSW = sw_state;
}
}
//인터럽트에는 시리얼 통신같은거 넣지말고 cnt값만 변화해줘야함.
void readEncoderA(){
int stateB = digitalRead(encoderB);
if (stateB == HIGH) { //시계방향 회전임.
cnt++;
dir = LOW;
}
else { //반시계 방향 회전임.
cnt--;
dir = HIGH;
}
flag = HIGH;
//A의 마지막 상태를 업데이트 해줄 필요 없음, 인터럽트에서 변화를 인지하기 때문에
}
void readEncoderB(){
int stateA = digitalRead(encoderA);
if (stateA == LOW) {
cnt++;
dir = LOW;
}
else {
cnt--;
dir = HIGH;
}
flag = HIGH;
}