Skip to content
Home » 아두 이노 딜레이 | 아두이노에서 Delay 함수 없이 주기적인 작업 실행 빠른 답변

아두 이노 딜레이 | 아두이노에서 Delay 함수 없이 주기적인 작업 실행 빠른 답변

당신은 주제를 찾고 있습니까 “아두 이노 딜레이 – 아두이노에서 delay 함수 없이 주기적인 작업 실행“? 다음 카테고리의 웹사이트 https://kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Maker’s Lab. for Korean 이(가) 작성한 기사에는 조회수 3,843회 및 좋아요 36개 개의 좋아요가 있습니다.

아두 이노 딜레이 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 아두이노에서 delay 함수 없이 주기적인 작업 실행 – 아두 이노 딜레이 주제에 대한 세부정보를 참조하세요

delay( ) 함수를 사용하지 않고 주기적인 작업을 아두이노에서 실행시키는 방법과 그 의미를 설명합니다.

아두 이노 딜레이 주제에 대한 자세한 내용은 여기를 참조하세요.

[아두이노 함수] delay() 함수 – 네이버 블로그

[아두이노 함수] delay() 함수 … 안녕하세요, 강남 대치동 1등 코딩학원! 대입 비교과와 저작권 취득을 동시에 준비할 수 있는 코딩학원. 잼있고 깊게, …

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 7/21/2021

View: 2372

아두이노 delay() VS millis() 정확히 알고 쓰자! – 코딩도상국

저는 학부 연구생으로 평소와 같이 아두이노를 돌리고 있었습니다. 여러 센서를 붙여 delay()함수를 사용하여 한번에 여러 작동을 하려고 했으나 계속 …

+ 여기에 보기

Source: coding-yoon.tistory.com

Date Published: 1/7/2021

View: 4058

아두이노 강좌 #3 시간 관련 함수 설명, delay() 없이 LED Blink …

delay() 함수는 프로그램을 중지시키는 방식으로, 복잡한 프로그래밍을 작성시 지양해야 할 함수입니다. 특정한 시간마다 이벤트를 발생시키면서 다른 기능들을 함께 수행 …

+ 여기에 자세히 보기

Source: juahnpop.tistory.com

Date Published: 9/23/2022

View: 774

delay()함수 안쓰고 delay 제어하기(아두이노) – Steemit

delay()함수 안쓰고 delay 제어하기(아두이노) 온라인 가상시뮬레이터 : AUTODESK CIRCUITS 지금까지 delay()함수를 통해 시간 제어를 해왔습니다.… by codingman.

+ 여기를 클릭

Source: steemit.com

Date Published: 8/3/2022

View: 8769

아두이노 기초 강좌 12 – delay 함수와 싱글 스레드

프로그래밍이 처음이라면 [아두이노 프로그래밍 기초] 강좌를 먼저 읽으시길 권해 … 이번 강좌에서는 delay 함수에 대해서 얘기해 보겠습니다.

+ 여기에 표시

Source: www.hardcopyworld.com

Date Published: 2/16/2021

View: 3410

[아두이노 레퍼런스] delay() 함수 – 아이엠어메이커

[아두이노 레퍼런스] delay() 함수 … delay() 함수는 매개변수로 설정한 시간(밀리초) 동안 프로그램을 일시 중지합니다. LED를 깜박이게 하는 등의 많은 …

+ 여기에 표시

Source: www.iamamaker.kr

Date Published: 10/2/2022

View: 4535

아두이노 delay() 와 millis() – Geronimo

아두이노 Blink 예제를 보셔도 delay()함수를 이용해 LED를 켰다 껐다 한답니다. 그럼 만약에 LED 두개를 엇갈려서 1초 간격으로 껐다켰다 하려면 어떻게 …

+ 여기를 클릭

Source: geronimob.tistory.com

Date Published: 8/13/2022

View: 208

[강좌] 26. 시간 관련 함수 (1) – delay() / millis() > 임베디드 보드

아두이노에서는 시간과 관련된 기능을 제공하기 위해서 하나의 타이머를 기본 타이머로 설정하여 사용하고 있으며, 이 타이머를 이용하는 기본 함수는 delay() 함수와 …

+ 여기에 보기

Source: www.hellmaker.kr

Date Published: 5/5/2021

View: 6427

주제와 관련된 이미지 아두 이노 딜레이

주제와 관련된 더 많은 사진을 참조하십시오 아두이노에서 delay 함수 없이 주기적인 작업 실행. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

아두이노에서 delay  함수 없이 주기적인 작업 실행
아두이노에서 delay 함수 없이 주기적인 작업 실행

주제에 대한 기사 평가 아두 이노 딜레이

  • Author: Maker’s Lab. for Korean
  • Views: 조회수 3,843회
  • Likes: 좋아요 36개
  • Date Published: 2020. 4. 23.
  • Video Url link: https://www.youtube.com/watch?v=DPt7rkVZG1s

