정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

조도센서로 네오픽셀led가 켜지고 습도로 색이 바뀌는 스마트 led를 만들어보고 싶습니다
우경국 | 2016-05-01

조도센서로 네오픽셀led가 켜지고 습도로 색이 바뀌는 스마트 led를 만들어보고 싶습니다

 

찾아보니 카카오팹에 이미 비슷한 코딩이 있었습니다. 

 

그런데 찾아본것은 전동기를 쓰고 블루투스를 써서 저에겐 필요없는 블루투스와 모터쉴드 코딩이 되어 있습니다.

 

모터쉴드를 쓰지않게 전동기 부분과 블루투스 부분을 제외하고 오토모드로만 되게 코드좀 봐주실분 계실까요??

 

부탁드립니다

 

#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);
  }
}

프로필사진

Klant 2016-05-02 10:25:22

안녕하세요! 우경국님!

올려주신 소스는 Sabo님께서 만든 Light Application의 소스코드네요. 

해당 코드에 대한 이해가 없이 무작정 코드를 수정하는 것은 크게 의미가 없을 것 같습니다. 

현재 진행하시고자 하는 프로젝트에는 크게 neopixel LED, 조도 센서, 온 습도 센서가 사용될 것으로 판단됩니다. 

각 소자에 대한 튜토리얼 링크를 남겨드리겠습니다. 각 센서 별로 어떻게 소스 코딩이 이뤄지는지 이해하신다면, 

3가지를 조합하여 소스 코드를 짜는 것은 오래 걸리지 않을 것이라고 판단됩니다. 

 

- neopixel 사용하기 : http://kocoafab.cc/tutorial/view/228

- 조도 센서 사용하기 : http://kocoafab.cc/tutorial/view/59

- 온 습도 센서 사용하기 : http://kocoafab.cc/tutorial/view/379

 

진행하시면서 잘 안되는 부분은 댓글로 남겨주세요! 

프로필사진

우경국 2016-05-10 21:43:07

올려주신 튜토리얼을 다 보았습니다.

 

감사합니다. 궁금한 점이 있어서 글 남기게 되었습니다.

 

조도센서를 사용하여 led를 키는 것은 성공하였는데 neopixel을 사용하면 켜지지 않습니다. 

 

#define POT_PIN A0 
#define LED_PIN 13 

void setup()
{
  pinMode(LED_PIN, OUTPUT); 
}
void loop()
{
  int val = 0;
  val = analogRead(POT_PIN); 

 
  if(val < 800) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
  delay(500);
}

위는 제가 해본 조도센서로 led를 키는것인데 led를 neopixel로 켜려면 어떻게 코드를 수정해야 할까요??

이전글   |    아두이노 자바(소켓,시리얼) 안드로이드 작동문제... 2016-05-01
다음글   |    오렌지 보드 BLE 관련 문의 2016-05-02