프로젝트

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

Light Application_Arduino ver [PART 1]

2015-05-14 13:06:41

 

무더운 여름이 다가오고 있습니다~!! 더위도 더위지만 장마역시 여름철에 빼 놓을 수 없는 날씨죠~

이 처럼 4계절 중 날씨변화가 가장 심한 여름철에 하나 쯤 있으면 좋겠다 하는 가전을 만들어보았습니다 ^^

Light Application이라는 프로젝트인데요, 제가 코코아 팹에서 활동하기 전 ATmega128 보드로 만들어 본

경험이 있습니다. 의외로 인기가 있었는지, 기술적인 문의를 하시는 분들이 많았습니다.

그래서, 누구라도 쉽게 만들 수 있도록 아두이노 버전으로 제작을 시도하였습니다.

(Light Application ATmega128 ver) Kocoafab

(Light Application ATmega128 ver) Naver Cafe

 


개요

 

[PART 1] 온도, 습도, 조도 값을 받아 실내 환경 데이터를 수집하고 그에 알맞게 블라인드와 조명을 제어합니다.

 

[PART 2] 자동제어 외 스마트폰을 이용한 수동제어를 이용하여 직접 블라인드와 조명을 제어합니다.

 

<사전 필요지식>

모터 쉴드 사용하기

온습도 센서 사용하기

조도 센서 사용하기

네오 픽셀 Strip LED 사용하기

 

 


동영상 미리보기

 

 


필요한 부품

 

 

NO PART QTY ETC
1 Orange Board 1  
2 Motor Shield 1 Operated in 12V
3 DC Motor 1  
4 Neo Pixel Strip LED 1  
5 Temp/Humid Sensor 1 DHT11
6 Illumination Sensor 1 Photo Resister
7 Bread Board 1  
8 Resister 2 5K

 

Orange Board Motor Shield DC Motor Neo Pixel DHT11 Photo Resister

 


 

하드웨어 메이킹

 

Bread Board Layout

 

 


제작과정

 

아직 본격적인 외형을 제작하지 않고 아두이노 및 센서 등의 배치만 손을 보았습니다.

블라인드 모형과 기구 부착 등은 PART 2에서 소개해 드릴 예정입니다.

 

 

정면 사진입니다. 사실 커튼을 달기전의 외형은 크게 중요하지 않습니다. 혹시라도 하드웨어 연결문제가 생겼을 경우 쉽게 확인하기위해

깔끔하게 정리만 해주시면 됩니다 ^^.

 

 

살짝 옆에서 찍은 사진이에요~ 밑 바닥은 벽에 쉽게 부착하기 쉬운 재질인 우드락을 사용하였습니다. 아두이노, 빵판, 모터 등은

나중에 다시 쉽게 떼어낼 수 있도록 글루건으로 고정하였습니다. 다만 모터의 경우 무게가 상당히 나가기 때문에 바닥에 구멍을 뚫고

케이블 타이로 고정 시킨 모습입니다.

 

 

PART 1에서 다루는 마지막 부품은 Strip Type의 네오 픽셀입니다. 조명은 사용자가 원하는 위치에 달아야 하기 때문에

우드락에 부착하지 않고 선 연결만 해둔 상태입니다. 의외로 조명이 강하니 눈뽕?! 조심하시길 바랍니다 ㅎㅎ;;

 

 


아두이노 소스

#include <DHT11.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>


#define PIN A3
DHT11 dht11(5);
SoftwareSerial BTSerial(2, 4); // RX, TX
Adafruit_NeoPixel strip = Adafruit_NeoPixel(30, PIN, NEO_GRB + NEO_KHZ800);

int BA = 9;
int DA = 12;
int PA = 3;
int light;
int i;
int sum;
int a,b;
int flag = 0;
int address = 0;
int err;
char BT;
float temp, humi;
char data;

void setup()
{
  strip.begin();
  strip.show();
  Serial.begin(115200);
  BTSerial.begin(9600);
  pinMode(PA, OUTPUT);
  pinMode(DA, OUTPUT);
  pinMode(BA, OUTPUT);
  strip.begin();
  strip.show();
  light = analogRead(A4);
  if(light < 500){flag = 0;}
  else if(light >= 500){flag = 1;}

}

void loop()
{
  Serial.println("Mode Select!!");
  if(BTSerial.available())
  {
    char BT;
    BT = BTSerial.read(); 
    Serial.println(BT);
  
    if(BT == '1')
    {
      Serial.println("Auto Mode");
      while(1)
      {      
        data = BTSerial.read();
        Sensing();
        Auto_Mode();
        Led_Control();
        if(BTSerial.available()){data = BTSerial.read();}
        if(data == '2'){
          BT = '2';
          break;
        }
      }
    }
    else if(BT == '2')
    {
      Serial.println("Hand Mode");
      while(1)
      {      
        //Sensing();
        //Led_Control();
        Hand_Mode();
        if(BTSerial.available()){data = BTSerial.read();}
        if(data == '1')
        {
          BT = '1';
          break;
        }
      }      
    }
  }  
}