[아두이노 함수] delay() 함수

ms: 기다리는 시간 길이 (단위: 밀리세컨드)

단위가 밀리세컨드, 즉 천분의 1초이기 때문에 1초를 기다리려면 delay(1000)이라고 쓰면 됩니다.

다음 예제를 봅시다. 아두이노 보드에 내장된 13번 LED를 깜박이는 스케치입니다.

이상 강남 대치동 1등 코딩학원!

대입 비교과와 저작권 취득을 동시에 준비할 수 있는 코딩학원.

잼있고 깊게, 비교할수록 잼코딩이었습니다.

아두이노 delay() VS millis() 정확히 알고 쓰자!

반응형

안녕하세요. 블로그 첫 글이네요.

이 블로그는 공부 노트와 같이 제가 공부하면서 팁과 필요한 부분을 점점 적어내려갈 예정입니다.

바로 시작하겠습니다!

아두이노는 교육용 목적으로 만들어진 C++ 기반의 언어라고 볼 수 있습니다.

초등학생부터 나이불문하고 쉽게 접할 수 있습니다.

저도 아두이노를 처음 사용할 때 예제를 따라하고 LED를 점멸하고 스위치를 눌러보고 아주 신기했던 기억이 납니다.

하지만 예제를 따라하는 것만으로는 제가 원하는 것을 만들 수 없었습니다.

저는 학부 연구생으로 평소와 같이 아두이노를 돌리고 있었습니다.

여러 센서를 붙여 delay()함수를 사용하여 한번에 여러 작동을 하려고 했으나 계속해서 실패했습니다.

제 뒤로 하드웨어 박사과정 중이신 선배님께서 delay()함수와 millis()함수에 대해 알려주셨습니다.

delay(1000)은 1초동안 멈춘다는 뜻입니다. 좀 더 생각을 해보았죠. 1초동안 멈춘다. 1초동안 아무 동작을 하지 않는다.

제가 3학년 때 컴퓨터 구조시간에 배운 하나의 cpu는 하나의 명령밖에 수행할 수 없다고 배웠습니다.

delay(1000)라는 뜻은 cpu가 1초동안 아무 동작을 할 수 없다는 뜻입니다.

하드웨어에서 1초는 매우 긴 시간입니다.

저희 컴퓨터 구조 시간 때 교수님은 IT에서 일주일은 무한의 시간이라고 말씀하셨던게 기억이 나네요!

자! 그렇다면 본론으로 들어가서 그러면 어떻게 한 번에 여러가지 함수를 사용할 수 있을까요.

바로 정답은 millis() 함수에 있습니다.

millis() 함수는 아두이노 보드에서 프로그램이 시작된 시점부터 밀리초(ms) 단위로 카운트(증가) 된 값을 unsigned long 타입으로 반환한다고 나와 있

네요!

우선 두 개의 변수를 선언해주세요

void setup()에 선언해주세요. void roop()문에 이와 같이 선언해줍니다. 가장 중요한 부분입니다. 현재시간의 카운트에서 시작시간의 카운트를 뺸 값이 1초보다 크면 if문을 실행합니다. 만약 >= 10000이라면 10초를 의미합니다.

loop() 함수가 반복되면서 현재의 밀리초를 millis() 함수로부터 계속 업데이트하며 이전 밀리초 값과 차이를 비교하는 방식으로 delay() 함수와 똑같은 기능을 할 수 있습니다.

마치 cpu는 분명 한 가지의 동작을 하고 있지만, 아두이노의 속도가 상당히 빨라 저희 눈에는 동시에 움직이는 것처럼 보이는 것입니다. 마치 도트 매트리스의 잔상효과처럼!

delay()보다 사용하기 어려운건 분명 하나 여러가지 동작을 줄 때는 millis()함수가 상당히 효율적으로 사용할 수 있습니다.

선배님께서도 delay()함수는 없다고 생각하고 오로지 millis()함수만을 이용해서 공부하라고 하셨던 기억이 납니다!

여러분들도 최대한 delay()함수를 사용하지 않고 millis()함수를 애용하면 좋겠습니다!!

728×90

반응형

아두이노 강좌 #3 시간 관련 함수 설명, delay() 없이 LED Blink 코드 작성

delay() delayMicroseconds() millis() micros()

아두이노에서는 일정 시간 동안 프로그램을 멈추거나, 특정 순간부터 시간을 측정 할 수 있는 함수를 제공합니다. 시간 지연 함수는 delay(), delayMicroseconds() 가 있고, 시간을 측정하는 함수는 micros(), millis() 가 있습니다. 이 함수들을 사용하여 1초마다 온도 센서의 값을 PC로 데이터 송신하거나, 0.5초 이내에 버튼이 두 번 눌리면 더블 클릭 같은 기능을 추가하는 방법 등 다양한 방법으로 프로그램 개발이 가능합니다.

