-
아두이노 레시피 : 온습도센서 사용하기 - 기본편아두이노 레시피 2025. 2. 23. 09:47
# Recipe 7. 온습도 센서(DHT11) 모듈 / 기본 편
온습도센서와 여러 센서(토양습도, 빗물감지, 조도)를 이용하여 만든 아두이노 기상관측기(WeatherStation)
by AdrieSentosa (Instructables)
안녕하세요~ 아두이노 셰프입니다. 지금쯤이면 한창 학교에서 친구들이 뭔가를 만들 시기인 듯해요. 그래서 조금 도움이 되고자, 기초 편은 잠시 제쳐두고 기본 편을 몇 개만 다뤄볼게요. 그 첫 번째는 온습도센서! 아마 수업에서 사용되는 센서 중 당연 탑 3안에 들걸요?ㅋㅋ 기상관측기, 교실 디지털 온습도계, 실험장치 환경센서 등 다양한 프로젝트에 응용가능한 요긴한 친구랍니다. 깊게 다루지는 않을게요. (그건 고급 편에서...) 친구들이 센서를 이용해 메이킹할 정도로만 해보죠. 그럼 온습도센서(DHT11) 시작하겠습니다!
오늘의 재료 Ingredient
<메인 재료>
온습도 센서 (모델명 : DHT11)
(제품에 따라 모양이 조금씩 다를 수 있어요. 상관없습니다~)
<그 외 재료>
아두이노 우노
암-수 점퍼케이블(3개)
메이킹 방법 Steps
Step 1. 선 연결하기 Wiring
a. 센서의 S(시그널 핀)는 아두이노 D7번 핀에,
b. 센서의 VIN(+)은 아두이노의 5V에,
c. 센서의 GND(-)는 아두이노의 GND에 연결해 주세요.
(제품에 따라 센서의 핀 배치가 그림과 다를 수 있어요!)
- - - - - - - - - -
Step 2. 라이브러리 설치하기 Code preparing
코드를 동작하기 위해선 특정 라이브러리를 설치해야 돼요. 따라오실까요?
how. 1
'sketch' -> 'Include Library' -> 'Manage Libraries'에 들어가 주세요.(전 영어버전이라 이렇게 나와요ㅎ)
how. 2
검색창에 'dht11'이라고 검색해 주세요. 목록을 밑으로 내려보면 'SimpleDHT'가 있을 거예요.
'Install'버튼을 눌러서 설치해 주세요. 이제 저의 코드를 사용할 수 있습니다~!
- - - - - - - - - -
how. 3
메뉴창의 'file'-> Examples에 가면 여러분이 추가한 'SimpleDHT'에 대한 예제가 있어요.
이 코드를 조금 수정해서 여러분의 코드를 만들었답니다~ 나중에 천천히 살펴보세요!
Step 3. 아두이노 코드 Code review
여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ
#include <SimpleDHT.h> //DHT11을 사용하게 해주는 코드모음(라이브러리)을 가져올게요. //이렇게 연결하라네요. // for DHT11, // VCC: 5V or 3V // GND: GND // DATA: 2 int pinDHT11 = 2; // pinDHT11이라는 변수를 만들고 2라는 값을 설정할게요. '2'대신 pinDHT11 이라고 선언할게요. SimpleDHT11 dht11(pinDHT11); //SimpleDHT11 라이브러리에서 제공하는 클래스로 dht11이라는 객체를 생성하는거에요. //역시 아직은 몰라도 좋아요. 뜻만 설명하자면 센서를 동작할 수 있는 라이브러리의 코드를 여기 이 소스코드와 연결하는 코드랄까요;; //더 쉽게 얘기해볼까요? "센서의 시그널핀을 2번핀으로 사용하겠다." 끝! void setup() { Serial.begin(9600); //센서값을 모니터로 확인해야하니, Serial통신을 9600의 속도로 시작할게요. pinMode(LED_BUILTIN, OUTPUT); //내장된 LED도 사용하도록 OUTPUT모드로 설정하구요. } void loop() { // start working... Serial.println("================================="); //값이 계속 출력될텐데, 보기 좋게 구분선을 출력해보죠. Serial.println("Sample DHT11..."); //이 코드들은 센서의 값을 읽도록 처리하는 코드들이에요. 아직은 각각의 뜻을 다 몰라도 돼요. 그냥 그렇구나 하고 넘어갈게요. //------------------------------ byte temperature = 0; //1바이트 크기의 temperature변수를 생성하고 0으로 초기화한다. byte humidity = 0; //1바이트 크기의 humidity변수를 생성하고 0으로 초기화한다. int err = SimpleDHTErrSuccess; //err라는 이름의 정수형변수를 선언하고 라이브러리의 SimpleDHTErrSuccess 라는 상태값을 할당한다. if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { //전달한 매개변수가 NULL로 반환되었다면 에러코드를 출력하여 처리한다. Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); //에러코드 출력 Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); //에러코드 출력 return; //센서가 에러상태라면 코드를 더 이상 실행하지 않고 계속 성공할때까지 계속 에러처리를 반복한다. } //------------------------------ //너무 어렵죠~? 괜찮아요 몰라도 돼요.ㅎㅎㅎ (그냥 혹시 궁금한 친구들을 위해 적어봤어요 >.<) Serial.print("Sample OK: "); //에러가 없다면 Serial.print((int)temperature); Serial.print(" *C, "); //시리얼 모니터에 온도('C)를 출력하고 Serial.print((int)humidity); Serial.println(" H"); //시리얼 모니터에 습도(%)를 출력하라. //이제 이 센서로 간단하게 LED를 제어해보죠. if((int)temperature > 30 && (int)humidity > 50){ //&&는 C언어의 논리연산자인데요. 두 상태를 모두 만족해야 참이라는 뜻이에요. //즉 온도가 30이 넘고, 습도가 50이 넘어야 LED가 켜져요 digitalWrite(LED_BUILTIN,HIGH); //LED를 켜고 } else{ //그게 아니라면 digitalWrite(LED_BUILTIN,LOW); //LED를 끌게요. } // DHT11 sampling rate is 1HZ. delay(2000); //센서가 센싱하는데 1초정도 걸리기 때문에, 전체코드를 1.5초 이상의 텀으로 실행하는것을 권장해요. }
Step 4. 동작시키기 Working
● 코드를 업로드해 주세요.(USB선은 뽑지 않고 유지합니다.)
● 오른쪽 상단의 시리얼모니터를 열어주세요. (아니면 메뉴창의 “Tools” → “Serial Monitor”로 들어가도 돼요.)
● 모니터에서 에러가 나지 않는다면 정상적으로 센싱이 시작될 거예요.
● 입김을 불거나, 라이터불꽃을 가까이 가져가보면서 주변 온습도를 바꿔보세요. 아두이노의 내장 LED가 어떻게 바뀌나요?
오늘의 레시피는 여기까지입니다~ 더 깊은 맛을 원하시는 분은 아래 과학시즈닝을 참고해 주세요!
“과학으로 양념하기” Seasoning
센서에 대한 과학적 원리와 세부내용으로 레시피에 더 깊은 맛을 넣어봅시다.
- - - - - - - - - -
센서에 대하여
과학원리
토양습도센서를 기억하실지 모르겠어요.
그때 "두 극 사이에 있는 토양의 수분함유량에 따라
저항도가 달라진다"라고 했었는데요.
오늘 이 온습도 센서는
이 토양습도센서의 고급버전이라고 할 수 있어요.
멋진 반도체기술이 적용되어 있거든요. (원리는 같아요)
습도를 측정하는 부분은 두 개의 전극판과
그 사이에 수분을 머금을 수 있는 반도체가 있어요.
마치 토양을 사이에 둔 토양센서의 두 극처럼요.
센서의 구조(습도측정 부분)
이 수분을 머금는 반도체는
수분함유량에 따라서 저항도가 달라집니다.
많으면 저항도가 낮아져서 전기가 잘 통하고,
낮으면 저항도가 높아져서 전기가 잘 안 통하거든요.
막상 이렇게 살펴보니 센서도 별거 아니죠?
동작원리
두 전극판이 있다고 했죠?
이 전극판에 전기를 흘려주어서
반도체에 통과되는 전류량을 판단하는 것이
기본적인 원리입니다.
그래서 센서를 사용하면 조금 뜨거워져요.
(얇은 금속판에 전류가 흐르니까요ㅎ)
‘변화하는 전기저항도를 측정한다’
는 원리는 간단하지만
이 센서는 습도를 측정하는 부분과,
온도를 측정하는 부분이 합쳐진 복합센서랍니다.
이름도 온습도잖아요ㅎ
가만 보면 시그널핀이 한 개밖에 없죠?
두 개의 측정된 데이터가 하나의 신호로 전송되거든요.
그래서 이전 토양습도센서처럼 간단하게 읽지는 못하고
신호를 해독(?)하는 과정이 필요해요.
근데 이게 코드로는 어려우니까,
우리는 남이 만들어놓은 코드(라이브러리)를 사용한 거고요ㅋㅋ
- - - - - - - - - -
코드의 동작 알고리즘
알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.
코드가 어떻게 동작되는지 알아볼까요?
(자세한 내용은 코드에 적어놓은 주석을 참고해 주세요~)
절차는 전보다는 조금 복잡합니다.
"센서가 센싱가능한 상태인지 확인한다." →
"만약 아니라면 오류절차를 반복한다." →
"에러가 없다면 읽은 데이터를 모니터에 출력한다." →
"센서값이 조건에 부합한다면 LED를 켜고 아니면 꺼라"
끝!
오늘은 이벤트 느낌으로
많이들 사용하는 온습도센서 사용하는 법을 다뤄봤어요.
제 코드를 만약 응용하고 싶으면, 다른 건 안 건드리고
IF문과 그 안의 코드만 바꾸면 되겠죠?
여러분이 원하는 조건에,
여러분이 원하는 결과로 만들어보세요~
’ 라이브러리’에 대한 내용은
기초 편이 모두 끝나고 다뤄볼게요.
오늘은 조금 어려웠는데, 어떠셨나요?
여러분이 프로그래머가 아니니
모든 코드를 이해할 필요는 없어요.
다만, 알고리즘인 진행절차를 이해하고
코드를 여러분이 원하는 대로 사용할 수 있게 되면 좋겠네요~
- - - - - - - - - -
센서요약 카드
이름 : 온습도센서 (DHT11)
설명 : 온도와 습도를 동시에 측정하는 센서이다. 측정을 위해 센서에 맞는 라이브러리 사용이 필요하다.
센서의 구성 : S(시그널) 핀, GND, VIN으로 구성되어 있다.
'아두이노 레시피' 카테고리의 다른 글
아두이노 레시피 : 온도센서 - 기본편 (0) 2025.02.23 아두이노 레시피 : 블루투스 사용하기 - 기본편 (0) 2025.02.23 아두이노 레시피 : 모터드라이버 사용하기 - 기초편 (0) 2025.02.22 아두이노 레시피 : 릴레이 모듈 사용하기 - 기초편 (0) 2025.02.22 아두이노 레시피 : 서보모터 사용하기 - 기초편 (1) 2025.02.22