[아두이노] 아날로그형 온습도계 만들기

아두이노 초급 강좌에 포함된 내용이었던 아날로그형 온습도계 만들기 프로젝트입니다.

간단히 말씀드리면 온습도계 모듈을 이용해서 온도와 습도를 측정하고 서보모터 2개를 이용해서 바늘로 표시해주는 간단한 프로젝트입니다. 회로를 구성해서 하드보드지로 만든 케이스를 씌운 프로토타입은 아래와 같습니다.

20141108_182433_small

간단한 탁상용 온습도계로 이용하기에도 좋고, 교육용 DIY 킷으로 이용할 수도 있습니다.

 

1. 온습도계 만들기 준비

 

사용된 부품은 다음과 같습니다.

아두이노 Nano, 온습도계 모듈 (DHT11), 마이크로 서보모터(sg90)x2, 브레드보드, 연결선 (Dupont cable), 외부전원(5v)

동작구조는…

  • 온습도계 모듈을 통해 온도, 습도 측정
  • 온도, 습도 값을 서보모터를 움직이기 위한 각도 값 (0~180) 으로 변환
  • 서보모터 동작
  • 너무 빠르게 업데이트 되지 않도록 적절히 delay

 

2. 연결방법

 

아두이노와 온습도계의 연결은 아래와 같이 합니다.

1365485508

사용된 DHT11 모듈에 대한 상세정보는 링크를 참고하세요. >>>> DHT11 모듈 상세 페이지 (DHT11 모듈 사용을 위해서는 라이브러리 설치가 필요합니다. 링크에서 라이브러리 다운로드 받아 설치하세요)

 

이제 아두이노와 서보모터의 연결입니다.

테스트를 해보니 아두이노 Nano의 5v 핀에서 뺀 전원으로는 마이크로 서보모터 1개 밖에 돌리질 못했습니다. 마이크로 서보모터는 외부의 5v 전원을 사용해야 합니다. (서보의 GND가 아두이노의 GND에도 연결되도록 해주세요)

servo_with_external_power

서보모터까지 연결이 된 상태라면 이제 준비는 끝났습니다.

 

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 형태로 발전시킨 예제는 [링크]에서 확인하세요.

프로토타입을 만들 때 사용된 외관은 레이저 커터를 이용해서 재단한 하드보드지 입니다. 개편된 홈페이지의 같은 게시물에서 디자인 파일을 받으실 수 있습니다. http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=project_hardcopy&wr_id=12

 

아래 이미지는 [디자인 스튜디오 36.5] 와 협업해서 만든 제품입니다. 

&#51060;&#48120;&#51648; 1 - &#48373;&#49324;&#48376;


출처 : HARD COPY WORLD (http://www.hardcopyworld.com)

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

메이커 스토리

번호 제목 글쓴이 날짜 조회수
125 아두이노 헬박사님의 로봇팔 살리기 icon 양재동메이커 05-13 4,317
124 일반 레이저 커터 동파 사고 icon 양재동메이커 04-23 4,280
123 일반 기존 고양이 마이크로 파이썬으로 포팅 - 밀린 숙제하기 icon 양재동메이커 01-03 5,995
122 일반 휴식 icon 청계천도사 12-13 5,521
121 일반 기기를 수리한다는 것 icon 청계천도사 09-09 6,053
120 일반 수학 공부 왜 하나요? icon 청계천도사 07-20 6,759
119 아두이노 ESP32 CAM을 활용한 도깨비 자동차 Ver 3.0 icon 양재동메이커 06-12 8,086
118 라즈베리파이 Pupper 시작해서 Mini Pupper로 마무리 - 밀린 숙제하기 icon 양재동메이커 01-08 8,890
117 일반 말벌 인식 및 레이저 타격기 V 2.0 icon 양재동메이커 08-23 10,956
116 아두이노 ESP32 CAM - 도깨비 자동차 2 icon 양재동메이커 07-13 11,886
115 아두이노 ESP32 CAM - 도깨비 자동차 icon 양재동메이커 05-07 13,378
114 일반 급~한~개~발!! icon 청계천도사 04-08 12,388
113 일반 말벌 레이저 타격 테스트 모듈 icon 양재동메이커 03-10 13,521
112 아두이노 로보티즈 다이나믹 셀 MX-12W를 Arduino로 제어하기 (without 3 state buffer) +2 icon 양재동메이커 02-24 17,409
111 일반 2021 피우다 프로젝트 출품작 소개 자료집 icon HellMaker 01-12 12,942
110 일반 서보 모터 관련 여러가지 문제 icon 양재동메이커 11-19 13,768
109 라즈베리파이 Top Maker 해커톤 2021 icon 양재동메이커 08-29 13,291
108 라즈베리파이 라즈베리 파이 4 WiFi 안테나 확장 방법 icon 양재동메이커 08-24 18,930
107 아두이노 Otto Bot Bluetooth 연동하기 icon 양재동메이커 05-14 14,154
106 일반 자이로센서 roll, pitch, yaw 데이터 처리 구조 #2 icon HellMaker 03-01 14,145