안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊
코딩과 메이킹의 세계에 오신 것을 환영해요. 오늘은 우리 아두이노에게 '피부'와 같은 감각을 선물해 주는 아주 특별한 시간을 가져보려고 합니다. 바로 온도 센서(TMP36)를 이용해서 주변 온도를 실시간으로 측정하는 프로젝트예요.
이론으로만 배웠던 '다리 연결 법칙'이나 '온도 계산 공식'이 실제로 어떻게 쓰이는지 직접 확인해 볼 수 있는 절호의 기회랍니다. 조금 복잡해 보여도 저만 믿고 차근차근 따라오시면, 어느새 여러분의 책상 위에는 세상에 하나뿐인 디지털 온도계가 놓여 있을 거예요. 자, 그럼 시작해 볼까요?
Slide 1: 강의 시작! 3장 센서로 세상 느끼기
이번 시간에는 [3장 센서로 세상 느끼기]의 여섯 번째 주제인 온도 센서에 대해 배워볼 거예요. 그중에서도 오늘은 실제로 온도 센서 회로를 구성하고 코드를 작성하는 실습을 진행합니다. 이론을 현실로 만드는 가장 신나는 순간이죠!
Slide 2: 온도 센서 회로 구성하기
가장 먼저 해야 할 일은 바로 하드웨어 연결! 아두이노와 온도 센서를 서로 소개해 주는 시간이에요.
✅ 준비물
- 아두이노 UNO
- 온도 센서 (TMP36)
- 작은 브레드보드
- 점퍼선 3개
✅ 연결 방법
회로 연결에서 가장 중요한 건 온도 센서의 방향이에요. 센서를 자세히 보면 한쪽은 둥글고 한쪽은 평평하죠? 이 납작한 면이 나를 바라보도록 브레드보드에 꽂아주세요. 방향이 틀리면 센서가 제대로 작동하지 않거나 망가질 수 있으니 꼭! 확인해야 해요.
방향을 맞췄다면, 이제 세 개의 다리를 각각 연결해 줄 차례입니다.
- 왼쪽 다리 (전원 공급) 👉 아두이노 5V 핀에 연결
- 센서가 일할 수 있도록 에너지를 공급해 주는 선이에요.
- 가운데 다리 (신호) 👉 아두이노 A0 핀에 연결
- 가장 중요한 다리! 센서가 측정한 온도 정보를 아두이노에게 전달하는 통로 역할을 해요.
- 오른쪽 다리 (접지) 👉 아두이노 GND 핀에 연결
- 회로에 안정적인 기준점을 만들어주는 역할을 합니다.
슬라이드 이미지처럼 선 색깔을 맞춰서 연결하면 나중에 헷갈리지 않고 편하답니다. (빨간색: 5V, 검은색: GND, 초록색: 신호)
Slide 3: 온도 측정 코드 파헤치기
자, 이제 하드웨어 준비는 끝났어요. 아두이노에게 "이 신호를 받아서 공식에 맞춰 온도로 계산해 줘!"라고 명령을 내릴 차례죠. 바로 코딩 시간입니다!
| 01 | |
| 02 | |
| 03 | void setup() { |
| 04 | Serial.begin(9600); |
| 05 | } |
| 06 | |
| 07 | void loop() { |
| 08 | |
| 09 | int sensorValue = analogRead(A0); |
| 10 | |
| 11 | |
| 12 | float voltage = sensorValue * (5.0 / 1023.0); |
| 13 | |
| 14 | |
| 15 | float temperature = (voltage - 0.5) * 100.0; |
| 16 | |
| 17 | |
| 18 | Serial.println(temperature); |
| 19 | |
| 20 | delay(1000); |
| 21 | } |
코드가 조금 길어 보이지만, 사실은 딱 세 단계로 이루어져 있어요.
1️⃣ 센서 값 읽기
int sensorValue = analogRead(A0);
- A0 핀으로 들어오는 아날로그 신호를
analogRead() 함수로 읽어와요.
- 아두이노는 이 신호를 0에서 1023 사이의 정수 값으로 변환해서
sensorValue라는 이름의 상자에 저장합니다.
2️⃣ 전압으로 변환하기
float voltage = sensorValue * (5.0 / 1023.0);
- 0~1023 값은 컴퓨터가 알아듣는 숫자일 뿐, 실제 물리적인 값이 아니에요. 이걸 우리가 이해하는 실제 전압(0V ~ 5V)으로 바꿔주는 과정이 필요해요.
- 읽어온 센서 값에
5.0 / 1023.0 이라는 비율을 곱해주면 간단하게 전압으로 변환할 수 있답니다.
3️⃣ 섭씨 온도로 변환하기
float temperature = (voltage - 0.5) * 100.0;
- 마지막 단계! 변환된 전압 값을 우리가 사용하는 섭씨 온도(℃)로 바꿔주는 공식이에요.
- 이 공식은 TMP36 센서 제조사에서 "이렇게 계산하면 온도가 나와요!"라고 정해준 약속이니, 우리는 그대로 믿고 사용하면 된답니다.
코드를 모두 입력하고 아두이노에 업로드한 뒤, 오른쪽 위 돋보기 모양의 '시리얼 모니터'를 켜보세요. 1초에 한 번씩 현재 온도가 쭉쭉 출력되는 게 보일 거예요. 센서의 검은 머리 부분을 손가락으로 감싸 쥐면 체온 때문에 온도가 올라가고, 입김을 불거나 부채질하면 온도가 내려가는 마법 같은 경험을 할 수 있답니다!
Slide 4: 핵심 문법: int와 float 변수
방금 본 코드에 int와 float이라는 단어가 나왔죠? 이건 프로그래밍에서 데이터를 담는 그릇, 바로 '변수'의 종류(자료형)를 뜻해요.
우리가 물건을 정리할 때 책은 책꽂이에, 물은 물병에 담는 것처럼 프로그래밍에서도 숫자의 모양에 따라 알맞은 그릇을 선택해야 해요.
int (정수형, Integer)
- 소수점이 없는 딱 떨어지는 숫자를 담는 그릇이에요. (예: 1, 100, -5)
analogRead()가 돌려주는 값(0~1023)은 언제나 정수이기 때문에 int 그릇에 담는 것이 가장 적절해요.
float (실수형, Floating point)
- 소수점이 있는 정밀한 숫자를 담는 그릇이에요. (예: 3.14, 0.0048, -2.5)
- 전압이나 온도를 계산하다 보면 소수점이 생기는 경우가 많죠? 이럴 때
float 그릇을 사용해야 소수점 아래 값까지 온전히 보관할 수 있답니다.
변수를 만드는 규칙은 간단해요. 자료형 변수이름 = 값; 순서로 적어주면 끝!
Slide 5: 왜 int와 float를 구분해서 쓸까요?
"그냥 전부 float으로 쓰면 편하지 않나요?" 라고 생각할 수도 있어요. 아주 좋은 질문이에요! 우리가 이 둘을 구분해서 쓰는 데에는 아주 중요한 이유가 있답니다.
✅ int를 쓰는 이유: 효율성
analogRead(A0)가 읽어온 값은 0~1023 사이의 정수예요. 소수점이 나올 일이 전혀 없죠. 이런 값은 가볍고 빠른 int 그릇에 담는 게 훨씬 효율적이랍니다. 굳이 무거운 float 그릇을 쓸 필요가 없는 거죠.
✅ float을 쓰는 이유: 정확성
이게 정말 중요한데요, 바로 '나눗셈' 때문이에요. 아두이노는 정수끼리 나누면 결과도 정수로 만들어버리는 특징이 있어요. 소수점 아래는 가차 없이 버려버리죠.
예를 들어, 5 ÷ 1023을 계산하면 실제 결과는 0.00488...이지만, 이걸 int 그릇에 담으려고 하면 아두이노는 소수점을 싹 버리고 0으로 만들어버려요! 계산이 완전히 틀어지겠죠?
이런 대참사를 막기 위해 우리는 두 가지 조치를 취해야 해요.
- 결과를 담을 그릇을 반드시
float으로 준비한다.
- 계산하는 숫자 뒤에
.0을 붙여서 "이건 정수 나눗셈이 아니라 실수 나눗셈이야!"라고 아두이노에게 명확히 알려준다. (예: 5.0 / 1023.0)
이 작은 차이가 계산 결과의 정확도를 결정한답니다. 정말 중요하니 꼭 기억해 주세요!
어떠셨나요? 직접 만든 회로에서 실시간으로 온도가 측정되는 것을 보니 정말 뿌듯하지 않나요? 오늘 우리는 단순히 회로를 만들고 코드를 따라 친 것이 아니라, 아날로그 신호를 디지털 값으로 읽고, 그 값을 의미 있는 데이터(전압, 온도)로 변환하는 전 과정을 경험했어요. 그리고 그 과정에서 정확한 계산을 위해 변수의 종류를 올바르게 선택하는 것이 얼마나 중요한지도 배웠습니다.
오늘 배운 내용을 잘 응용하면 '온도가 30도 이상 올라가면 자동으로 선풍기를 켜는' 멋진 스마트홈 장치도 만들어 볼 수 있겠죠? 상상만 해도 신나네요!
오늘 실습 내용 중 궁금한 점이 있다면 언제든지 댓글로 질문 남겨주세요. 그럼 다음 시간에 더 재미있는 아두이노 프로젝트로 다시 만나요! 안녕! 👋
댓글 없음:
댓글 쓰기