아두이노 analogread - adu-ino analogread

지난 강좌에서 조도 센서를 가지고 실습을 진행해 봤었다. 그런데 이번 강좌에서 다시 analogRead() 함수에 대한 실습을 하는 이유는, analogRead() 함수로 읽은 값이 그대로 쓰이지 않는 센서에 대해 설명하기 위해서이다. 

사실 지난 시간에 구한 조도 센서의 값은, 조도 센서에서 나올 수 있는 값의 구간을 1024개로 나눠 그 중에서 어느 구간에 속하는 지를 알아보는 함수였지, 실제로 빛의 밝기를 나타내는 단위인 lux 라던지, lumen 같은 실제 사용되는 값이 아니었다. 

이번 강좌에서 습도 센서를 가지고 실제로 습도 값을 어떻게 구하는지 알아보자.

내가 가진 습도 센서는 아래 사진처럼 생겼고, 모델명은 "HIH-4030"이다. 구매 사이트는 지난 강좌를 참조.

아두이노 analogread - adu-ino analogread

핀에 연결해야 할 핀의 이름이 적혀있다. '5V'는 아두이노 보드의 '5V'에,N'GND'는 아두이노 보드의 'GND'에, 그리고 'OUT' 핀은 'ANALOG IN' 핀들 중 하나에 꽂으면 된다. 난 'A1'에 꽂겠어.

연결도는 다음과 같다. 

아두이노 analogread - adu-ino analogread

5V와 GND가 브레드보드의 윗 라인에 연결되어 나온 것에 주의.

그리고는 "AnalogReadSerial" 예제를 열어보자. 스케치 툴의 '파일→예제→01.Basics→AnalogReadSerial".

 AnalogReadSerial.ino

 void setup() {

   Serial.begin(9600);

 }

 void loop() {

 int sensorValue = analogRead(A1);

 Serial.println(sensorValue);

 delay(100);

 }

예제 소스 중 analogRead() 함수의 핀 번호와 delay() 함수의 시간 값만 변경해준다. 습도 센서의 OUT 핀을 ANALOG IN 핀들 중 다른 핀에 연결했다면 그 핀 번호를 적어주면 된다.

업로드 한 후 실행해보자. 

아두이노 analogread - adu-ino analogread

값이 나온다. 물이 묻은 티슈를 센서 가까이 가져가보니 값이 증가하는 것이 보인다. 

그런데, 위에서도 말했다시피 이 값은 우리가 원하는 습도 값이 아니다. 원래 습도 값이라는 건 0~100% 사이의 값을 말하는 거잖아? 근데 지금은 그냥 0~1024 사이의 값이 나오고 있다구.

이 값을 어떤 기준값과 비교해서 기준값보다 높을 때와 낮을 때의 동작을 원한다면 굳이 습도 단위로 변환해서 사용할 필요는 없다. 하지만 현재 습도 값을 LCD에 표시한다던지, 어딘가로 데이터를 전송한다던지 하려면 우리가 익히 알고 있는 단위로 변환해야 할 필요가 있다. 

변환하려면 변환 식이 필요하지. 변환 식을 구하려면? 두 가지 방법이 있다.

첫 번째 방법은 아주 쉽고, 간단하고, 의외로 정확하니 적극 추천하는 방법이다. 바로 '구글링'.

뭐..? 

아두이노 analogread - adu-ino analogread

구글링. 구글(www.google.co.kr) 페이지를 열고 검색 창에 "HIH-4030 arduino"이라고 검색해보자. 다음과 같은 검색 결과가 나온다.

아두이노 analogread - adu-ino analogread