본 포스트에서는 아두이노에서 제공하는 시간 함수 사용법과 내장 LED를 사용한 간단한 예시 를 작성하였습니다.

시간 지연 vs 시간 측정 차이 delay() 와 millis() 함수 느낌 차이 아두이노에서 시간 지연 함수와 시간 측정 함수로 프로그래밍을 한다는 것은 위와 같은 명령의 차이입니다. ①로 지시 받은 박과장은 하던 것을 멈추고, 아무것도 못하는 상태로 5분을 보내다가 요청 받은 일을 처리합니다. 지시 받은 박대리는 아무것도 못하고 답답한 채로 1분을 보내고 요청받은 일을 하겠지만, 지시하는 입장에서는 일 시키기가 간단하고 아무것도 하지 못하게 했기 때문에, 지시한 일에 대한 결과가 잘 못될 염려가 없습니다. 하지만, ②로 지시 받은 박과장는, 하던 일을 멈추지 않거나, 5분 동안 잠시 다른 일을 하고 와서 요청 받은 일을 수행 할 수 있습니다. 다른 일을 하는 중에 중간 중간 시계를 보며 5분이 되어가는지 확인을 해야 합니다. 지시하는 입장에서도 5분 동안 아무것도 한 것과 다르게, 다른 일을 할 수 있어 지시한 일에 대해 영향을 주는 변수가 생길 수 있다는 염려가 있을 수 있습니다. 위의 ①과 같은 방식이 시간 지연, ②와 같은 방식이 시간을 측정 하는 방식으로 업무를 지시 하는 방법입니다. 아두이노 프로그램에도 시간 지연 함수와, 시간 측정 함수가 있습니다. 시간 지연 : delay(), delayMicroseconds()

장점 : 프로그래밍 간단함

단점 : 지연되는 시간 동안 아무 것도 못함

시간 측정 : millis(), micros()

장점 : 특정 기능 동작해야 하는 시점 가지 여러가지 일을 같이 할 수 있음

단점 : 프로그램이 복잡함 시간 함수 정의 delay() milliseconds 단위로 프로그램을 멈춥니다. ms 입력되는 변수 타입은 unsigned long(4byte) 으로 0 ~ 4,294,967,295 까지 입력이 가능 합니다. 즉, delay() 함수는 최대 49.7日 까지 지연이 가능합니다. Syntax : delay(ms) Parameters ms : 밀리 초 단위의 숫자 (Data type : unsigned long) Return : 없음 Example delay(1000) : 1s (1000ms) 동안 프로그램 멈춤

delay(500) : 0.5s 동안 프로그램 멈춤 delayMicroseconds() microseconds 단위로 프로그램을 멈춥니다. us 입력되는 변수 타입은 unsigned int(2Byte) 으로 0 ~ 65,535 까지 입력이 가능합니다. 즉, microseconds() 함수는 최대 65ms 까지 지연이 가능합니다. Syntax : delayMicroseconds(us) Parameters us : 마이크로 초 단위의 숫자 (Data type : unsigned int) Return : 없음 Example delayMicroseconds(50) : 50us 동안 프로그램을 멈춥니다.

delayMicroseconds(1000) : 1ms(1000us) 동안 프로그램을 멈춥니다. millis() 아두이노 프로그램이 시작된 시간을 기준으로, 현재 시간을 ms 단위로 반환합니다. 약 49.7日 까지 시간 측정이 가능합니다. 49.7日이 지나면 (오버플로우가 발생하여) 0ms 로 초기화 됩니다. millis() 로 반환되는 값을 저장하는 변수는 unsgined long 으로 선언되어야 합니다. Syntax : time = millis() Parameters : 없음 Returns 프로그램이 시작되고 현재 시간을 ms 단위로 반환 합니다.

약 49.7日 이 경과한 경우 0으로 초기화 됩니다.

Data Type : unsgined long micros()

아두이노 프로그램이 시작된 시간을 기준으로, 현재 시간을 us 단위로 반환합니다. 약 70분 정도까지 측정이 가능합니다. 약 70분이 지나면 (오버플로우가 발생하여) 0 으로 초기화 됩니다.

micros() 로 반환되는 값을 저장하는 변수는 unsigned long 으로 선언되어야 합니다.

Syntax : time = micros() Parameters : 없음 Returns

프로그램 시작되고 현재 시간을 us 단위로 반환

약 70분 경과한 경우 0으로 초기화

Data Type : unsigned long

시간 함수로 LED 깜빡이기

delay() 함수와 delayMicroseconds() 는 사용 법이 비슷하고, millis() 와 micros() 함수는 사용법이 비슷하므로, delay() 함수와 millis() 함수를 사용하여 500ms 마다 Arduino Uno LED가 깜빡이는 코드를 작성하고 비교해 보겠습니다.

