WORK - 8 (실습)

JMIN·2025년 5월 26일

사물인터넷

목록 보기
20/23

🚀 1. 실습

  • 시리얼 모니터로 수신한 문자의 코드값 송신하기

⚡ 회로도

이 실습은 Serial 모니터만 이용한 실습으로, 아두이노와 PC만 연결되어 있으면 되기
때문에 별도의 회로도는 생략하였다.

📜 코드

Serial.available() 함수는 시리얼 버퍼에 읽을 수 있는 데이터가 있는지 확인할 때 사용한다.
이 값이 0보다 크다는 것은 수신된 데이터가 있다는 뜻이며, 이 조건이 만족되면 if문이 실행된다.

이때 Serial.read() 함수를 이용하여 데이터를 하나 읽어 data 변수에 저장하고, 이를
Serial.println(data, DEC)를 통해 출력하면 된다. 여기서 DEC10진수 형식으로 출력하겠다는 의미이며, 출력되는 값은 아스키 코드값이다.

예를 들어 문자 A를 입력하면 65가 출력된다.

주의할 점은 Serial.read()한 번에 한 문자(char)만 읽는다는 것이다.
즉, 14라는 숫자를 입력하면 문자 '1''4'가 각각 따로 처리되어 다음과 같이 출력된다.

	Data : 49
    Data : 52

이는 '1''4'의 아스키 코드값이다.

🌟 결과물


🚀 2. 실습

  • 스위치 누른 횟수 송신
  • 시리얼 모니터에서 'C'를 전송하여 누적된 스위치 누른 횟수 0으로 초기화

⚡ 회로도

📜 코드


별도의 저항 없이 사용할 수 있는 INPUT_PULLUP 모드를 이용했기 때문에,
버튼 입력값을 반전(NOT) 처리하여 변수 data에 저장했다.
이는 풀업 상태에서 버튼을 누르면 LOW가 되기 때문이다.

버튼을 눌렀을 때 data값은 HIGH가 되며,
이때 if문이 실행되고, 전역 변수로 선언된 count값을 증가시켜준다.

count값을 Serial.print() 등을 이용해 출력하면,
버튼이 눌릴 때마다 숫자가 하나씩 증가한다.

serialEvent() 함수는 시리얼 포트로부터 데이터가 도착했을 때 자동으로 호출되는 함수다.
따라서 첫 번째 실습에서 사용했던

	if (Serial.available() > 0)

와 같은 조건문을 대체할 수 있다.

이 함수 덕분에 loop() 문 안에 직접 시리얼 수신을 확인하는 코드를 넣지 않아도 되며,
데이터가 수신되면 자동으로 serialEvent() 함수가 호출되어 처리된다.

위 코드에서는 Serial.read()로 데이터를 읽어오고, 만약 그 값이 'C'라면,
누적되어 있던 count의 값을 0으로 초기화한다.

🌟 결과물

'C'를 입력 하면 count가 0으로 초기화가 돼서 다시 1부터 시작하는 모습


🚀 3. 실습

  • delay()함수 millis()함수로 대체

⚡ 회로도

📜 코드


millis() 함수는 아두이노가 작동을 시작한 이후부터 흐른 시간을 밀리초(ms) 단위로 반환한다.
기존에 자주 사용했던 delay() 함수는 실행 중 다른 작업을 막기 때문에,
LED를 순차적으로만 켜고 끄는 단순한 동작에만 적합했다.

반면, millis() 를 사용하면 여러 개의 LED를 서로 다른 간격으로 독립적으로 제어할 수 있어,
보다 유연한 프로그램 구성이 가능하다.

시간은 음수가 없기 때문에 unsigned로 선언하고,
millis() 는 매우 큰 값을 반환할 수 있으므로 언더플로우를 방지하기 위해 long형 변수를 사용했다.

if문 에서는 now라는 변수에 현재 시간을 저장하고 각 LED마다 다음과 같은 조건으로 비교했다.

	now - prev1 >= 1000 // 1초 경과
    now - prev2 >= 300 // 0.3초 경과
    now - prev3 >= 500 // 0.5초 경과

if문이 실행되면 해당 LED의 이전 시간을 now로 업데이트하여
주기적으로 반복 동작할 수 있도록 하고

또한, ledState = !ledState; 구문을 사용하면 현재 상태의 반대값으로 바꿔주어
NOW → HIGH, HIGH → LOW로 전환되면서 LED가 깜빡거리는 효과를 주었다.

🌟 결과물


📌 마무리

오늘은 회로도는 단순했지만, 작동 방식이 이전과는 많이 달랐던 실습을 진행했다.
특히 Serial Monitor를 통해 값을 입력받고 다시 출력하거나,
millis() 함수를 활용해 delay() 없이 시간 흐름을 제어하는 방식이 새로웠다.

실습 중 헷갈리는 부분도 있었지만, 수업 내용을 복습하며 하나하나 짚고 넘어갔다.
예를 들어, Serial 창에서 문자(char)를 입력했을 때는 아스키 코드 값이 그대로 출력되어 이해하기 쉬웠지만, 숫자 '14'를 입력했을 때는 14가 각각의 문자로 인식되어 각각의 아스키 값이 출력되는 점은 처음에 조금 헷갈렸다.

또한 millis()를 사용할 때는
현재 시간 - 이전 시간 >= 기준 시간 조건을 만족하면
이전 시간을 현재 시간으로 다시 초기화해야 하는 구조를 직접 따라 써보며 이해할 수 있었다.

오늘 실습을 통해 가장 크게 느낀 점은,
문제를 해결하거나 도전 과제를 진행할 때 코드를 바로 작성하기보다, 먼저 머릿속에서 전체 흐름과 구조를 충분히 구상한 후 키보드에 손을 올리는 것이 중요하다는 것이었다.

profile
🐂처럼 살기;

0개의 댓글