아두이노 온도센서 led - adu-ino ondosenseo led

위의 코딩에서는 cds 센서가 측정한 범위가 200 ~ 720의 값이 cds 변수에 저장되어 있으며 이를 0 ~ 255 값으로 변환하여 반환(brightness 변수에 저장) 하는 동작을 합니다.

cds 가 200 이면 0이 반환되고 720이면 255가 반환되며 중간 값이면 비율로 저장이 됩니다.

map 함수 알아보기

센서 값을 측정하면서 자주 사용하는 함수입니다.

문법

map(value, fromLow, fromHigh, toLow, toHigh)

매개변수

value: 변환할 수

fromLow: 현재 범위 값의 하한

fromHigh: 현재 범위 값의 상한

toLow: 목표 범위 값의 하한

toHigh: 목표 범위 값의 상한

반환

변환된 값

map(long x, long in_min, long in_max, long out_min, long out_max) {

return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;

}

계산식을 확인해 봅시다.

이전 실험에서 너무 밝거나 어두워지면 예상과 다른 동작을 하게 되는데 이는

x 값이 최소값 보다 작거나 최댓값보다 크면 다른 결과가 리턴되기 때문입니다.

constrain 함수 알아보기

입력값의 최대 최솟값 제한을 합니다.

위의 실습에서 cds 센서 값이 코딩한 범위를 넘어가게 측정되면 map 함수에서 엉뚱한 결과가 리턴됩니다.

map 함수에서 범위를 더 넓게 해도 되겠지만 만일 센서 범위를 720에서 900으로 변경했다고 하면

평상시 밝은 지역에서는 동작을 잘 하겠지만 다른 지역 또는 장소에서는 최대 밝기가 720이면 led는 최대

밝기로 켜지는 게 어렵습니다. 일정 값 이상이면 최댓값을 가지도록 constrain 함수를 사용해 봅시다.

constrain(x, a, b)

x : 제한할 데이터

a : 범위의 하단 값

z : 범위의 상단 값

cds = analogRead(A0);

다음과 같이 수정하여 동작해 봅시다.

cds = constrain(analogRead(A0), 200, 720);

200 보다 작으면 200으로 720보다 크면 720으로 반환하여 cds 변수에 저장하게 된다.

조명의 밝기를 0부터 255까지 조절하였는데 이를 가로등에 적용 가능하도록 수정해 봅시다.

실제 가로등이 약간 흐려진다고 켜지는 게 아니기 때문에 조금 어두워진다고 켜지는 게 아닌

더 많이 어두워지면 켜지게 수정해 보세요.

밝기도 흐리게 켜진 것은 실제로 사용하기에는 애매하니 150부터 켜지도록 수정해 봅시다.

온도센서 연결하기

우선 온도센서는 주의해야할점이 있다. VCC와 그라운드를 반대로 연결시켜주면 쇼트가 나서 타버릴수 있으니 항상 극성을 잘 확인시켜주어야한다. 오른쪽 사진을 보면 온도센서(LM35)왼쪽핀이 5V 가운데가 OUTPUT, 오른쪽이 그라운드가 된다. 이핀을 각각 5V, 아날로그0번, GND에 연결시켜주도록 한다.

float temp;

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

void loop() {
  int val = analogRead(A0);
  temp = val*0.48828125; //화씨 → 섭씨 변경
  Serial.print("Current Temperature : ");
  Serial.println(temp);
  delay(500);
}

아두이노 코드는 위와같다.

우리가 일반적으로 온도센서로부터 읽어들이는값은 화씨단위이다. 그래서 화씨온도를 섭씨온도로 바꿔줄 필요가 있다.

val이라는 정수형 지역변수를 설정해주어서 섭씨온도로 변경한 값을 temp라는 변수에다가 넣어주면 우리가 섭씨온도로 온도값을 읽어들일수가 있다. (화씨온도가 편하면 그대로 사용해도 무방하다.)

아두이노 온도센서 led - adu-ino ondosenseo led

컴파일을 진행시키고 시리얼모니터를 키게되면, 온도값이 출력되는것을 확인 할 수있다. (Current Temperature : Value)

   예제실습 - RGB LED를 이용해서 온도에따라 색 변화시키기 

온도센서는 여러가지 응용이 가능하다. RGB LED로 온도에따라서 색이 변하는 회로를 구성할 수 있다.