delay() 함수로 LED Blinking

1 2 3 4 5 6 7 8 9 10 void setup (){ pinMode ( 13 , OUTPUT ); // 13번핀 출력 설정 } void loop (){ // 13번핀 현재 전압의 반전된 값으로 출력 // HIGH 일경우 LOW로, LOW일 경우 HIGH 로 반전 출력 digitalWrite ( 13 , ! ( digitalRead ( 13 ))); delay ( 500 ); } Colored by Color Scripter cs

millis() 함수로 LED Blinking

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 unsigned long past = 0 ; // 과거 시간 저장 변수 int flag = 0 ; // 과거 기준 시간 보다 500ms 이상 지날 경우를 판단하는 flag void setup (){ pinMode ( 13 , OUTPUT ); } void loop (){ unsigned long now = millis (); // 현재 시간을 저장 // 현재 시간이 과거 시간보다 500ms 지났을 때 // 과거 시간에 현재 시간을 저장 // 500ms 시간이 지낫음을 알려 주는 flag 를 1로 활성화 if (now – past > = 500 ){ past = now; flag = 1 ; } // flag 가 1인 경우 // LED를 현재 상태 반전으로 출력 // flag 를 0으로 초기화 if (flag = = 1 ){ digitalWrite ( 13 , ! ( digitalRead ( 13 ))); flag = 0 ; } } Colored by Color Scripter cs

결과 비교 하기

위의 두 가지 코드 동작은 동일합니다. 큰 차이가 있다면, millis() 로 사용한 코드는 복잡하지만, 추가 다른 기능을 넣어도 LED 가 500ms 마다 깜빡이는 기능은 그대로 유지 할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 unsigned long past = 0 ; // 과거 시간 저장 변수 int flag = 0 ; // 과거 기준 시간 보다 500ms 이상 지날 경우를 판단하는 flag void setup (){ pinMode ( 13 , OUTPUT ); } void loop (){ unsigned long now = millis (); // 현재 시간을 저장 // 현재 시간이 과거 시간보다 500ms 지났을 때 // 과거 시간에 현재 시간을 저장 // 500ms 시간이 지낫음을 알려 주는 flag 를 1로 활성화 if (now – past > = 500 ){ past = now; flag = 1 ; } // flag 가 1인 경우 // LED를 현재 상태 반전으로 출력 // flag 를 0으로 초기화 if (flag = = 1 ){ digitalWrite ( 13 , ! ( digitalRead ( 13 ))); flag = 0 ; } /* ex) 추가 기능 1 – 센서 입력 받아서 제어 */ /* ex) 추가 기능 2 – PC와 시리얼 통신 */ /* ex) 추가 기능 3 – 모터 동작 하기/ } Colored by Color Scripter cs

마무리

본 포스트에서 아두이노에서 제공되는 시간 함수에 대해 알아보았습니다.

delay() 함수는 프로그램을 중지시키는 방식으로, 복잡한 프로그래밍을 작성시 지양해야 할 함수입니다. 특정한 시간마다 이벤트를 발생시키면서 다른 기능들을 함께 수행하고자 할 때는 시간을 측정하는 millis() 함수를 대신하여 사용 할 수 있습니다. 이외에도 멀티테스킹 같은 효과를 만들어 주는 방식은 Timer, Interrupt 등의 방식으로 구현 할 수 있으며, 추후 포스트에서 자세히 다루도록 하겠습니다.

끝까지 읽어 주셔서 감사합니다.^^

아두이노 기초 강좌 12 – delay 함수와 싱글 스레드

아두이노 기초 강좌는 아두이노를 처음 접하시는 전자분야 비 전공자를 위한 강좌입니다. 이해를 위해서는 간단한 프로그래밍 지식이 필요할 수 있습니다. 프로그래밍이 처음이라면 [아두이노 프로그래밍 기초] 강좌를 먼저 읽으시길 권해 드립니다.

=============================================================

이번 강좌에서는 delay 함수에 대해서 얘기해 보겠습니다.

1. delay 함수와 주의 사항

delay(milli_second);

굉장히 간단한 함수입니다. 이 함수를 사용하면 아두이노가 이 함수를 처리할 때 지정된 milli-second(밀리초, 1/1000초 단위) 동안 아무것도 안하고 쉬게됩니다. 이 함수는 아두이노에서 굉장히 빈번히 사용되는데, 사용할 때 주의할 점이 있습니다.

아두이노 기초강좌 5편을 보시면 버튼 예제가 있습니다. 버튼을 눌렀을 때 이를 감지하고 그 결과를 Serial Monitor로 출력하는 예제입니다.

/* DigitalReadSerial Reads a digital input on pin 2, prints the result to the serial monitor This example code is in the public domain. */ // digital pin 2 has a pushbutton attached to it. Give it a name: int pushButton = 2; // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // make the pushbutton’s pin an input: pinMode(pushButton, INPUT); } // the loop routine runs over and over again forever: void loop() { // read the input pin: int buttonState = digitalRead(pushButton); // print out the state of the button: Serial.println(buttonState); delay(1); // delay in between reads for stability }

주석을 제거하고 보면 간단한 코드입니다. loop 구문 안에서 수행되는 작업은

버튼 상태 읽기 –> 시리얼로 상태 출력 –> delay 로 잠시 쉼 (1/1000 초)

이 순서를 반복합니다.

그런데 여기서 delay(1000); 으로 수정하면 어떻게 될까요?

void loop() { int buttonState = digitalRead(pushButton); Serial.println(buttonState); delay(1000); }

그럼 버튼 상태 읽기 –> 상태 출력 –> 1초 쉽… 이렇게 바뀌니까 버튼 상태를 읽고 다음번 버튼 상태를 읽기까지 적어도 1초가 걸리는 겁니다. 매우 짧은 시간동안 버튼의 상태를 읽고 1초를 기다려버리니 사용자가 버튼을 길게 누르지 않고 짧게 누르면 떼버리면 ‘클릭’ 상태를 인식하지 못할 가능성이 커집니다.

그래서 버튼과 같이 특정 상태가 지속되지 않는 입력을 체크해야 하는 경우 반복문이 최대한 빨리 수행될 수 있도록 주의해야 합니다. delay 함수와 같이 아두이노가 멈춰버리는 함수 혹은 시간이 오래 걸리는 작업을 최대한 줄여야 합니다.

.

2. 아두이노는 일꾼이 한 명 뿐

사실 delay 함수에 이런 제약이 생기는 것은 아두이노가 오로지 싱글 프로세스, 싱글 스레드 만을 지원하기 때문입니다. 뭔 소리냐면…

아두이노에서는 우리가 작성한 코드를 처리하기 위해 오로지 한 명의 일꾼만을 투입한다는 얘기입니다. PC나 폰은 다중 프로세스, 다중 스레드를 지원합니다. 즉 여러명의 일꾼들을 투입할 수 있다는 의미입니다. 따라서 PC나 폰에서 똑같은 버튼 입력 작업을 한다면 한명은 버튼 상태만 감지하도록 시키고 다른 한 명은 버튼 상태에 따라 원하는 작업을 하도록 하면 되죠. 아두이노는 이게 안된다는 의미입니다.

만약에 입력장치로 버튼을 사용하지 않고 포텐셔미터를 사용한다면 어떨까요?? 포텐셔미터는 휠의 위치에 따라 저항이 변하는 입력 장치이기 때문에, 사용자가 움직임을 주면 변경된 상태(저항값)가 유지됩니다. 그래서 이런 문제에서 더 자유롭죠.

버튼과 delay 함수 사용시 발생하는 이런 문제는 다른 곳에서도 발생합니다. 앞선 강좌에서.. PC에서 시리얼 모니터로 글자들을 전송하면 아두이노에서 아래 함수를 사용해서 읽어옵니다.

if( Serial.available() ) { char input = Serial.read(); … }

그런데 PC에서 전송한 데이터를 읽기 전후에 굉장히 복잡한 작업을 처리하거나 delay 함수를 써서 아두이노가 상당한 시간동안 손 놓고 있다면?? PC에서 많은 데이터를 전송할 때 전송한 데이터가 누락되거나 버퍼(데이터 임시 저장소)가 흘러넘쳐 알 수 없는 문제가 발생할 수 있습니다.

delay 함수는 굉장히 유용하고 간단한 함수이지만 프로젝트가 복잡해 질 수록 사용에 주의가 필요합니다.

===============================================================

이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.

이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.

작성자 : GodsTale ([email protected])

아두이노 delay() 와 millis()

안녕하세요~!

이번시간에는 delay() 함수와 millis()의 차이에 대해 살펴보겠습니다.

일반적으로 LED를 깜빡이거나, 단순한 ON/OFF의 반복이 지속될때는 delay()함수를 많이 이용하죠?

아두이노 Blink 예제를 보셔도 delay()함수를 이용해 LED를 켰다 껐다 한답니다.

그럼 만약에 LED 두개를 엇갈려서 1초 간격으로 껐다켰다 하려면 어떻게 할까요?

아래 그래프처럼 보이게 만들어 봅시다.

자 그럼 LED1은 1초동안 깜빡이고, 그 중간 타이밍에 LED2를 깜빡이면 되니 직관적으로 코드를 짜보면

const uint8_t LED1 = 10;

const uint8_t LED2 = 11;

void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); }

