?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문 | 아두이노 101 시간 관리

페이지 정보

작성자 DAZABAMUKER 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일18-02-02 10:56 조회159회 댓글1건

본문

142 페이지
boolean isOn = false; 는 다음번에 사용해야할 Led 상태 알려 주는 것 이라면서요 그러면 loop 에서
if(isOn)  { 
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
isOn = !ison
}
인데 다음번이라는 말은 처음에는 true 이고 다음에는 false 인건가요 ?? 근데 처음 loop에서 isOn = !isOn이잖아요 어떻게 되는 건가요??
아! 그리고 앞선 예제는 이질감이 있는데 millis는 왜 동시에 이질감 없이 사용되는지 잘 모르겠습니다
delay 함수 때문인가요?? 앞 예제는 delay 때문에 기다렸다가 시행되고 millis 는 기다림없이 코드 시행이 가능한 것인가요??
제가 저번에 한번 해볼때 보튼 입력할때 항상 delay 넣어주시던데 루프가 delay 가 없어 너무 빨리 넘어가면 어떤 문제가 생기는 건가요??
또 previousTime = currentTime; 으로 바꾸어 주는데 다음 루프에서는 if( previousTime > previousTime + 1000 );랑 같아지는 것 아닌가요??? 그러면 항상 그상태가 유지 되는게 정상 아닌가요 ???

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

loop() 함수 안에 있는 if() 조건문 안에서 isOn 값을 변경하죠? if()조건문이 1초마다 실행되기 때문에 isOn 값이 1초마다 반대로 바뀌게 되는겁니다. 그리고 isOn 값에 따라 LED 점멸 상태도 바뀝니다.

delay() 함수는 실행되면 아두이노가 다른 작업을 아무것도 안하고 멈추게 되지만 loop() 함수 안에서 millis 함수를 사용하면 현재 시간만 계속 체크하기 때문에 아두이노가 멈추질 않습니다. millis() 함수는 현재 시간값(아두이노가 실행 된 후부터 지난 시간) 만을 가져오기 때문에 아두이노가 거의 멈춤없이 실행하고 if() 조건문으로 작업을 할지 말지 판단 하거든요. 그래서 loop 안에 있는 다른 작업을 바로 실행할 수 있습니다.

다른 소스에서 delay() 함수를 실행하는 이유는 아두이노 loop() 함수가 엄청나게 빠른 속도로 반복되기 때문에 이걸 조금 늦추가 위해서 실행하는 겁니다. 너무 빠르게 실행되면 문제가 생기는 경우도 있거든요. 프로젝트를 하실 때 delay()를 적절히 변경해 가면서 테스트 해보세요. 그리고 프로젝트에 맞는 값을 사용하시면 됩니다. 여러 작업을 동시에 해야하는 경우에는 delay() 대신에 millis()를 이용해서 시간관리를 하세요.

currentTime 에는 현재 시간값이 있고 이걸 previousTime = currentTime; 으로 previousTime에 저장합니다. 따라서 다음 loop()에서 millis()를 실행해서 현재 시간을 가져오면 previousTime 보다 조금 더 지난 (큰 숫자) 시간값이 currentTime에 저장됩니다. 즉, 항상 currentTime은 previousTime 보다는 크게 됩니다. 이 값이 얼마나 차이나는지 확인해서 시간이 얼마나 지났는지 알아내는 겁니다.