조건은 아래와 같다. 온도가 일정 값까지 올라가게되면 색을 변하게 설정해준다.

 온도가 23이상 25미만이면 파란색불,  25이상 27도 미만이면 녹색불, 27이상이면 빨간색불을 켜도록 한다.
아두이노 온도센서 led - adu-ino ondosenseo led

회로구성은 아까 구성했던 회로에다가 RGB LED를 추가하면된다. RGB LED는 총 4개의 핀으로 구성되어있고 3개의핀은 LED를 구성하는 핀이고, 1개의핀은 그라운드핀이다. R핀은 2번, G핀은 3번, B핀은 4번핀에다가 연결시켜주고, 나머지는 GND에다가 연결시켜주면된다. 

float temp;

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  int val = analogRead(A0);
  temp = val * 0.48828125; //화씨 → 섭씨 변경
  Serial.print("Current Temperature : ");
  Serial.println(temp);
  if (temp >= 23 & temp < 25) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
  }
  else if (temp >= 25 & temp < 27) {
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
  }
  else if {temp >= 27
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
}

코드는 위와같다. 조건식은 온도가 낮아지면 파란색에 가깝게, 온도가 높아질수록 빨간색에 가깝게 if문을 활용해서 코드를 만들도록한다. 우리가 이 코드를 활용하면 전자온도계에 LED를 이용해서 시각적으로 나타낼 수 있다.

아두이노 온도센서 led - adu-ino ondosenseo led

컴파일을 진행시키게 되면 온도가 올라감에따라 파란색 - 녹색 -빨간색 순으로 RGB LED의 색상이 변하는것을 확인할 수 있다. 

   예제실습 - 온도값을 LCD에 나타내기

아두이노 온도센서 led - adu-ino ondosenseo led

우리가 LCD(16x2)센서를 이용해서 전자온도계를 만들 수 있다.  매번 시리얼 모니터로 확인하던것을 LCD에 나타내서 눈으로 보기 쉽게 나타낼 수 있다. 회로구성은 위와같다. 온도센서는 아까와 같이 연결시켜주면 된다. 

int soundSensor = A0; // 사운드 센서 핀 int led[6] = {8, 9, 10, 11, 12, 13}; // LED핀 8~13 int threshold = 500; // 소리 크기 기준 int count = 0; // 박수를 몇 번 쳤는지 카운트 void setup() { Serial.begin(9600); // 시리얼모니터 출력 pinMode(soundSensor, INPUT); // 사운드 센서 입력으로 설정 for(int i=0; i<6; i++) // LED 핀 출력으로 설정 pinMode(led[i], OUTPUT); } void loop() { if( analogRead(soundSensor) >= threshold){ // 감지된 소리의 크기가 500 이상일 때 for(int i=0; i<6; i++){ // 6개의 led 제어 if(i == count) // 카운트 된 박수 개수로 led 제어 digitalWrite(led[i], HIGH); else digitalWrite(led[i], LOW); } count = (count < 6) ? count+1 : 0; // count<6가 참일 때 count + 1, 거짓일때 0 반환 delay(200); // 박수 중복 입력이 안되게 200ms 딜레이 } else // 감지된 소리의 크기가 500 이하일 때 delay(1); }

위 코드는 CDS에서 받아진 값,
즉, 빛의 세기 정도에 따라 LED의 밝기가 변화하는 코드 입니다.
여기에서 새로운 함수가 등장합니다.
map함수와 constrain함수 입니다.

map 함수는
map(sensor name,시작범위,끝범위,변경할 시작범위,변경할 끝범위)로 구성되어 있습니다.
위 코드같은 경우에는 CDS의 값 0 ~ 600을 0 ~ 255로 일정한 비율에 따라 바꾸겠다는 의미가 됩니다.

constrain 함수는
constrain(sensor name,최소값,최대값)으로 구성되어져 있습니다.
위 코드와 같은 경우에는 cds의 값이 0보다 작을경우 0으로, 255보다 클 경우 255로 변경하겠다는 의미 입니다.

예를들어
CDS의 값이 700이 나올경우
700이라는 값은 map 함수에 의해 영향을 받지않는 값입니다 (map 함수의 범위가 0 ~ 600이므로), 하지만 constrain 함수에는 영향을 받습니다
최대값을 255로 잡았으니 255보다 큰 700은 255로 변경되어 CDS값으로 저장됩니다.
마지막으로 analogWrite(LED, 255-cds)에 의해 LED가 255 ~ 0의 밝기로 켜지고 꺼지게 됩니다.