void Sensing()
{
  // READ DATA
  if((err=dht11.read(humi, temp))==0)
  {
    Serial.print("temperature:");
    Serial.print(temp);
    Serial.print(" humidity:");
    Serial.print(humi);
    Serial.print("");
    Serial.print("  ");
    Serial.print(analogRead(A4));
    Serial.println("  ");
    delay(1000);
  }
}

void Hand_Mode()
{
  data = '0';
  Serial.print(data);
  Serial.print(" ");
  Serial.println(flag);
  delay(50);
  while(!BTSerial.available()){}
  if(BTSerial.available())
  {
    data = BTSerial.read();
    Serial.print(data);
    Serial.print(" ");
    Serial.println(flag);
    
    if(data == 'u'&& flag == 0)
    {
      Cutton_Off();
      flag = 1;
    }
    else if(data == 'd'&& flag == 1)
    {
      Cutton_On();
      flag = 0;
    }
 

  }
}
void Auto_Mode()
{
  light = analogRead(A4);
  //brightness control
  if(light < 500 && flag == 0)
  {
    Cutton_Off();
    flag = 1;
    Serial.println(flag);
  }
  else if(light >= 500 && flag == 1)
  {
    Cutton_On();
    flag = 0;
    Serial.println(flag);
  }
}
 
void Led_Control()
{
  if(humi <= 39)
  {
    i =  analogRead(A4);

    if(temp < 23)
    {
      for(a=0; a<strip.numPixels(); a++) 
      {
      strip.setPixelColor(a,strip.Color(0, 0, i));
      }
      strip.show();
    }
    else if(temp >= 23 && temp < 26)
    {
      for(a=0; a<strip.numPixels(); a++) 
      {
      strip.setPixelColor(a,strip.Color(0, i, 0));
      }
      strip.show();
    }
    else if(temp >= 26)
    {
      for(a=0; a<strip.numPixels(); a++) 
      {
      strip.setPixelColor(a,strip.Color(i, 0, 0));
      }
      strip.show();      
    }
  }
  else if(humi > 39)
  {
    type2();
  }
}

void Cutton_On()
{
  digitalWrite(DA,HIGH);
  digitalWrite(PA,HIGH);
  digitalWrite(BA,LOW);
  delay(10000);
  digitalWrite(BA,HIGH);  
}
void Cutton_Off()
{
  digitalWrite(DA,LOW);
  digitalWrite(PA,HIGH);
  digitalWrite(BA,LOW);
  delay(10000);
  digitalWrite(BA,HIGH);   
}

void type2()
{
  uint16_t i, j;
  for(j=0; j<256; j+=1) 
  {
    for(i=0; i<strip.numPixels(); i++) 
    {
      int sum = i+j;
      map(sum,0,300,120,190);
      strip.setPixelColor(i, Wheel(sum),Wheel(sum),Wheel(sum));
    }
    strip.show();
    delay(10);
  }
}

uint32_t Wheel(byte WheelPos) 
{
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) 
  {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } 
  else if(WheelPos < 170) 
  {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } 
  else 
  {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

 

 

 

소스의 길이도 길이지만.... 네오픽셀의 라이브러리 함수를 사용하는게 상당히 번거롭습니다. 위 함수에서 사용된 값은 일일히 숫자를 바꾸어가며 찾아낸 값입니다 ;;;;;
다른 색상을 사용하고자 하시면 끈기있는 실험을 통해 RGB 조합을 찾아내셔야 합니다 ㅠㅠ
 
모터 동작의 경우 사용하기 쉬운 일반 DC모터를 사용하였는데요~ 커튼이 내려가고 올라가는 동작은 딜레이 함수로 제어를 하셔야 합니다. 물론 커튼의 길이에 따라
모터를 몇 초동안 돌려야 하는지는 직접 해봐야 알겠지요^^
 
소스가 복잡하지만 추가적인 기능을 부가하는데 있어서는 간단한 작업으로 완성할 수 있습니다. void Auto_Mode() 함수 안에 포함시켜주시기만 하면 게임 끝!!
 
 
이번 프로젝트 PART1에서는 간단한 핵심 동작에 대해서만 설명을 드렸는데요~ 다음 시간에는 블라이드에 직접 연결하고 더욱 구체적인 동작을 보여드리는 포스팅으로 
다시 찾아 뵙겠습니다.
 
감사합니다.
 

SaBo

모터쉴드, DC모터, 조도센서, 온습도센서, 블라인드, 커튼