조도 센서와 LED를 사용해 가로등 만들기

yun·2023년 9월 15일

아두이노

목록 보기
1/4

아두이노?

  • 아두이노는 오픈 소스를 기반으로 한 단일 보드 마이크로컨트롤러로 완성된 보드와 관련 개발 도구 및 환경을 말한다.

아두이노 IDE

  • 자바와 C를 기반으로 개발되는 크로스 플랫폼 응용 소프트웨어
  • 아두이노 동작을 위해 C++ 언어 기반을 사용
  • 컴파일러는 avr-gcc를 사용하므로, avr-gcc가 제공하는 많은 C언어의 표준라이브러리 함수를 사용할 수 있다

가로등을 만들어 보자

1. 변수 초기화

const int LED = 9;
int min = 255;
int max = 0;

2. setup 작성

  • 아두이노의 내장함수
  • 소스코드를 보드에 업로드 시 최초 1회 실행된다
void setup() {
  // 아두이노 보드와 소통하기 위한 모니터를 초당 비트수 9600 속도로 시작
  Serial.begin(9600);
  pinMode(LED, OUTPUT);  // 9번 핀이 LED 연결됨
}

3. loop 작성

  • 아두이노의 내장함수
  • setup 후 지속, 반복해서 실행될 함수
void loop() {
  // A0 아날로그 IO와 연결한 조도센서에서 현재 밝기를 가져오자
  int light = analogRead(A0);
  
  Serial.println(light); // Serial Monitor로 조도센서 값 확인
  delay(200); // 아날로그 센서 오감지를 최소화하고자 delay 추가

  // 전처리: 센서가 감지한 값이 튀는 경우도 있으므로,
  // 어떤 값이 감지되더라도 100과 500 사이가 되도록 한다
  light = getProcessedLight(light, 100, 500);

  // 100과 500 사이의 값인 light를 0과 255 사이의 값으로 변형
  light = map(light, 100, 500, 0, 255);

  // 현재 밝기가 200보다 낮다면(손으로 가려도 빛이 많이 감지됨)
  if (light < 200) {
    analogWrite(LED, 255); // 조명을 켜준다
  } else { // 밝기가 200 이하라면
    analogWrite(LED, 0); // 조명을 꺼준다
  }
}
  • loop 함수 안에서 delay를 주면 모든 loop에서 delay를 주므로 지양해야 하나, 아날로그 센서 감지 시 노이즈를 줄이기 위해 사용
  • analogRead는 0부터 1023 사이의 값(uno를 사용하여 10비트 값), analogWrite는 0부터 255 사이의 값


4. 필요한 함수 만들어서 사용하기

  • 센서가 감지한 값에 이상치가 있다면 min과 max 사이 값으로 변형
int getProcessedLight(int val, int min, int max){
  int result;
  if (val > max) {
    result = max;
  } else if (val < min) {
    result = min;
  } else {
    result = val;
  }

  return result;
}

0개의 댓글