티스토리 뷰

DIY/아두이노

Delay()와 센서

멍구쫑쫑 2017. 2. 3. 22:02

침대 센서 무드등

며칠 전에 아두이노와 센서를 조합해서 원하는 침대 무드등을 만들었습니다. 시나리오대로 정상작동했지만, 센서오작동인지 아무 움직임이 없는 상태에서도 작동되었습니다. 조건문이 다르지도 않고, 기계적인 결함이 문제라 생각이 되었지만 제공해주는 데이터가지곤 찾을 수 없었습니다.

delay()와 millis()

delay() 함수는 일정시간동안 멈추었다가 다시 실행하는 함수입니다. 다만, delay() 함수가 호출이 되면 아두이노 전체가 멈춘단 글을 보았습니다. 그에 따라 센서들이 오작동할 수 있기 때문에 delay() 함수는 정확하게 알고 써야 한다고 합니다.
delay() 함수대신 millis() 함수를 이용해서 시간 지연을 시켜야 됩니다.
millis() 함수는 아두이노가 전원이 인가되었을때부터 함수가 호출된 사이의 millisecond(ms)를 반환시켜주는 내부함수입니다.
return 자료형은 unsigned long으로써 42억정도 기록됩니다. 약 49일정도 되고 49일이후에는 다시 0부터 시작이 됩니다.

수정된 소스

delay() 함수들은 모두 지운 정상작동되는 소스입니다.

#include <Adafruit_NeoPixel.h>
#define NUMPIXELS     55 // 제어하고 싶은 LED 개수
#define PIN_CSD      A3 //밝기 센서
#define PIN_MAN      7  // 인체감지센서
#define PIN_LED      6  //LED 표시

int CSD_LIMIT = 1000;       // 밝기 센서제한 값

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN_LED, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(100);
  Serial.begin(9600);
  pinMode(PIN_CSD, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_MAN, INPUT);
}

static unsigned long last = 0;

void loop() {
  if ( millis() - last > 100 ) {  // 0.1초마다 실행
    last = millis();
    if (sensor_csd()) // 밝기센서 체크
      if (sensor_man()) // 인체센서 체크
        fade_led( 255, 127, 0);   // LED RGB값 입력
  }
}

// 밝기 센서
bool sensor_csd()
{
  int val = analogRead(PIN_CSD);
  Serial.print("SENSOR_CSD : ");
  Serial.println(val);
  return val > CSD_LIMIT;
}

// 인체센서
bool sensor_man()
{
  int val = digitalRead(PIN_MAN);
  Serial.print("SENSOR_MAN : ");
  Serial.println(val);
  return val == HIGH;
}

// LED 페이드인아웃
void fade_led(int target_r, int target_g, int target_b) {
  float x;
  int r, g, b;
  bool isStopped = false;
  for (float i = 0; i <= 3.14; i = i + 0.005) {
    x = sin(i);

    r = target_r * x;
    g = target_g * x;
    b = target_b * x;

    for (int j = 0; j < NUMPIXELS; j++) {
      pixels.setPixelColor(j, r, g, b);
    }
    pixels.show();
    if (i >= 1.82 && isStopped == false) {
      isStopped = true;
      while (sensor_man())
      {
      }
    }
  }
}


관련글
- 침대 무드등 만들기

'DIY > 아두이노' 카테고리의 다른 글

침대 무드등 만들기  (1) 2017.01.30
댓글