티스토리 뷰

Arduino

[Arduino] 빛센서를 통한 LED 제어

생각많은 소심남 2012. 9. 9. 15:44

사실 이전 포스트에서도 빛센서를 통해서 LED도 제어해봤고, LCD에 글자도 출력하게 했습니다. 그럼 이걸 결합시키면 어떨까요? 조도센서의 값을 받아서 LCD에 그 수치를 나타내주고 그 값을 LED에 보내줘서 밝기를 실시간으로 조절하는 게 가능하겠지요. 빛의 밝기를 부드럽게 조절하기 위해서는 당연히 해당 입력을 analog로 받으면 되겠고 그 값을 lcd.print를 통해서 출력시키면 될겁니다. 저는 우선 기본 환경이 이렇게 되어 있었습니다.



아 참 이걸 반복적으로 할려고 하니까 배선을 하는데도 시간이 많이 걸리는 것 같군요. 물론 조금 익숙해주면 만드는데도 시간이 줄어들겠지만 이걸 하기 귀찮으신 분이라면 그냥 lcd shield를 하나 사셔도 좋을 것 같습니다. ebay나 aliexpress에선 하나에 한 8천원정도 하는 것 같더군요. 아무튼 위와 같은 배선은 이전에 많이 봤으니까 fritzing으로 온도센서에 관한 부분만 보겠습니다.



간단하게 말로 설명하자면 LED는 9번 디지털 핀으로 입력을 받습니다. 그리고 포토셀은 KVL을 활용해서 그 출력값을 analog 0번 핀이 받도록 설정했습니다. 그런데 한가지 고민해볼 일이 있습니다. 과연 포토셀을 통해서 받은 결과 값과 LED의 최대 최소값이 정확히 매핑이 될까요? 그 부분은 코드내에서 map이란 함수를 사용하면 간단하게 정의가 됩니다. 우선 코드를 봅시다.


우선 여기까지는 똑같습니다. 바뀐게 있다면 ledPin을 정의해주는 부분이겠지요. 물론 그냥 숫자로 적어줘도 됩니다만 나중에 장치를 여러개 달 때 헷갈리는 현상을 막기 위해서는 이렇게 해주는게 좋겠지요. 이제 본연의 역할을 하는 부분이 바로 loop()부분입니다.

맨처음 해줄 것은 포토셀로부터 받은 값을 lcd에 뿌려주는 것입니다. 이부분은 간단합니다. 그냥 포토셀의 출력값을 analog값으로 받은 후에 lcd.print를 통해서 작성해주면 됩니다.



자 이제 기존의 포토셀출력값을 led의 입력값으로 주는 것이 필요한데 앞에서 소개해드린 것처럼 map()이라는 함수를 사용하면 구간의 길이에 상관없이 자동으로 1:1 매핑을 시켜줍니다. 그런데 우리는 아무래도 어두울때 led가 켜지는 동작을 원할 겁니다. 그러기 위해서는 구간의 시작과 끝을 서로 반대로 매핑을 시켜주면 되겠습니다. 그리고 그 값을 lcd에 출력하면 될겁니다.



map에서 쓰임은 어디서 그 값을 받을 건지를 결정한 후에 그때의 수치를 intensity의 범위안에 집어넣겠다는 겁니다. 그러니 결론적으로 brightness는 0~1023의 값으로 받을 것이고 그걸 led는 0~255 사이의 밝기로 표현해줄겁니다. 그리고 그 값을 ledPin에 넣어주면 되겠습니다. 

 그런데 사실 이게 다가 아닙니다. 여기까지만 채운 후에 작성하면 lcd에서 어떤 결과가 나타날지를 확인해보세요. 아마 글자가 제대로 출력되지 않을 겁니다. 그 이유는 바로 잔상효과입니다. 

 사람의 눈도 그렇고 lcd내의 문자 갱신시에도 약간의 delay가 존재합니다. 물론 포토셀을 통해서 받는 값은 아날로그이기 때문에 수시로 수치가 바뀔 것이고 매우 불안정할 겁니다. 그런데 그걸 일일히 표현해주면 아마 lcd에는 정확한 값이 출력되지 않고 값이 무수히 빠르게 변화할 겁니다. 아마 사람이 보기에 조금 부드럽게 보이기 위해서는 그래서 일정 타이밍간의 delay가 필요합니다. 물론 당연히 그 delay 안에서 받은 입력값에 대해서는 무시가 될겁니다. 그래서 최종적인 코드는 다음과 같습니다.


한번 결과를 보면 lcd 상에서의 수치가 매우 부드럽게 변함과 동시에 led의 밝기도 실시간으로 변하는 것을 확인하실 수 있을겁니다.



무엇보다도 아두이노가 좋은 건 기존의 부품들과 계속해서 연결해나갈 수 있다는 겁니다. 지금 위에서는 lcd와 led를 붙인 것이고, 물론 다른 소자도 붙여서 그 값을 출력시킬 수 있을겁니다. 그대신 그때는 주변장치에서 소모되는 전력이나 흐르는 전류를 조금 고려해줘야 하겠지요. 간단한 테스트를 해봤습니다.



댓글