주변밝기를 조도센서를 이용하여 읽고, 읽은 값으로 LED의 밝기를 조절하도록 하려면...

조도센서를 읽는 것은 analogRead(pin) 함수를 사용하고, LED에 표시하는 것은 pwm을 사용하여 analogWrite(pin, value) 함수를 사용하면 됩니다.

앞서 조도센서를 전압 5V쪽에 연결하면 밝을때 analogRead()값이 커진다고 하였으므로, 밝으면 LED도 밝게 표시하도록

조도센서를 5V쪽에 연결하고, GND쪽으로 1KΩ 저항을 연결하였습니다.

 

#define led 5

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  analogWrite(led, sensorValue);
  delay(100);
}

analogRead()를 통해 읽은 sensorValue값을 그대로 analogWrite()의 pwm값으로 사용하였습니다.

밝은 조건일때

※ 사실 sensorValue = 688은 pwm출력으로 사용하면 문제가 됩니다. pwm출력범위는 0~255입니다

 

어두운 조건을 만들기 위해 조도센서를 덮었습니다. sensorValue값이 50이하로 떨어졌습니다.

사진상으로는 잘 나오지 않았지만, 밝기가 감소합니다.

 

좀 더 밝기를 구분해 줄수 있는 방법을 찾아봅니다.

첫번째는 아날로그 입력인 sensorValue 값은 0~1023사이의 범위를 가지는 반면에 pwm출력은 0~255의 범위를 가지기 때문에, sensorValue/4를 하여 pwm출력으로 사용하는 방법입니다.

analogWrite(led, sensorValue/4);

Serial.println(sensorValue/4);

시리얼 모니터 출력도 sensorVlaue/4를 하여 pwm출력값으로 변경하였습니다.

적용결과는

 

이번에는 조도센서를 가린 경우

앞서의 경우보다 값이 1/4만큼 줄었기 때문에 어두운조건에서 LED 밝기가 약해졌음을 확인할 수 있습니다.

다른 방법으로 map()함수를 사용하여 봅니다.

https://www.arduino.cc/reference/en/language/functions/math/map/

 

Arduino Reference

Description Re-maps a number from one range to another. That is, a value of fromLow would get mapped to toLow, a value of fromHigh to toHigh, values in-between to values in-between, etc. Does not constrain values to within the range, because out-of-range v

www.arduino.cc

 

https://blog.naver.com/msyang59/220973634210

 

Map.html

참조 -> 언어 -> 함수 -> 수학 -> map() 함수 관련 설명을 번역하여 첨부에 올렸습니다: 첨부:

blog.naver.com

 

현재 조건에서 조도센서 값이 변하는 범위를 확인합니다.

#define led 5


// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  Serial.print(sensorValue);
  // print out the value you read:
  sensorValue = map(sensorValue, 30,700,0,255);  
  analogWrite(led, sensorValue);
  Serial.println("\t"+String(sensorValue));
  delay(100);
}

sensorValue의 범위는 최소 30 ~ 최대 700으로 하였습니다.

pwm출력의 범위는 그대로 0~255로 하였습니다.

map함수는 30 -> 0, 700->255의 범위를 가지도록 매핑시키는 함수입니다.

앞의 값은 조도센서의 sensorValue값이고 뒤의 값은 map()함수를 실행 후의 sensorValue값을 출력합니다.

이런....어두울때의 sensorValue값이 최소범위 30이하로 내려가 마이너스값이 되었습니다.

이때 LED밝기는 전혀 어둡지 않습니다. 밝을때와 차이가 없습니다.

 

 

최소값의 범위를 다시 20으로 조정하여

sensorValue = map(sensorValue, 20,700,0,255); 

이번에는 최대값이 700을 넘었...

map()함수의 결과도 pwm출력범위 255를 넘어버렸습니다.

밝은조건에서 LED가 어둡네요.

 

 

 

다시 조정합니다.

sensorValue = map(sensorValue, 20,800,0,255); 

 

이번에는 정상적으로 LED의 밝기 구분이 좀 더 확실해졌습니다.

만약 입력값의 최대,최소범위를 좀 더 확실하게 알 수 있다면 출력값의 범위도 좀 더 세밀하게 조정이 가능합니다.

+ Recent posts