유튜브 : https://youtu.be/8Fqp41gmimY

안녕하세요 지난 시간까지 아두이노의 기초를

 

배웠다면, 이번 시간 부터는 난이도가 

 

조금 있는 중급 레벨의 공부를 하겠습니다.

 

유튜브에 자세한 설명도 참고해서

 

공부해주세요~!


준비물

 

아두이노 보드, cds센서(조도센서),

저항 300옴, 케이블, 빵판, led


네이버쇼핑에서 관련 센서

 

한번 보겠습니다. 광고는 아니고

 

검색만 해놓은거에요!

 

https://zrr.kr/9sIl

 

광센서만 있는 것이 아니고

 

모듈로 파는 것들을 사용하겠습니다

 

모듈이라고 해도 350원부터 팔고 있네요

 

이렇게 모듈로 파는 것을 추천드립니다.

위 사진처럼 모듈로 파는 것을 사주세요!

 

바로 회로 연결 보시겠습니다.

센서 A0 - 아두이노 A0

 

GND - GND

 

VCC - 5V

 

연결은 간단합니다. 

 

아두이노 보드 A0에서 값을 읽어서

 

시리얼 모니터로 출력하는 코드 보겠습니다.

void setup() {
  Serial.begin(9600);      
}

void loop() {
  Serial.println(analogRead(A0));
  delay(300);
}

작동 영상입니다. 

밑에 조도 센서에서 읽은 값이 올라오는데

 

센서를 주먹으로 쥐어서 어두워지면 센서의 값이 커집니다.

 

반대로

 

센서를 빛을 향하게 해서 밝아지면 센서의 값이 작아집니다.

 

센서로 값을 읽어서 어두우면 밝게 불을 켜는

 

예제를 보겠습니다. 이번엔 그냥 불을 켜는게

 

아니라 어두우면 어두운 만큼 더 밝게

 

덜 어두우면 불을 조금만 켜는 미션을

 

해보려고 합니다.

 

작동 영상부터 보실까요?

센서를 손으로 막으면 더 밝게 켜지는

 

것이 보이시나요?? 

 

회로도 보겠습니다.

조도센서는 그대로이고

 

6번핀에 300옴 저항과 led를 연결합니다.

 

코드 바로 보겠습니다.

int light, power;

void setup() {
  Serial.begin(9600);      
}

void loop() {
  light = analogRead(A0);
  power = map(light,50,1000,0,255);
  analogWrite(6,power);
  Serial.println(power);
}

첫줄부터 보자면

 

light에는 조도센서에서 읽은 값을 넣습니다.

power = map(light,50,1000,0,255);

power에서 map이라는 새로운 함수가 나왔는데요

 

지금 저는 조도센서의 값을 읽으면

 

밝을 때는

어두울 때는

이렇게 값의 분포를 보입니다. 정리하면

 

저희가 조도센서에서 읽어온 light는 대략

 

70 ~ 989 사이에 있습니다.

 

map이 어떤 일을 하는지 감이 오시나요?

power = map(light,50,1000,0,255);

light라는 값은 대충 50~1000사이에 존재하는데

(map함수의 2, 3번째 인자)

 

그 값이 0~255범위에서는 어떤 값에 대응될까요?

(map함수의 4, 5번째 인자)

 

그 값을 구해주는 함수 입니다.

power= round(255*(light-50)/950);

원래는 위처럼 비례식으로 구해야 하는데

 

이걸 쉽게 구해주는 함수입니다.

 

편하긴 한데 정교한 작업에서는

 

사용하지 않는 것이 좋습니다.

 

아두이노 홈페이지에 따르면

 

반올림하지 않고 소수부분을 버리는

 

연산을 합니다. round를 쓰면

 

반올림을 하는데 map은 버려버리니

 

1정도의 차이가 발생할 수 있습니다.

 

지금은 밝기 조절 용도이니 map을 써도

 

무방하겠습니다.

 

그럼 왜 0~255사이의 범위로 바꾼 것일까요?

int light, power;

void setup() {
  Serial.begin(9600);      
}

void loop() {
  light = analogRead(A0);
  power = map(light,50,1000,0,255);
  analogWrite(6,power);
  Serial.println(light);
  delay(500);
}

이어서 나오는 analogWrite는 무엇일까요?

 

다음 글에 이어서 보겠습니다.

+ Recent posts