구글에서 검색된 첫 페이지이다관련 이미지들만 봐도 정보가 꽤 있다는 것을 알 수 있다검색된 페이지들 중 제일 첫 번째 페이지를 클릭해서 들어가보자. “bildr >> Sensign Humidity With The HIH-4030 + Arduino” 페이지. (링크 : 

페이지를 들어가보니 놀랍게도영어다.

..

아두이노 analogread - adu-ino analogread

당황하지 않고 스크롤을 내려보자맨 마지막에 친절하게도 소스 코드가 올려져 있다.

아두이노 analogread - adu-ino analogread

위 쪽에는 연결도도 있다. 음, 얘는 우노(Uno) 쓰네.

끝났다우리는 저기 있는 저 소스를 복사해서 스케치에 붙여넣기만 하면 된다일명 복붙. Ctrl+C, Ctrl+V.

 HIH4030.ino

 //From the bildr article 

 int HIH4030_Pin = A1; //analog pin 1

 void setup(){

   Serial.begin(9600);

 }

 void loop(){

   //To properly caculate relative humidity, we need the temperature.

   float temperature = 25; //replace with a thermometer reading if you have it

   float relativeHumidity  = getHumidity(temperature);

   Serial.println(relativeHumidity);

   delay(1000); //just here to slow it down so you can read it

 }

 float getHumidity(float degreesCelsius){

   //caculate relative humidity

   float supplyVolt = 5.0;

   // read the value from the sensor:

   int HIH4030_Value = analogRead(HIH4030_Pin);

   float voltage = HIH4030_Value/1023. * supplyVolt; // convert to voltage value

   // convert the voltage to a relative humidity

   // - the equation is derived from the HIH-4030/31 datasheet

   // - it is not calibrated to your individual sensor

   //  Table 2 of the sheet shows the may deviate from this line

   float sensorRH = 161.0 * voltage / supplyVolt - 25.8;

   float trueRH = sensorRH / (1.0546 - 0.00216 * degreesCelsius); //temperature adjustment

   return trueRH;

 }

빨갛고 굵게 표시해 둔 핀 번호 부분은 자신의 연결 핀 번호에 맞게 수정. 그리고 업로드해서 시리얼 모니터링 창을 확인하자.

아두이노 analogread - adu-ino analogread

우리가 원하던, 0~100% 사이의 값이 나온다. 첫 번째 방법 끝!

두 번째 방법은 데이터 시트를 참고하여 변환식을 구하는 방법이다데이터 시트는 센서 구매 사이트나 제조사 사이트에서 구하거나역시 구글링을 통해 구할 수 있다.

다음은 HIH-4030의 데이터 시트 중 변환식에 대한 부분이다.

아두이노 analogread - adu-ino analogread

V_out ADC를 통해 디지털 값으로 변환되기 이전의 전압을 말하는 것이므로다음과 같은 식을 통해 계산할 수 있다.

ADC_value = V_out / 5V * 1024

V_out = ADC_value / 1024 * 5V

그럼 구해진 V_out 값을 빨간 네모 안의 두 식에 대입해보자.

V_out = 5V * (0.0062 * sensor_RH + 0.16)

sensor_RH = ((V_out / 5V) – 0.16) / 0.0062

          = (1/0.0062) * (V_out / 5V) – (0.16 / 0.0062)

          = 161.29 * V_out / 5V - 25.8

true_RH = sensor_RH / (1.0546 – 0.00216 * T)

변환 식이 나왔다. 위에서 구글링으로 찾은 소스 코드와 비교해보자.

 float supplyVolt = 5.0;

 int HIH4030_Value = analogRead(HIH4030_Pin);    

 float voltage = HIH4030_Value/1023. * supplyVolt;   

        // V_out = ADC_value / 1024 * 5V

 float sensorRH = 161.0 * voltage / supplyVolt - 25.8;

         // sensor_RH = 161.29 * V_out / 5V - 25.8

 float trueRH = sensorRH / (1.0546 - 0.00216 * degreesCelsius); 

         // sensor_RH / (1.0546 - 0.00216 * T)

같은 것이 보이는가?

첫 번째 방법보다 어렵긴 하지만 데이터 시트를 참고하는 것이 가장 정확한 변환식을 얻을 수 있는 방법이며, 자신의 작품에 대해 심도 깊게 이해하고 싶다면 추천하는 방법이다.

하지만 구글링의 방법을 먼저 설명한 이유는첫 강좌에서 강조했던, “쉬운 아두이노를 말하기 위해서이다아두이노의 소프트웨어하드웨어는 공개와 공유를 원칙으로 하기 때문에쉽게 자료를 구할 수 있다는 것그것이 아두이노의 가장 큰 장점이라고.

참고로 난 네이버 검색을 사랑하는 편이지만프로그래밍에 관한 내용을 검색할 때는 네이버보다는 구글을 더 자주 이용한다. 아무래도 네이버는 국내 자료 위주로 검색이 되니까. 아두이노는 국내보다 해외 자료가 훨씬 많고.

아두이노 analogread - adu-ino analogread
 

네이버 블로그에서 구글 추천하는 글 썼다고 짤리는 건 아니겠지.. ;;;

아무튼 결론은아두이노 소스는 검색하면 많이 나온다검색해서 사용해도 아무 문제가 없다!

뭔가 핀트가 안 맞는 결론 같지만 이번 강좌는 여기서 끝!

다음 강좌 “analogWrite()”에서 만나요안녕~

(단, 검색해도 없으면 데이터 시트를 봐야한ㄷ...)

아두이노 analogread - adu-ino analogread