Arduino I에서 대기:delay () 함수는 친구가 아닙니다.
소개: LED 깜박임
새로운 프로그래밍 언어에 익숙해졌을 때, 디스플레이 'Hello, world!' 는 일반적으로 당신이 공부하는 첫 번째 일이다.
프로그래밍을 시작할 때 화면에 직접 정보를 출력하는 장치(예를 들어 마이크로컨트롤러)로 설계되지 않으면 이 문장의 예외가 나타납니다.이것이 바로 Arduino의 예에서 "안녕하세요, 세상!"을 나타내는 이유입니다.LED 깜박임으로 효과적으로 교체합니다.
이것은 일반적으로 Arduino 애호가들이 작성한 첫 번째 Arduino 프로그램(또는sketch)입니다.
const int waitingTime = 2000; // 2 seconds
bool ledState = LOW;
void setup() { pinMode(LED_BUILTIN, OUTPUT); }
void loop()
{
digitalWrite(LED_BUILTIN, ledState);
delay(waitingTime);
ledState = !ledState;
}
이 코드this official tutorial를 찾을 수 있습니다.Arduino에 익숙하지 않은 독자들에게는
setup()
방법이 한 번 실행되고 (프로그램이 시작될 때, 즉 Arduino 판이 켜지거나 다시 시작될 때) 방법이 반복됩니다.이것은 프로그램이 로드된 Arduino 보드가 다음 명령을 무제한으로 수행한다는 것을 의미합니다.
여기 있다 왜 loop () 를 사용하는지 이해하는 것은 항상 좋은 생각은 아니다
그렇다면 이 어휘들은 무엇에 관한 것입니까?위에 표시된 깜박임 LED 프로그램에 문제가 있습니까?아니오, 절대 아니에요.😛). 다른 프로그래밍 언어와 마찬가지로, 모든 Arduino 프로그램/스케치는 매우 구체적인 목적을 가지고 있으며, 이 예에서'안녕, 세상!'으로 충당한다.초보자를 환영합니다.
이 예는 간단성을 실현하기 위해 일이 발생하기를 기다리는 데 사용되지만, 이것은 통상적으로 좋은 모델이 아니다.
이렇게 강경한 성명의 주요 원인은 당신의 Arduino 보드가 실행할 수 없기 때문이다
ledState
. 그러나 그것은 거의 다른 일을 할 수 없기 때문이다. ledState
function에서 다음 예제를 사용하여 설명합니다.Sometimes you need to do two things at once. For example you might want to blink an LED while reading a button press. In this case, you can't use
delay()
, because Arduino pauses your program during thedelay()
. If the button is pressed while Arduino is paused waiting for thedelay()
to pass, your program will miss the button press.An analogy would be warming up a pizza in your microwave, and also waiting some important email. You put the pizza in the microwave and set it for 10 minutes. The analogy to using
delay()
would be to sit in front of the microwave watching the timer count down from 10 minutes until the timer reaches zero. If the important email arrives during this time you will miss it.What you would do in real life would be to turn on the pizza, and then check your email, and then maybe do something else (that doesn't take too long!) and every so often you will come back to the microwave to see if the timer has reached zero, indicating that your pizza is done.
다른 인스턴스는 다음과 같습니다.
너는 두 개의 LED가 있는데, 하나는 빨간색이고, 하나는 녹색이다.빨간색 LED는 2초에 한 번, 녹색 LED는 7초에 한 번 깜박이기를 원합니다.
녹색 LED
delay()
방법을 사용한다면, Arduino가 거의 아무것도 하지 않고 7초만 기다린다면, 빨간색 LED는 어떻게 2초에 한 번씩 반짝입니까?요컨대
delay()
아르두노에서의 기능은 당신의 친구가 아닙니다.이 강좌는 Arduino 공식 페이지에 있습니다. 개안 연구
우리는 레이저 절단기를 우리의 보조 프로젝트로 건설하고 있으며, 우리의 목표는 Arduino판으로 그것을 제어하는 것이다.
우리는
배송 벨트 DIY 프로젝트(
현재 우리는 부품을 컨베이어 벨트에서 레이저 위치로 이동하는 데 3초가 걸리고 레이저 절단 부품을 사용하는 데 3초가 걸린다고 가정한다.
이 시리즈에 나오는 모든 코드는 간소화되어 실행기 없이 실행할 수 있으며, Arduino를 노트북에 연결하여 스케치를 불러오고 직렬 모니터 출력을 볼 수 있습니다.비상 버튼을 누르면 Arduino의 직렬 모니터 창을 사용하여 직렬 포트를 통해 모든 정보를 시뮬레이션할 수 있습니다.
source
소박한 해결 방안:delay () 사용
우리의 목표를 분석한 후에 세 가지 다른 상태 를 창설하여 이 목표를 실현할 수 있다는 결론을 얻을 수 있다.
첫 번째로 사용
delay()
처리 상태 1과 2 사이의 시간량을 실현한다.const unsigned long waiting_time_ms = 3000; // 3s
void setup() { Serial.begin(9600); }
void loop()
{
turn_laser_off();
turn_motor_on();
delay(waiting_time_ms);
stop_in_case_of_emergency(); // This is checked every three seconds
turn_motor_off();
turn_laser_on();
delay(waiting_time_ms);
stop_in_case_of_emergency(); // This is checked every three seconds
}
void turn_laser_on() { Serial.println("laser on"); }
void turn_laser_off() { Serial.println("laser off"); }
void turn_motor_on() { Serial.println("motor on"); }
void turn_motor_off() { Serial.println("motor off"); }
bool is_emergency_button_pressed()
{
Serial.println("Checking emergency button");
if(Serial.available())
{
Serial.println("Stopping due to emergency: " + Serial.readString());
Serial.println("Please reset");
return true;
}
return false;
}
void stop_in_case_of_emergency()
{
if (is_emergency_button_pressed())
{
turn_motor_off();
turn_laser_off();
while (0 != 1) { }
}
}
이 코드를 찾을 수 있습니다.이 코드의 주요 문제는 마이크로컨트롤러가 우리
delay()
를 실행할 때 프로그램을 3초 동안 멈추는 것이다.따라서 delay()
방법은 3초에 한 번만 호출됩니다. 이것은 다음과 같습니다.Reference
이 문제에 관하여(Arduino I에서 대기:delay () 함수는 친구가 아닙니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)