조도센서 제어(아두이노)

in #kr-newbie6 years ago (edited)

조도센서 제어(아두이노)



오늘은 간단히 조도센서를 제어하는 실험을 해보겠습니다. 조도 센서는 빛의 밝기에 따라서 전류값이 달라지는데 이 전류값을 아날로그핀에서 입력으로 받아서 빛에 의해서 어떤 행동을 하기 위한 곳에서 사용할 수 있는 재밌는 센서입니다. 쉽게 생각하시면 가로등을 예로 들 수 있겠죠. 밤이되면 조도센서를 이용해서 가로등을 자동으로 켜지게 할 수 있겠죠.

1. 회로도 구성


  • 준비물 : green led 1개, 조도센서 1개, 저항(220옴) 1개, 저항(10k옴) 1개, 아두이노우노, 뻥판
  • 내용 : 특정 조도센서값을 기준으로 green led에 불이 들어오게 한다.

A모델(-)방향 입력값B모델(+) 방향 입력값
어둠(0) ~ 밝음(255)
어둠(255) ~ 밝음(0)

2. 코딩


  • 사용함수 : Serial.begin( ), Serial.print( ), Serial.println( ), map( ), analogRead( ), pinMode( ), digitalWrite( )
  • 내용 : A모델을 기반으로 조도값이 100이하면 불이 들어오게 코딩을 해보자

  • 시리얼모니터 출력 :
    Serial.begin(9600)으로 시리얼통신을 사용하겠다고 선언
    Serial.print(출력값)은 출력값을 아두이노 IDE 시리얼모니터에 값을 출력하고 새로운 라인으로 안넘어감
    Serial.println(출력값)은 출력값을 출력하고 새로운 라인으로 넘어감

자세히 알고싶다면 => 출처 : https://www.arduino.cc/en/Serial/Println

  • green led 제어 :
    pinMode(핀, 모드)으로 전류를 출력할 핀 13번을 출력모드(OUTPUT) 사용하겠다고 선언
    digitalWrite(핀, 상태)은 13번핀을 HIGH(5V) or LOW(0V)로 전류를 출력할지 말지를 결정

  • 조도센서 입력 :
    map(입력값,입력최소값,입력최대값,변환최소값,변환최대값)으로 입력(0~1023)값을 자동으로 매핑시켜 (0~255)으로 변환시킨다. 즉, 알아서 크기에 맞게 값을 잡아준다고 생각하시면 됨.
    analogRead(아날로그입력핀) 전류의 값을 읽어옴

설계

  1. 조도센서를 읽어옴
    int m_cds = map(analogRead(cdspin),0,1023,0,255);
  2. 조도센서의 값이 100이하면 led가 켜지게 한다.
    if(m_cds){
    digitalWrite(greenpin, HIGH);
    }
    else {
    digitalWrite(greenpin, LOW);
    }

A모델 코딩을 실제 하면은

int greenpin = 13;
int cdspin = A0;

void setup()
{
  Serial.begin(9600);
  pinMode(greenpin, OUTPUT);
}

void loop()
{
  int m_cds = map(analogRead(cdspin),0,1023,0,255);
  
  Serial.print("CDS =  ");
  Serial.println(m_cds);
  
  if(m_cds<100) { 
     digitalWrite(greenpin, HIGH);  
  }
  else {
      digitalWrite(greenpin, LOW);  
  }
  
}

0~1023으로 잡고 시작하고 싶다면 map()함수는 필요 없겠죠. 입력값을 자신이 원하는 값(0~255)의 범위로 추가로 만들어 보았어요.

그냥 아날로핀값을 읽어서 그 값을 if문으로 해서 led에 불이 들어오게 할지 말지만 정하면 되니깐 위 코딩에서 절반이상 코딩량을 줄어 듭니다. 정확히 실험을 하기 위해서 그 값을 시리얼모니터에 줄력하기 위해 코딩이 늘어나고 또 입력된 값을 특정값의 범위로 맞추고 싶을때 map()함수가 추가되었을뿐 제어는 간단합니다.

