프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

아두이노로 컨트롤하는 난방 시스템

2015-05-12 10:40:55

오늘도 해외 작가의 컨텐츠를 소개해드립니다.

오늘은 자동 난방 시스템인데요.

작가가 거주하고 있는 지역의 특징상 날씨가 변덕스럽기 때문에 이런저런 적당한 온습도를 맞추기 힘들다고 하네요. 

그래서 제작했다고 하는데 현실에서 사용하기 위해 제작한 좋은 아이템인듯 보입니다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

URL: http://www.instructables.com/id/Arduino-controlled-room-heating-system/

 

 

Intro

처음으로 생각해 본 것은 내가 마이크로 컨트롤러를 사용하여 자동으로 방의 온 습도를 조절하는 시스템을 개발하는 것이었다. 방갈로르지방은 변덕스런 날씨를 가지고 있기에 온도는 일반적으로 습하지만 밤에는 때때로 매우 춥다. 그렇다고 춥지 않은 밤에는 난방을 하게 되면 자는 도중에 무척이나 불편해진다. 또한 일반적으로 습한 날씨가 지속되는 지역에서는 자동으로 온도를 조절하는 물건이 시장에 나오기는 어렵다.

이런 이유로 인하여 나는 첫 번째 아두이노를 사용한 프로젝트를 온 습도 컨트롤러로 결정했다.

 

특징은

1. 2개의 릴레이 보드로 컨트롤한다. 1개는 방의 히터를 조절하고, 1개는 가습기를 조절한다.

2. 온도와 습도를 10분마다 확인한다. 이것은 코드로 설정한다.

3. 알고리즘이 매우 쉽다. 현재 온도가 설정한 온도보다 1도 높아지면 히터를 끈다. 설정한 온도보다 아래로 떨어지면 히터를 켠다. 모든 난방시스템은 이와 유사하다.

4. 습도가 40%이하로 떨어지면 가습기 스위치를 켜고, 60%이상으로 올라가면 스위치를 끈다.

5. EEPROM을 사용하여 작동 시간 설정을 가능하게 한다.

6. 버튼을 사용해 시간을 설정한다. 1번 누르면 설정 온도를 1도 올리고, 길게 누르고 있으면 설정 온도를 1도 낮춘다. 설정 온도는 25 ~ 30도 안에서만 움직이게 한다.

 

 

Step 1: 필요한 전자 부품

 

 

1. Atmega328P-PU 부트로더 없는 것

2. 16MHz 크리스탈

3. 2 x 22 pf 캐퍼시터

4. LM 7805

5. 1 uF + 10 uF 전해 캐퍼시터

6. 10K 저항

7. DHT11(온습도 센서) Break out board 혹은 유사품

