Arduino I에서 대기:delay () 함수는 친구가 아닙니다.

11170 단어 cpparduinodiy

소개: 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 보드가 다음 명령을 무제한으로 수행한다는 것을 의미합니다.
  • LED를 출력 연결의 발판으로 구성합니다.
  • 값에 따라 LED를 켜거나 끕니다(최초 꺼짐).
  • 2초를 기다린다.
  • 업데이트된 값입니다.
  • 2단계로 돌아갑니다.
  • 여기 있다 왜 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 the delay(). If the button is pressed while Arduino is paused waiting for the delay() 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초에 한 번 깜박이기를 원합니다.
    녹색 LEDdelay() 방법을 사용한다면, Arduino가 거의 아무것도 하지 않고 7초만 기다린다면, 빨간색 LED는 어떻게 2초에 한 번씩 반짝입니까?
    요컨대 delay() 아르두노에서의 기능은 당신의 친구가 아닙니다.

    이 강좌는 Arduino 공식 페이지에 있습니다. 개안 연구


    우리는 레이저 절단기를 우리의 보조 프로젝트로 건설하고 있으며, 우리의 목표는 Arduino판으로 그것을 제어하는 것이다.
    우리는
  • 컨베이어 벨트에 전기를 공급하는 직류전기를 사용하여 부품을 레이저로 옮긴다.공작물이 레이저 앞에 있을 때, 전기를 멈추어라.
  • 부품이 정확한 위치에 있을 때 레이저를 켜라.작업이 완료되면 종료합니다.
  • 필요한 경우 빨간색 큰 비상정지 버튼을 사용하여 기계를 정지할 수 있습니다.

  • 배송 벨트 DIY 프로젝트(
    현재 우리는 부품을 컨베이어 벨트에서 레이저 위치로 이동하는 데 3초가 걸리고 레이저 절단 부품을 사용하는 데 3초가 걸린다고 가정한다.
    이 시리즈에 나오는 모든 코드는 간소화되어 실행기 없이 실행할 수 있으며, Arduino를 노트북에 연결하여 스케치를 불러오고 직렬 모니터 출력을 볼 수 있습니다.비상 버튼을 누르면 Arduino의 직렬 모니터 창을 사용하여 직렬 포트를 통해 모든 정보를 시뮬레이션할 수 있습니다.
    source

    소박한 해결 방안:delay () 사용


    우리의 목표를 분석한 후에 세 가지 다른 상태 를 창설하여 이 목표를 실현할 수 있다는 결론을 얻을 수 있다.
  • 상태1: 전기기계가 열리고 레이저가 꺼진다.부품이 컨베이어 벨트에서 이동합니다.
  • 상태2: 전동기가 꺼지고 레이저가 켜진다.레이저가 공작물을 절단하고 있다.
  • 상태3: 전동기 꺼짐, 레이저 꺼짐.긴급 모드(오류), 수동 개입이 필요합니다.
  • state machine
    첫 번째로 사용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초에 한 번만 호출됩니다. 이것은 다음과 같습니다.
  • 만약 누군가가 비상 버튼을 계속 누르면 우리 기계는 즉시 멈추지 않을 것이다. 이것은 3초가 걸릴 수도 있다.
  • 만약 누군가가 비상 버튼을 누르고 그것을 방출한다면, 긴급 검사 전에 이런 상황이 발생하지 않았다면, 우리의 프로그램은 쉽게 그것을 놓칠 것이다.
  • 더 좋은 인코딩 방식을 분석하는 데 직접 뛰어들다.

    좋은 웹페이지 즐겨찾기