아날로그형 온습도계 만들기
아두이노 초급 강좌에 포함된 내용이었던 아날로그형 온습도계 만들기 프로젝트입니다.
간단히 말씀드리면 온습도계 모듈을 이용해서 온도와 습도를 측정하고 서보모터 2개를 이용해서 바늘로 표시해주는 간단한 프로젝트입니다. 회로를 구성해서 하드보드지로 만든 케이스를 씌운 프로토타입은 아래와 같습니다.
간단한 탁상용 온습도계로 이용하기에도 좋고, 교육용 DIY 킷으로 이용할 수도 있습니다.
1. 온습도계 만들기 준비
사용된 부품은 다음과 같습니다.
아두이노 Nano, 온습도계 모듈 (DHT11), 마이크로 서보모터(sg90)x2, 브레드보드, 연결선 (Dupont cable), 외부전원(5v)
동작구조는…
- 온습도계 모듈을 통해 온도, 습도 측정
- 온도, 습도 값을 서보모터를 움직이기 위한 각도 값 (0~180) 으로 변환
- 서보모터 동작
- 너무 빠르게 업데이트 되지 않도록 적절히 delay
2. 연결방법
아두이노와 온습도계의 연결은 아래와 같이 합니다.
사용된 DHT11 모듈에 대한 상세정보는 링크를 참고하세요. >>>> DHT11 모듈 상세 페이지 (DHT11 모듈 사용을 위해서는 라이브러리 설치가 필요합니다. 링크에서 라이브러리 다운로드 받아 설치하세요)
이제 아두이노와 서보모터의 연결입니다.
테스트를 해보니 아두이노 Nano의 5v 핀에서 뺀 전원으로는 마이크로 서보모터 1개 밖에 돌리질 못했습니다. 마이크로 서보모터는 외부의 5v 전원을 사용해야 합니다. (서보의 GND가 아두이노의 GND에도 연결되도록 해주세요)
서보모터까지 연결이 된 상태라면 이제 준비는 끝났습니다.
3. 소스코드 (스케치)
코드 작성하기 전 몇 가지 주의할 점이 있습니다.
- 서보 모터+아두이노용 외부 전원은 5V/1A 이상이 되어야 넉넉할 것 같습니다.
- 서보모터는 0′, 180′ 근처에서 제대로 동작하지 않는 경우가 많습니다. 종류에 따라 틀리므로 가지고 계신 서보모터의 동작 범위를 확인하고 거기에 맞게 수정해야 겠습니다. 아래 소스에서는 15′ ~ 165′ 사이를 움직입니다.
- 아두이노가 처음 시작될 때 서보모터 2개가 0~180′ 구간을 왕복하도록 해줍니다. 그래서 바늘이 정확한 위치에 있는지 테스트 할 수 있도록 합니다.
- 더욱 정확하고 넓은 범위의 온습도 측정을 원하신다면 DHT22 모듈을 사용하시면 됩니다.
- loop 반복함수 마지막에 적절히 delay를 줘서 너무 빠르게 온도 업데이트를 하지 않도록 합니다.
#include <DHT11.h> #include <Servo.h> int pin=2; // Temperature sensor data pin DHT11 dht11(pin); Servo servo1; Servo servo2; int servo1Pin = 8; // control pin for servo motor int servo2Pin = 9; // control pin for servo motor int angle1 = -90; int angle2 = -90; int turnRate = 100; // servo turn rate increment (larger value, faster rate) int refreshTime = 20; // time (ms) between pulses (50Hz) int command; // raw user input //======================================================= void setup() { Serial.begin(9600); servo1.attach(servo1Pin); // Set servo 1 pin servo2.attach(servo2Pin); // Set servo 2 pin Serial.println("# Servo attached..."); delay(1000); Serial.println("# Check temp servo"); angle1 = 0; moveServo1(); delay(500); angle1 = 180; moveServo1(); delay(500); Serial.println("# Check humi servo"); angle2 = 0; moveServo2(); delay(500); angle2 = 180; moveServo2(); delay(500); } void loop() { int err; float temp, humi; Serial.println("# Read from thermometer"); if((err=dht11.read(humi, temp))==0) { Serial.print("temperature:"); Serial.print(temp); Serial.print(" humidity:"); Serial.print(humi); Serial.println(); // Calculate temperature servo position // Temperature range : 0 ~ 45 // Servo range : 0 ~ 180 angle1 = int(180 - temp*4); Serial.print(" Angle1:"); Serial.print(angle1); Serial.println(); moveServo1(); delay(1500); // Calculate humidity servo position // Humidity range : 0 ~ 90 // Servo range : 0 ~ 180 angle2 = int(180 - humi*2); Serial.print(" Angle2:"); Serial.print(angle2); Serial.println(); moveServo2(); delay(1500); } else { Serial.println(); Serial.print("Error No :"); Serial.print(err); Serial.println(); } delay(1000); //delay for reread } void moveServo1() { if(angle1 > 165) angle1 = 165; if(angle1 < 15) angle1 = 15; servo1.write(angle1); } void moveServo2() { if(angle2 > 165) angle2 = 165; if(angle2 < 15) angle2 = 15; servo2.write(angle2); }
앞선 아두이노 초급강좌 시리즈를 숙독하셨다면 이정도 소스코드는 어렵지 않게 이해하실 수 있으실겁니다.
여기에 추가로 블루투스나 WiFi 모듈을 붙여 다양하게 활용해보세요!! 온습도계를 IoT 형태로 발전시킨 예제는 [링크]에서 확인하세요.
프로토타입을 만들 때 사용된 외관은 레이저 커터를 이용해서 재단한 하드보드지 입니다.