온도센서에 해당하는 글 1

[아두이노] 온도센서(TMP36) 제어

IOT/아두이노|2019. 3. 9. 09:00

[아두이노] 온도센서(TMP36) 제어



오늘은 온도센서(TMP36)를 제어 해보는 시간을 가지도록 합시다. 원래 예전에 공부할때 온도계산에 대한 부분은 다른분의 블로그를 보고 했는데 기억이 안나네요. 암튼 온도 계산식을 제가 만든것도 아니고 기존에 공식이 있는 거라서 제가 참조한 출처는 못찾아서 해당 온도계산식이 나와 있는 블로그를 하나 링크를 걸어 놓았네요.

1. 온도센서(TMP36)



대부분의 측정센서는 Vcc, Gnd로 전원을 공급하고 센서에서 측정한 값은 Vout 출력됩니다. Vout은 온도에 따른 전류를 측정하는 것이죠. 그래서 전류를 계산하는 공식이 필요합니다.

 float V = analogRead(A0)*5.0/1023;
 float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
 float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;

이게 기본베이스 입니다. 제가 만든건 아니고 기본적으로 이 공식으로 섭씨와 화씨를 측정하더군요.
제 블로그에서는 약간 수정하여 map()함수를 응용해서 함수를 따로 만들었습니다. 정수를 실수형으로 변수를 바꾼것 밖에 없지만요,

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}
<

V 계산을 map()함수 로직에다 삽입해서 바로 V값이 나오도록 했죠. 그냥 이렇다는 것이고 위의 공식으로 그냥 하셔도 됩니다.

2. 회로도 구성


  • 준비물 : TMP36 센서, 아두이노우노
  • 내용 : 온도센서에서 읽어들인 값을 아두이노 IDE 시리얼모니터로 출력시키기 위한 회로도 만들자.


선 연결 참 쉽죠. 원래는 LCD16x2로 온도값을 출력할려고 했는데 그러면 TMP36 제어를 어려워 할 것 같아서 최소한 코딩으로 원리만 전달하고자 간단히 표현했네요.

원리를 이해했으면 LCD16x2로 출력해 보세요. 아두이노는 하나의 부품을 배우면 지난 시간에 배운 부품들과 계속 결합해서 응용력을 키워야 실력이 늘어 납니다.

3. 코딩


  • 사용함수 : analogRead(), map(), Serial.begin(9600), Serial.print(), Serial.println()
  • 내용 : 온도계산공식을 이용하여 간단히 아두이노 IDE 시리얼모니터로 현재 온도를 출력하자.

복습

  • analogRead(A0) : A0핀으로 아날로그 값을 읽음
  • map(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : 입력값이 입력범위에 기준에 맞게 출력범위의 해당값을 출력.
  • Serial.begin(9600) : 시리얼 통신 시작
  • Serial.print(출력값) : 출력값을 시리얼 모니터로 출력하는데 새로운 라인으로 안넘어가고 현재라인에 커서가 위치함.
  • Serial.println(출력값) : 출력값을 시리얼 모니터로 출력한 다음 새로운 라인으로 커서가 이동하는데 Enter(\n) 의미로 이해

설계

  1. 온도센서값을 읽어옴
  2. 섭씨와 화씨를 구함
  3. 시리얼모니터로 출력

온도센서는 analogRead(A0)로 읽어온다. 0~1023값을 읽어오는데 V를 구해야한다. 0~5V의 아두이노는 흐른다. 즉, 0~1023의 수치를 0~5V 값으로 출력을 맞춰야 합니다.

가령, map()함수라는 것은 0~100까지의 입력 범위가 있으면 출력을 0~10사이로 맞출때 사용합니다.

입력이 10이면 출력은 1
입력이 20이면 출력은 2

...

입력이 100이면 출력은 10

이렇게 되게죠. map()함수에 대해서 이해 하셨을거라 생각 합니다. 그런데 map()함수는 정수값으로 나오기 때문에 실수값으로 0~5V사이 값이 나오기 때문에 기존의 map()을 그대로 쓰면 안됩니다. 변수를 실수형태로 변경해 줘야 합니다. 실수형으로 변수를 선언해주면 간단히 해결 됩니다.

float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산

V값이 구해지면 섭씨(C)와 화씨(F)를 공식에 대입하면

float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;

이렇게 섭씨(C)와 화씨(F)가 구해지겠죠. Serial.print(), Serial.println()함수로 좀 이쁘게 그 값을 출력하면 됩니다.

코딩을 전체적으로 하면

void setup() {
  Serial.begin(9600); //시리얼통신 시작
}

void loop() {
 
  float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산
 
  //공식
  //float V = analogRead(A0)*5.0/1023;
  float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
  float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;
  
  Serial.print("V : ");
  Serial.println(V);
  Serial.print("C : ");
  Serial.println(C);
  Serial.print("F : ");
  Serial.println(F);
  
  delay(1000);  
}

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}

4. 결과


가상시뮬레이터에서지만 약간은 오차가 발생 하네요. 실제로 하더라도 보정이 좀 필요할 듯 합니다.

마무리


오늘은 온도센서(TMP36)을 이용해서 아두이노에서 간단히 계산하니깐 온도계가 되었네요. 온도를 측정할 수 있다는 것은 많은 것들을 할 수 있게 됩니다.

가령 방마다 온도를 측정한다 그리고 무선통신을 이용해서 그 값을 따로 컴퓨터에 저장시켜서 4계절 집안 온도의 데이터를 수집할 수 있게 되고 그걸 통해서 집안 난방을 관리할 수 있게 되겠죠. 또 다른 예로 식물재배에서도 온도를 측정하면 온도에 맞게 자동으로 제어를 할 수 있겠죠.

온도를 측정한 다는 것은 그 데이터를 수집해서 다른 용도로 사용할 수 도 있고 아니면 현재의 온도에 맞게 특정한 동작을 수행하도록 하는 목적으로 사용할 수 도 있겠죠.

암튼 온도를 측정할 수 있으면 여러분들은 뭘 하고 싶을지 상상의 나래를 펼쳐보세요


댓글()