(http://cgi.ebay.in/ws/eBayISAPI.dll?ViewItem&item=...)

8. 2채널 릴레이 보드

9. 버튼 스위치 1개

10. 16x2 문자 LCD

11. 10k 가변저항

12. 9 – 12V 1Amp 파워 서플라이

13. 연결선

14. 전선

15. 일반 PCB판

 독립 아두이노 제작 및 사용법은 아래를 참조하시라.

(http://dushyant.ahuja.ws/2013/10/standalone-arduin...)

 

 

Step 2: 회로도

 

 

Fritzing 레이아웃은 위의 그림과 같다. 그림만 보면 조금 혼란스럽겠지만 이것이 내가 할 수 있는 최선이다.(나의 첫 Fritzing 작품이니 이해해 주기 바란다)

이 회로는 사실 매우 단순하다.

 

1. 1번 릴레이를 A1핀에 연결한다.

2. 2번 릴레이를 A2핀에 연결한다.

3. 스위치는 A5번 핀과 그라운드 사이에 연결한다. 또한 풀업저항을 달아서 HIGH값으로 유지시켜 준다.

4. DHT11은 13번 핀에 연결한다.

5. LCD핀은 D4~D7까지는 5~8번 핀에 연결한다.

6. LCD RS핀은 11번 핀에 연결한다.

7. LCD EN핀은 12번 핀에 연결한다.

8. 소켓이 없는 릴레이는 110/220V 전원과 플러그 사이에 연결되어야 한다.

9. LCD의 자세한 연결법은 아래에서 찾을 수 있다.

(https://learn.adafruit.com/character-lcds/wiring-a...)

 

 

Step 3: 코드

 

이 코드는 아래의 라이브러리를 사용한다.(이 라이브러리를 만들어준 모든 분들에게 감사한다)

1. OneButton: http://www.mathertel.de/Arduino/OneButtonLibrary.a...

2. DHT11: http://playground.arduino.cc/main/DHT11Lib

3. 타이머: https://github.com/JChristensen/Timer

4. EEPROM & 액체크리스탈: 둘 다 아두이노 IDE

 

#include "OneButton.h"
#include "EEPROM.h"
#include "Timer.h"

#define RELAY1 A1           // Connect humidifier to Relay1
#define RELAY2 A2           // Connect heater to Relay2
#define TEMP_SET 25         // Starting Temperature
#define MAX_TEMP 30         // Max Temperature
#define HUM_SET 40          // Threshold humidity
#define HUM_SET2 60
#define SWITCH_PIN A5       // Connect the switch between pin A5 and ground
#define CYCLE 10           //Time in minutes for each cycle

#include "LiquidCrystal.h"
#define LCD_RS 11           // * LCD RS pin to digital pin 12 - Green
#define LCD_EN 12           // * LCD Enable pin to digital pin 11 - Yellow
#define LCD_D4 5            // * LCD D4 pin to digital pin 5 - Blue
#define LCD_D5 6            // * LCD D5 pin to digital pin 6 - Blue
#define LCD_D6 7            // * LCD D6 pin to digital pin 7 - Blue
#define LCD_D7 8            // * LCD D7 pin to digital pin 8 - Blue

#include "dht11.h"
#define DHT11PIN 13

dht11 DHT11;
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
int temp_set;
Timer t;
OneButton button1(SWITCH_PIN, true);

void setup() {
  pinMode(DHT11PIN, INPUT);
  pinMode(LCD_RS, OUTPUT);
  pinMode(LCD_EN, OUTPUT);
  pinMode(LCD_D4, OUTPUT);
  pinMode(LCD_D5, OUTPUT);
  pinMode(LCD_D6, OUTPUT);
  pinMode(LCD_D7, OUTPUT);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  lcd.begin(16, 2);
  Serial.begin(9600);
  if(EEPROM.read(0) >= MAX_TEMP+1){
    EEPROM.write(0,TEMP_SET);
    temp_set=TEMP_SET;
  }
  else {temp_set=EEPROM.read(0);}
  lcd.print("Setpoint: ");
  lcd.print(temp_set);            // Display the setpoint temperature for 2 sec
  delay(2000);
  checkTemp(0);
  t.every(60000*CYCLE,checkTemp,(void*)0);
  button1.attachClick(tempPlus);
  button1.attachPress(tempMinus);
}

void loop() {
  // put your main code here, to run repeatedly: 
  button1.tick();
  t.update();
}

void tempPlus(){
      Serial.println("Plus");
      temp_set++;
      if (temp_set > MAX_TEMP) temp_set = TEMP_SET; // Cycle between TEMP_SET and MAX_TEMP
      lcd.clear();
      lcd.print("Setpoint: ");
      lcd.print(temp_set);
      EEPROM.write(0,temp_set);
      delay(1000);
      checkTemp(0);
}

void tempMinus(){
      Serial.println("Minus");
      temp_set--;
      if (temp_set < TEMP_SET) temp_set = MAX_TEMP; // Cycle between TEMP_SET and MAX_TEMP
      lcd.clear();
      lcd.print("Setpoint: ");
      lcd.print(temp_set);
      EEPROM.write(0,temp_set);
      delay(2000);
      checkTemp(0);  
}

void checkTemp(void* context)
{
  int chk = DHT11.read(DHT11PIN);
  // Serial.print("Read sensor: ");
  /* switch (chk)
  {
    case DHTLIB_OK: 
               // Serial.println("OK"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
               // Serial.println("Checksum error"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
               // Serial.println("Time out error"); 
                break;
    default: 
                lcd.println("Unknown error"); 
                break;
  }*/
  lcd.setCursor(0, 0);
  Serial.println(DHT11.humidity); 
  lcd.print("Humidity: ");
  lcd.print((float)DHT11.humidity, 2);
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print((float)DHT11.temperature, 2);
  Serial.println(DHT11.temperature); 
  if(DHT11.humidity < HUM_SET2){ 
    digitalWrite(RELAY1, HIGH);
    Serial.println("H1");
  }
  if (DHT11.humidity > HUM_SET) {
    digitalWrite(RELAY1,LOW);
    Serial.println("H0");
  }
  if(DHT11.temperature < temp_set){ 
    digitalWrite(RELAY2, HIGH);
    Serial.println("T1");
  }
  if (DHT11.temperature > temp_set){
    digitalWrite(RELAY2,LOW);
    Serial.println("T0");
  }
}

 

 

Step 4: 조립

 

 

전체 회로도, LCD, 릴레이, 전원 어탭터, 확장코드를 내부까지 정확하게 맞추려면 약간은 어렵다. 하지만 위의 사진을 보면서 작업하면 내부가 어떻게 구성되어 있는지 알 수 있을 것이다.

 또한 확장 전선에 굉장히 많이 의지했으므로 정석은 존재하지 않는다. 스스로가 편한 방식으로 작업하자.

 

 

Step 5: 최종 결과물

 

 

 특징은

1. 2개의 릴레이 보드로 컨트롤한다. 1개는 방의 히터를 조절하고, 1개는 가습기를 조절한다.

2. 온도와 습도를 10분마다 확인한다. 이것은 코드로 설정한다.

3. 알고리즘이 매우 쉽다. 현재 온도가 설정한 온도보다 1도 높아지면 히터를 끈다. 설정한 온도보다 아래로 떨어지면 히터를 켠다. 모든 난방시스템은 이와 유사하다.

4. 습도가 40%이하로 떨어지면 가습기 스위치를 켜고, 60%이상으로 올라가면 스위치를 끈다.

5. EEPROM을 사용하여 작동 시간 설정을 가능하게 한다.

6. 버튼을 사용해 시간을 설정한다. 1번 누르면 설정 온도를 1도 올리고, 길게 누르고 있으면 설정 온도를 1도 낮춘다. 설정 온도는 25 ~ 30도 안에서만 움직이게 한다.

 

 

Step 6: 기능의 확장

 

외부로부터 아래의 핀에 접속이 가능하다.

1. RX 와 TX 핀

2. Reset 핀

3. 13번 핀

4. 2세트의 +5 와 그라운드핀

 DHT11을 교체하고 재 프로그램해서 스마트 파워 스트립으로 사용할 수 있다. 아래와 같은 사용법을 떠올려 봤다.

1. DHT11을 토양습도센서로 교체한다. 스위치를 사용하여 화분이 마르면 펌프로 물을 공급해 주는 방식으로 사용할 수 있다.

2. DHT11을 LM35 혹은 PT100으로 교체해서 수비드 요리법을 위한 조리도구를 만들 수도 있다.

3. 블루투스 HC-05 모듈을 RX와 TX에 연결한다. 그러면 블루투스로 파워 스트립이 제어 가능해저서 핸드폰으로도 온도를 조절할 수 있다.

4. DHT11을 PIR센서로 교체하고 히터를 램프로 바꾼다. 그러면 움직임으로 컨트롤 가능한 램프가 된다.

 여러 가지 의견은 언제나 환영한다. 많은 의견을 남겨주시면 참고하도록 하겠다.

 

 

Step 7: 참고 링크

 

1. 오리지널 블로그: http://dushyant.ahuja.ws/2013/11/standalone-temperature-and-humidity-control/

2. 프로젝트 깃허브: https://github.com/dushyantahuja/Smart-Power-Strip

 

 자세한 조립방법

1. 독립 아두이노: http://dushyant.ahuja.ws/2013/10/standalone-arduino/

2. LCD 조립: https://learn.adafruit.com/character-lcds/wiring-a-character-lcd

 

이 코드는 아래의 라이브러리를 사용한다.(이 라이브러리를 만들어준 모든 분들에게 감사한다)

1. OneButton: http://www.mathertel.de/Arduino/OneButtonLibrary.a...

2. DHT11: http://playground.arduino.cc/main/DHT11Lib

3. 타이머: https://github.com/JChristensen/Timer

4. EEPROM & 액체크리스탈: 둘 다 아두이노 IDE

수박쨈

arduino, 아두이노, Instructables, Heating, 난방 시스템,