BASIC4MCU | 질문게시판 | 답변 : 엔코더 카운터 문의 드립니다.
페이지 정보
작성자 master 작성일2019-06-27 17:11 조회4,214회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=9531
본문
//int pls=13;//int value=0,setPosition=0;Encoder myEnc(2,3);//void setup(){pinMode(7,INPUT_PULLUP); pinMode(13,OUTPUT);lcd.init(); lcd.backlight();lcd.begin(16,2);lcd.setCursor(0,0); lcd.print("Count: ");lcd.setCursor(0,1); lcd.print("Statu: ");Serial.begin(57600); Serial.println("Basic Encoer Test: ");}//long oldPosition=-99999;//void loop(){long newPosition=myEnc.read()/4;if(Serial.available()){value=Serial.parseInt();lcd.setCursor(9,0); lcd.print(value); lcd.print(" ");if(value>100)setPosition=value-100;}if(newPosition>4998)myEnc.write(4999*4);if(newPosition<-4998)myEnc.write(-4999*4);//if(newPosition==setPosition){digitalWrite(pls,HIGH); myEnc.write(0); delay(5); digitalWrite(pls,LOW);}//if(newPosition!=oldPosition){oldPosition=newPosition; Serial.println(newPosition);lcd.setCursor(9,1); lcd.print(newPosition); lcd.print(" ");}else if(digitalRead(7)==LOW){Serial.println("Button_RESET");lcd.setCursor(9,1); lcd.print("RESET!!");while(digitalRead(7)==LOW); delay(100); myEnc.write(0); oldPosition=-1;}}
보낼때 100을 더해서 보내고 (0~32667 -> 100~32767)
if(value>100)setPosition=value-100;
변수에 저장할 때 100을 빼서 저장하면 값이 0으로 변경되지 않을겁니다.
단, 이 경우에도 1초 정도의 버벅거림은 존재합니다.
Serial.parseInt()
이 함수 때문인데요, 전송 시 구분자가 몇개씩 되기 때문에 생기는 현상일테고요
ln(라인피드)를 추가하지 않고 보내면 100을 더하고 빼지 않더라도 정상적으로 표시가 될겁니다.
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-06-27 오후 5:06:29// by Ok-Hyun Park//int pls=13;//int value=0,setPosition=0;long oldPosition=-99999;Encoder myEnc(2,3);//void setup(){pinMode(7,INPUT_PULLUP); pinMode(13,OUTPUT);lcd.init(); lcd.backlight();lcd.begin(16,2);lcd.setCursor(0,0); lcd.print("Count: ");lcd.setCursor(0,1); lcd.print("Statu: ");Serial.begin(57600); Serial.println("Basic Encoer Test: ");}//void loop(){long newPosition=myEnc.read()/4;if(Serial.available()){char r=Serial.Read();if(r=='\n'){setPosition=value; value=0;lcd.setCursor(9,0); lcd.print(setPosition); lcd.print(" ");}else if((r>='0')&&(r<='9')){value*=10+(r-'0');}}if(newPosition>4998)myEnc.write(4999*4);if(newPosition<-4998)myEnc.write(-4999*4);//if(newPosition==setPosition){digitalWrite(pls,HIGH); myEnc.write(0); delay(5); digitalWrite(pls,LOW);}//if(newPosition!=oldPosition){oldPosition=newPosition; Serial.println(newPosition);lcd.setCursor(9,1); lcd.print(newPosition); lcd.print(" ");}else if(digitalRead(7)==LOW){Serial.println("Button_RESET");lcd.setCursor(9,1); lcd.print("RESET!!");while(digitalRead(7)==LOW); delay(100); myEnc.write(0); oldPosition=-1;}}매 바이트마다 값을 체크해서 처리하는 것이 더 명확할 수 있습니다.
이 코드를 돌려보세요
댓글 1
조회수 4,214웁쓰님의 댓글
웁쓰 작성일
보내주신 소스로 해 보면 액정에 값이 0으로만 표시되네요.
10을 입력 하건 20을 입력하건...일단 퇴근시간이라. 내일 좀더 테스트 해봐야 겠네요. ㅎㅎㅎ