if(analogRead(cdspin) < 300) digitalWrite(greenpin, HIGH);  

else  digitalWrite(greenpin, LOW);  

딱 두문장으로 끝낼 수 있죠. 원리는 이 두문장이고 약간 조미료를 추가한것이 A모델 코딩입니다. 원리만 이해하셔도 돼요.

결과


마무리


오늘은 간단한 실험을 해 보았습니다. 조도센서는 빛에 따라서 값의 변화가 일어납니다. 실제로 전류의 변화가 일어납니다. 이 전류값은 아날로핀으로 0~1023사이의 값으로 읽어오게 됩니다. 이 값을 기반으로 아두이노에서 제어를 하게 됩니다. 쉽게 떠오르는 것은 가로등이 있겠죠.

여러분들은 조도센서로 뭘 하고 싶으신가요. 예술가를 예를 들어볼께요. 어떤 작품을 만들었는데 그 작품에 빛에 반응한다고 생각해보세요. 그리고 RGB led를 작품에 부착한다면 조도센서값들에 따라서 작품은 다체로운 색상들을 만들어 낼 수 있다면 관람객과 소통하는 작품을 구현할 수 있겠죠.

또는 조도센서를 언제쯤 어두워지고 언제쯤 밝아지는지 데이터를 매일 수집하면 빅데이터로 활용도 가능해지겠죠.

한번 조도센서를 사용한다면 어디에다 사용할지 상상의 나래를 펼처보세요.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

오잉! 일찍 찾아오셨네요!
방문해주셔서 감사합니다.

스크래치/아두이노에 관심이 많아요^^ 팔로우하고 갈게요 좋은 정보 감사합니다 :)

스크래치로 아두이노를 제어할려고 하면 좀 답답한 부분이 제 경우 있더군요.
블록을 사용하다보니 표현을 할려고 하면 뭔가 좀 제한된 느낌이랄까?
순수 코딩을 하는게 자유롭게 표현이 되는것 같아요

맞아요! 아이들 가르칠때 쓸려고 스크래치로 활용했었는데 그런 단점들이 좀 있죠 ^^ ㅎㅎ 전 너무 초보라서요ㅠㅠㅠ 앞으로 코딩맨님꺼 정독해봐야겠어요 ^^ ㅎㅎ

이야 멋집니다..... 저도 저런걸로ㅜ한번 아이들 가르칠때 예시로 들어봐야겟어요

아이들이면 스크래치+아두이노 제어가 더 쉬울꺼에요.
블록 공부하면서 블록으로 아두이노를 제어하는게 문법코딩은 필요없거든요.

또다시 찾아온 불금!! 힘내세요!!곧 주말이에요!

즐거운 주말 되세요! ^^

갑자기 조물딱 조물딱 납땜 하던 청소년기가 생각나네요~
이런 저런 용도로 이것도 해보고 저것도 해보고~

이제는 시대가 바뀌었으니깐 아두이노로 조물딱 조물딱 하는 시대인가봐요~ ㅎㅎ

그쵸! 예전해 배울당시에 8051 보드인가 거기서 어셈블리어로 코딩하고 led 하나 켜기가 진짜 힘들었던 기억이 나네요.
지금은 코딩을 몰라도 쉽게 다룰 수 있다는 것이 아두이노 인것 같아요.
오픈소스도 차고 넘치는 세상이라 참 부럽더군요.

거기다가 구글을 비롯한 각종 검색엔진과 본인의 노력만 한다면 접할 수 있는 다양한 레퍼런스들도 많아서 참 좋은 것 같아요. ㅎㅎㅎ

Congratulations @codingman! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

@resteemator is a new bot casting votes for its followers. Follow @resteemator and vote this comment to increase your chance to be voted in the future!

Thank you! ^^

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.032
BTC 57453.27
ETH 2928.75
USDT 1.00
SBD 3.67