BASIC4MCU | 질문게시판 | LED 점등 예제 질문입니다.
페이지 정보
작성자 홍머생 작성일2022-05-01 22:38 조회2,378회 댓글4건본문
안녕하세요!
오늘 처음 가입하고 질문 올리게 되었습니다!
LED가 1초 간격으로 켜졌다 꺼졌다를 반복하게 만드는 예제인데요, delay 함수말고 mills()를 사용해서 하는 예제입니다.
unsigned long previousTime = 0;
boolean isOn = false;
void setup()
{
pinMode(2, OUTPUT);
}
void loop()
{
unsigned long currentTime = millis();
if(currentTime > previousTime + 1000){ // 현재 시간이 지난 번 변경 시간보다 1초 클때;
if(isOn){ //isOn 값이 true이면
digitalWrite(2, HIGH); // A부분입니다. (질문 설명을 위해)
} else{
digitalWrite(2, LOW); //B부분 입니다.
}
isOn = !isOn; //C부분 입니다. LED상태변경
previousTime = currentTime; // 변경 시간 변경
}
}
코드 자체는 이해가 안가는 부분은 없습니다만, 제가 이해가 잘 안가는 것은 2가지 입니다.
첫번째는 void loop에서 currentTime을 정의했는데 아두이노가 if문에 들어가기전까지 currentTime의 값이 어떻게 되는지 궁금합니다.
그러니까 아두이노가 코드를 실행할 때 저 값을 정의하고 다음 줄을 실행하기까지 시간이 흐르나요?
두번째는 전역변수 previousTime = false 부터 시작하잖아요?
그러면 void loop에 들어와서 false값부터 시작하니까 if문에서 else로 빠져서 LED가 LOW값을 가지게 됩니다.
그 다음에서 바로 isOn 값이 반대로 바뀌니까 LED가 HIGH값을 가지고 되고 켜지게 되는데
B에서 C로 갈때 그 사이 시간이 1초가 되는지 모르는거 아닌가요? (첫번째 질문과 어느정도 비슷한 맥락의 질문인거같습니다.)
감사합니다!!
댓글 4
조회수 2,378master님의 댓글
master 작성일
void loop(){
unsigned long currentTime = millis();
if(currentTime > previousTime + 1000){ // 현재 시간이 지난 번 변경 시간보다 1초 클때;
첫번째는 void loop에서 currentTime을 정의했는데 아두이노가 if문에 들어가기전까지 currentTime의 값이 어떻게 되는지 궁금합니다.
그러니까 아두이노가 코드를 실행할 때 저 값을 정의하고 다음 줄을 실행하기까지 시간이 흐르나요?
//--------------------------------------------------
unsigned long currentTime = millis();
if문 실행 하기 전에 millis() 함수를 호출해서 값을 저장하고 있으므로
currentTime 에는 millis() 함수의 반환 값이 들어있습니다.
변수 선언 후부터 함수 반환값을 받는데 약간의 시간이 흐릅니다만 수십us 이하라서 큰 영향을 주지 않습니다.
master님의 댓글
master 작성일
두번째는 전역변수 previousTime = false 부터 시작하잖아요?
그러면 void loop에 들어와서 false값부터 시작하니까 if문에서 else로 빠져서 LED가 LOW값을 가지게 됩니다.
그 다음에서 바로 isOn 값이 반대로 바뀌니까 LED가 HIGH값을 가지고 되고 켜지게 되는데
B에서 C로 갈때 그 사이 시간이 1초가 되는지 모르는거 아닌가요? (첫번째 질문과 어느정도 비슷한 맥락의 질문인거같습니다.)
//--------------------------------------
previousTime = false
true와 false는 0과 1의 값을 가지는 논리변수인 bool 에 흔히 사용하는 값입니다.
unsigned long previousTime = 0;
4바이트 정수형 변수이므로 false 대신 0 이라고 쓰는 게 좋습니다.
0 이 false인 것은 맞지만 true의 범위가 달라서 그렇습니다.
unsigned long에서 true의 범위는 1~4294967295로 무려 4294967295가지이기 때문입니다.
//
if문은 2중으로 구성되어 있습니다.
바깥쪽 if문은 currentTime, previousTime 의 시간 체크 부분이고
안쪽 if문은 isOn을 조건식으로 사용하고 있습니다.
안쪽 if문이 실행되려면 1초가 지나야 합니다.
왜 질문이 바깥쪽 if와 안쪽else를 섞어서 설명하는지 이해가 안가는군요
//
전역변수 초기화를 하고
셋업함수가 실행 되고
루프 함수가 실행 됩니다.
이 후 루프함수는 반복해서 실행 됩니다.
master님의 댓글
master 작성일
if(isOn){ digitalWrite(2, HIGH); } // A부분입니다.
else { digitalWrite(2, LOW); } // B부분 입니다.
isOn = !isOn; // C부분 입니다.
//
처음 전원키면 포트 출력이 0이므로 LED가 꺼져있습니다.
else { digitalWrite(2, LOW); } // B부분 입니다.
1초 후 안쪽 if else가 체크되고 이 중 B부분이 실행 되면서 LED=0 을 출력합니다.
isOn = !isOn; // C부분 입니다.
그리고 나서 C를 실행하므로 다음번 1초 후에는 LED가 켜지게 됩니다.
전원 킨 후 2초 동안 LED OFF 이므로 전원키고 1초 동안만 LED OFF 시간을 가지려면 C부분이 A부분 위에 있어야 합니다.
isOn = !isOn; // C부분 입니다.
if(isOn){ digitalWrite(2, HIGH); } // A부분입니다.
else { digitalWrite(2, LOW); } // B부분 입니다.
previousTime = currentTime;
홍머생님의 댓글
홍머생
너무나도 친절하고 자세하고 쉬운 설명 감사합니다 ㅠㅠㅠ 완벽하게 이해됐습니다!!! 선생님 어디에 계신가요 그쪽방향으로 절 올려도 될까요?