void loop() { //LED1 Blink digitalWrite(LED1,HIGH); delay(1000); digitalWrite(LED1,LOW); delay(1000);

//LED2 Blink digitalWrite(LED1,HIGH); delay(1000); digitalWrite(LED1,HIGH); delay(1000); }

이런식이 될텐데, 실제로 이 코드를 돌려보면 원하는 형태로 움직이지 않는답니다.

아마 아래와 같은 식으로 켜졌다 꺼졌다 할겁니다.

이렇게 되는 이유는 바로 delay()함수때문인데요, delay()함수가 실행되면

해당 시간(ms)동안은 아무런 동작도 하지않고 그냥 정지! 상태입니다.

즉, delay()함수뒤에 그 어떤 코드가 있더라도 실행이 되지않는답니다!

그럼 이를 해결할수 있는 방법은 두 가지가 있어요.

1) delay()함수를 쓰되, 최소 시간단위로 쪼개서 코딩하는 법

2) millis()를 써서 특정 시간이 되면 특정 기능을 실행

먼저 1번 방법부터 봅시다.

# 1

최소 시간단위로 쪼갠다는게 무슨 의미냐 하면,

상태가 변하는 순간부터 다음 상태가 변하는 순간까지의 시간을 단위시간이라 하고,

이를 기준으로 코딩한다는 겁니다.

맨 처음 그림에서 보면 상태는 500ms 마다 변하고있죠?

그럼 최소단위시간은 500ms가 된다는겁니다.

이에 맞게 코딩을 해보면,

const uint8_t LED1 = 10;

const uint8_t LED2 = 11;

void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); }

void loop() {

digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); delay(500);

digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); delay(500);

digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); delay(500);

digitalWrite(LED1,LOW); digitalWrite(LED2,HIGH); delay(500); }

이런 식으로 짜면 딱 맞게 동작하겠죠?

하지만, 여전히 delay()함수때문에 이 외의 코드를 추가한다거나,

analog 신호를 읽어올때는 제대로 실행이 되지 않는답니다.

# 2

그렇다면 delay함수때문에 뒤의 코드가 실행이 되지 않는다면 어떻게 하면 될까요?

우선 delay()함수를 좀 더 뜯어서 살펴보면,

int delay_time = 500;

while(delay_time < 500){ //Nothing.. just wait delay_time++; } 이런 식으로 빈 while루프가 특정 시간이 되기전까지 무한히 도는 형식의 코딩이 된답니다. 하지만 임의로 우리가 delay함수 내부의 while루프에 특정한 코딩을 할 수가 없기때문에, 위 함수의 형식을 빌려와서 void loop() 메인 루프에 그대로 덧씌워 delay()함수를 모사한다면 조금 더 자유로움 delay()함수를 사용할 수 있게 되겠지요. 그럼 어떻게 할까요? 단순합니다. 매 루프마다 millis()라는 함수를 사용해서 현재 아두이노의 시간이 몇 ms인지 파악하고, 그 시간이 우리가 원하는 지정된 시간 이상이 되면 특정 함수를 실행하는 거죠. 단, millis()는 조금만 시간이 지나도 숫자가 매우 커지기때문에, 가장 큰 길이의 데이터 형태인 long을 사용하고, 음수의 시간데이터는 나오지 않기 때문에 unsigned를 붙혀 데이터의 가용범위를 늘립니다. 자, 그럼 LED 1개를 깜빡이는 코드를 millis()로 구현해보면, const uint8_t LED1 = 10; // Set timer unsigned long pre_time = 0; unsigned long cur_time = 0; // Set LED status boolean state_led1 = 0; // Set duration const int duration = 1000; void setup() { pinMode(LED1, OUTPUT); // Initialize previous counter time pre_time = millis(); } void loop() { // Update current time in every loop cur_time = millis(); // If time gap between previous and current goes over the duration, // run digital write! if(cur_time - pre_time >= duration){

// Change the boolean state. state_led1 = ~state_led1;

digitalWrite(LED1,state_led1);

// Update previous counter time. pre_time = cur_time; }

else{ // Do something… } }

이런 코드가 나오게 됩니다.

시간을 계속 업데이트하고,

-> 지정된 시간만큼의 차이가 나는지 확인

-> 만약 차이가 아직 안나면 else()구문으로 넘어가 평소 작업 수행

-> 막약 차이가 나면 if()구문 안의 작업을 수행

-> 작업 완료되면 pre_timer를 현재 값으로 업데이트 해주고 if()구문 끝

이 예제는 LED가 1개일때 사용하는 예제이구요,

위에서 언급되었던 LED 2개를 번갈아가며 켜는 예제의 경우는

위의 코드를 보고 한번 짜보세요^^

하지만 이러한 millis()의 경우도, 완벽한 해결책이 되지 못할때가 많습니다.

예를 들어 else()구문의 코드가 굉장히 오래 걸려 100ms 가 걸렸다면,

LED는 100ms이하의 속도로 깜빡거릴수가 없겠죠..?

이런걸 해결하는 방법이 바로 ‘타이머(Timer)’ 랍니다.

타이머와 관련된 자료는 여기서 볼 수 있습니다^^

궁금하신 점이 있으시면 댓글 남겨주세요~!

그리고 도움이 되셨다면 공감 버튼 한번만 눌러주세요^^

delay() / millis() > 임베디드 보드

강좌가 tone() 함수 앞에 왔어야 되는데..

*줄줄이사탕 주의 : 최대한 쉽게 설명하려고 했지만, 타이머/카운터 기능 자체가 쉽게 설명이 되는 기능이 아니라 강좌를 쓰다보니 주절주절하게 됐..ㅜㅜ 중요하지 않으므로, 함수를 사용하는 방법만 이해하고 넘어가도 됨.

우리가 처음 살펴봤던 예제 “Blink”에서 LED를 1초 간격으로 켜고 끄기 위해 delay() 함수를 사용했었다. 그리고 다른 많은 예제에서도delay() 함수는 유용하게 사용되며, 이 전의 인터럽트 강좌에서는 delayMicroseconds() 함수까지 사용했었다.

그때 delay() 함수는 타이머 인터럽트를 사용하는 함수이므로 ISR(Interrupt Service Routine, 인터럽트 처리 함수)에서는 사용할 수 없으며, 대신 타이머 인터럽트를 사용하지 않는 delayMicroseconds() 함수는 사용할 수 있다고 잠시 설명했었는데, 이건 “참고”에 있던 내용이라 못 본 사람도 있겠군.

아두이노에서는 시간과 관련된 기능을 제공하기 위해서 하나의 타이머를 기본 타이머로 설정하여 사용하고 있으며, 이 타이머를 이용하는 기본 함수는 delay() 함수와 millis() 함수이다.

타이머에 관해서는 나중에 따로 자세히 포스팅하려고 계획 중이지만, 개념에 관한 설명이 될 것 같아서 넣을까 말까 아직 고민 중임. 간단하게는 지난 강좌에서 설명했고. 이 것도 “참고”에 있던 내용이라 못 봤을 수도..ㅎㅎㅎㅎ

아무튼 아두이노에 전원을 딱 넣으면 setup() 함수의 내용을 실행하기 전 기본 세팅을 하도록 되어있는데, 바로 여기에서 타이머가 설정된다. 설정되는 타이머는 0번 타이머.

아두이노 보드의 종류에 따라 각각 보유하고 있는 타이머의 개수가 다른데, 우노는 3개, 메가는 6개. 이 타이머들을 모두 항상 사용하는 건 아니지만, 0번 타이머 하나는 항상 사용된다고 보면 된다. 나머지는 analogWrite() 함수라던지, tone() 함수 등에 사용된다.

우선 함수부터 살펴보자.

millis()

반환 값

ms : 전원이 인가된 이후의 시간. 밀리초. (unsigned long 타입)

말했다시피 아두이노 보드에 전원이 인가된 후 얼마만큼의 시간이 지났는지를 밀리초 단위로 반환한다. 반환 값의 데이터 타입은 unsigned long 타입이고, unsigned long 타입(4바이트)이 가질 수 있는 최대 값은 4,294,967,295이며, 이 값으로 약 49.71일을 셀 수 있다. 즉 50일 정도가 지나면 다시 0부터 시작한다는 뜻.

반환 타입이 unsigned long이라는 점에 유의해야 한다. 만일 int 같은 다른 데이터 타입으로 값을 저장할 경우 사용자의 의도와는 다른 결과가 나타날 수 있다, 라고 아두이노 홈페이지에 써있어요.

delay() 함수를 사용해서 동작을 멈추게 되면 시리얼 통신이나 센서 체크 등의 기능을 사용할 수 없게 되는 경우가 많기 때문에 delay() 함수 대신 millis() 함수를 이용한 시간 처리 루틴을 만들어 사용하기도 한다.

micros()

반환 값

us : 전원이 인가된 이후의 시간. 마이크로초. (unsigned long 타입)

millis()와 동일한 동작을 하지만 반환 값이 마이크로초 단위이다. 단, 16MHz의 보드에서 (메가와 우노 모두 16MHz의 클럭 속도를 가진다) micros() 함수로 반환되는 값은 항상 4로 나누어 떨어지는 값이며, 따라서 최대 3.9999 마이크로초의 오차가 발생할 수 있다.

millis() 함수와 마찬가지로 반환 타입이 unsigned long이므로 micros()의 반환 값은 약 71분에 한번씩 0으로 되돌아간다.

위에서 말했다시피, millis() 함수와 micros() 함수는 모두 타이머/카운터 기능을 사용해서 동작한다.

타이머/카운터는 칩이 구동하기 위한 클럭(clock)을 기준으로 증가하는 카운터를 활용하여 시간을 계산하는 기능이다. 단, 클럭과 동일하게 카운터가 증가하게 되면 너무 큰 수의 값이 사용되기 때문에 적당한 값으로 클럭을 나눠서 사용(이를 분주(Prescale)라 한다)하고, 그렇게 증가하는 값이 일정한 값이 되었을 때 인터럽트가 발생, 인터럽트 처리 함수에서 그 카운터 값을 활용하여 실제 시간 값을 계산해 저장하게 된다.

타이머 인터럽트를 사용하기 때문에, attachInterrupt() 함수로 설정한 인터럽트 처리 루틴에서 millis() 함수나 micros() 함수를 사용할 수 없다. (사용할 수는 있어도 값이 변하지 않기 때문에 소용이 없다. 하나의 인터럽트가 처리 중일 때 다른 인터럽트가 처리될 수 없으므로.)

delay(ms)

이미 많이 사용했던 함수지만 다시 한번 살펴보자.

매개 변수 ms : 밀리초 단위로 프로그램이 대기해야 할 시간을 지정한다. unsigned long 타입이므로, 최대 49.71일까지 설정할 수 있다. (근데 그만큼 설정할 일은 아마 없…)

간단히 설명하면 이렇고, 좀 더 자세히 설명하자면 우선 delay() 함수의 내용을 보자. (몰라도 됨 주의)

void delay(unsigned long ms) { uint16_t start = (uint16_t)micros(); while (ms > 0) { if (((uint16_t)micros() – start) >= 1000) { ms–; start += 1000; } } }

micros() 함수는 전원이 인가된 후로 지난 시간을 마이크로초 단위로 반환하고, delay() 함수가 시작될 때 start 변수에 저장된다. 그리고while() 문을 반복하며, micros() 함수가 반환하는 시간(시간이 지날수록 micros() 함수가 반환하는 값이 점점 커질테니)이 start 변수에 저장된 시간과 비교해서 1000을 넘을 경우, 즉 1000 마이크로초(=1 밀리초)가 지나면 매개 변수로 받은 ms 값을 1 감소시킨다. 이 동작을ms 값이 0보다 같거나 작아질 때까지 반복한다.

그래서 설정한 ms 밀리초만큼 대기하게 된다,는 원리.

delay() 함수 내에서 micros() 함수가 사용되므로, delay() 함수 역시 인터럽트 처리 루틴 내에서 사용할 수 없다.

delayMicroseconds(us)

매개 변수 us는 마이크로초 단위의 시간을 나타내는 unsigned long 타입의 변수이다.

이 함수는 micros() 함수를 이용하지 않는다. 단지 us 값이 0이 될 때까지 us 값을 1씩 감소시키는 구문을 어셈블리어(기계어)로 처리한다. 이 어셈블리 구문이 총 4클럭을 소요하게 되므로 아두이노 보드의 클럭 속도에 맞춰 us 값을 적당히 곱해주는 작업이 이 전에 처리된다.

어렵게 들릴지 모르겠지만, 간단하게 말하면 설정한 마이크로초만큼의 시간동안 아무 의미 없는 명령어를 읽어오고 분석하는 것을 반복한다는 뜻. delay() 함수처럼 micros() 함수를 사용하는 것이 아니므로, 인터럽트와는 상관 없이 사용할 수 있다.

인터럽트 강좌에서는 millis() 함수나 micros() 함수에 대해 아직 다뤄보지 않았기 때문에 채터링 현상을 delayMicroseconds() 함수로 처리했지만, 사실은 인터럽트 루틴 내에서는 delay() 함수든 delayMicrosecodns() 함수든 사용하지 않는 것이 좋다. 인터럽트 루틴은 처리 시간이 최소화 되어야 다른 인터럽트에 영향이 없기 때문.

다음 강좌에서는 delay() 함수나 delayMicroseconds() 함수를 사용하지 않고 시간 지연을 줄 수 있는 방법에 대해서 알아보자.

그럼 이만. 뿅!

키워드에 대한 정보 아두 이노 딜레이

다음은 Bing에서 아두 이노 딜레이 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

See also  높은 음자리표 그리기 | 2-1. 높은음자리표 183 개의 정답
See also  인장 시험 그래프 | [Abaqus Example] 인장시험 결과에서 탄성계수 측정 및 응력 변형율선도변환 224 개의 자세한 답변

See also  사설 토토 경찰 출석 | [토토] 사설토토로 경찰 출석 전화가 오면 어떻게 해야 할까? 상위 175개 답변

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 아두이노에서 delay 함수 없이 주기적인 작업 실행

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

아두이노에서 #delay # #함수 #없이 #주기적인 #작업 #실행


YouTube에서 아두 이노 딜레이 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 아두이노에서 delay 함수 없이 주기적인 작업 실행 | 아두 이노 딜레이, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *