[TEMP-ON V1 노드모듈-I2C 온습도센서 모듈]
아날로그 센서와 디지털 센서, 두 개의 온도 센서를 비교해 보면 어떨까?
이런 아이디어에서 출발해서 I2C 통신을 사용하는 디지털 온습도 센서와 아날로그 센서 두 개를 내장한 TEMP-ON V1 노드모듈을 출시했습니다.
TEMP-ON V1 노드모듈은 한 개의 U-HUB V1 허브모듈을 장착할 수 있는 슬롯과, 한 개의 디지털 온습도 센서와 한 개의 아날로그 온도 센서가 내장되어 있습니다.
한 보드를 통해 아날로그 센서 데이터 수집 및 디지털(I2C) 센서 데이터 수집을 동시에 테스트해 볼 수 있으니 더 좋을 것 같습니다.
2개의 2.54mm, 1X12로 배열된 헤더핀은 U-HUB V1 허브모듈을 장착하면 전원, 아날로그, 디지털 I/O가 연결됩니다.
이제 TEMP-ON V1 노드모듈에 대해 알아보겠습니다.
먼저 각 부 명칭을 알아보겠습니다.
[TEMP-ON V1 각 부 명칭]
노드모듈을 정면으로 보았을 때, 크게 왼쪽으로 U-HUB V1 허브모듈을 장착할 수 있는 커넥터와 오른쪽상단에 AM2320 온습도 센서 한 개와 그 아래에 TMP36 센서가 있습니다.
AM2320 센서는 I2C 통신으로 센서의 온습도 데이터를 출력하며, TMP36 센서는 출력되는 전압레벨 신호, 즉 아날로그 신호로 온도데이터를 출력합니다.
U-HUB V1 모듈 착/탈커넥터에는 U-HUB V1 허브모듈이 장착되는 공간입니다.
[U-HUB V1과 TEMP-ON V1 결합 전 사진]
U-HUB V1 허브모듈과 TEMP-ON V1 노드모듈을 결합해 보았습니다.
[U-HUB V1과 TEMP-ON V1 결합 후 사진]
U-HUB V1 모듈 착/탈커넥터 사이로 배터리 연결단자와 칩저항으로 연결할 수 있는 패드가 있습니다.
[리튬이온 배터리 연결단자와 부가신호 핀]
가장 왼쪽에는 리튬이온 배터리 연결단자가 있습니다.
이 기능은 U-HUB V1 허브모듈이 반드시 장착되어야 사용할 수 있는 기능입니다. U-HUB V1 허브모듈에는 리튬이온 배터리 충전기능이 내장되어 있어 이 기능을 이용하는 것입니다.
(U-HUB V1은 3.7[V] 리튬이온 배터리를 지원하며 충전전류는 50[mA]로 제한되어 있습니다.)
리튬-이온 전지는 직접 연결하는 것 보다 on/OFF 스위치를 통해 연결하는 것이 좋습니다.
노드모듈 중앙에는 부가신호 핀으로 전원과 센서 출력 신호를 따로 연결해 놓았습니다.
필요에 따라서 배선으로 결선하여 사용할 수 있습니다.
또는 오실로스코프로 신호를 관찰할 때 유용할 것 같습니다.
핀 설명을 하면, SDA 핀와 SCL 핀은 AM2320 센서의 출력이며, VOUT 핀은 TMP36 센서의 출력입니다.
보드 기준 우측 상단에 AM2320 센서와 우측 하단에 TMP36 센서 그리고 1x12 헤더핀이 배치되어 있습니다.
[AM2320 온습도센서, TMP36 온도센서와 아날로그 입력 설정 저항, U-HUB V1 허브모듈 I/Os]
맨 먼저 위쪽으로 AM2320 온습도 센서가 보입니다. 그리고 그 아래 TMP36 온도센서가 작은 공간에 자리잡고 있고, TMP36 센서 좌측으로 "SELECT A/D CH"이라고 표기된 아날로그 입력 설정부가 있습니다.
이 아날로그 입력 설정부는 TMP36의 아날로그 출력을 U-HUB V1 허브모듈(아두이노)의 아날로그 입력 몇 번 채널과 연결할 지를 0옴의 저항을 통해 선택할 수 있습니다.
A0~A3 아날로그 입력 채널 중 선택해서 사용할 수 있으며, 기본적으로 A0로 설정되어 있습니다.
아날로그 입력 A4(SDA)와 A5(SCL)은 I2C 통신 핀으로 사용되어서 빠지게 되었습니다.
2개의 1x12 헤더핀은 2.54mm 간격으로 전원과 아날로그 입력(A0~A5), 디지털 입/출력(0~13)으로 구성되어 있으며, 임베디드 시스템이나 NODE-STAND V1 확장 스탠드와 체결해서 사용합니다.
참고로 I2C 핀으로 A4(SDA)와 A5(SCL) 핀을 사용하므로 아날로그 입력으로는 사용할 수 없습니다.
AM2320 온습도 센서에 대한 주요 정보를 확인해 보겠습니다.
[AM2320 온습도 센서 외형]
AOSONG사 제품 소개자료에 보면, Digital Temperature and Humidity Sensor라고 적혀있습니다. 특이한 부분은 Single I2C와 Single-bus 출력이 가능하다고 합니다.
(Single-bus 출력으로 사용할 경우에는 SCL 핀은 그라운드에 연결해야 할 것 같네요.)
습도 측정 범위는 0~99.9%RH이며, 0.1% 단위 측정이 가능한 센서입니다.
습도 오차범위는 +/-3%RH 입니다.
온도 측정 범위는 섭씨 -40도에서 +80도이며, 0.1도 단위 측정이 가능한 센서입니다.
온도 오차범위는 +/- 0.5도 입니다. (최대 1도 오차 존재)
다음은 TMP36 온도 센서에 대한 주요 정보를 확인해 보겠습니다.
[TMP36 (SOT-23 패키지) 온도 센서 외형]
Analog Device사 제품 소개자료에 보면, Low Voltage Temperature Sensor라고 적혀있습니다. TEMP-ON V1 노드모듈에는 SOT-23 패키지 타입의 TMP36 온도 센서가 장착되어 있습니다.
전원 전압은 DC 2.7[V]에서 DC 5.5[]V] 공급이 가능하며, TEMP-ON V1 노드모듈은 DC 3.3[V] 전원이 연결되어 있습니다.
온도 측정 범위는 섭씨 -40도에서 +125도이며, 0.5도 단위 측정이 가능한 센서입니다.
온도 오차범위는 +/- 2도 입니다. (최대 4도 오차 존재)
AM2320 센서가 오차 범위가 작아 정교해 보이며, TMP36 센서는 온도 측정 범위가 보다 넓어 목적에 맞게 사용하면 좋을 것 같습니다.
TMP36 센서는 아날로그 전압 출력으로 10[mV] 당 1도로 산출하면 됩니다.
아래 사진은 TEMP-ON V1 노드모듈을 NODE-ON V1 확장-스탠드에 장착한 사진입니다.
[TEMP-ON V1과 NODE-STAND V1 결합 사진]
본 설명에서는 위 사진 처럼 U-HUB V1과 PWR-ON V1을 결합하여 NODE-STAND V1에 장착하고, TEMP-ON V1을 NODE-STAND V1에 장착해서 동작시켜 보겠습니다.
(U-HUB V1과 TEMP-ON V1 두 보드만 연결해서도 사용할 수 있습니다.)
먼저 AM2320에 대한 오픈-소스, 즉 라이브러리가 필요합니다.
하기 사이트에 접속해서 라이브러리를 다운로드 받아 PC에 저장을 합니다.
라이브러리 다운로드 받는 곳 (GitHub)
https://github.com/hibikiledo/AM2320
위 사이트에 접속하신 뒤, "Clone or download" 버튼을 누른 뒤, "Download ZIP"을 클릭하면 해당 ZIP 파일이 다운로드 됩니다.
[GitHub에서 AM2320 라이브러리 다운로드 받기]
압축파일을 풀고 "AM2320-master" 폴더를 복사해서 아두이노 라이브러리 폴더에 넣습니다.
(AM2320-master의 하위 폴더가 AM2320-master로 중복되면 라이브러리 인식을 하지 못합니다.)
[AM2320 라이브러리를 아두이노 개발환경에 추가하기]
아래 동영상 동작은 AM2320 온습도 센서와 TMP36 온도센서의 동작 예시입니다.
I2C 통신을 통해 AM2320 센서의 데이터를 수집하고 ADC(Analog Digital Converter)를 통해 TMP36 센서의 데이터를 수집해서 아두이노 개발환경의 시리얼 모니터를 통해 출력합니다.
참고로 U-HUB V1 허브모듈은 아두이노 개발환경의 보드매니저에서 "Arduino PRO or PRO Mini"를 선택하고 스케치를 업로드하면 됩니다.
다음은 기본 예제 동작 영상입니다. 2초에 한번씩 AM2320 센서의 출력 값인 온도와 습도를 출력하고 이어서 TMP36 센서의 출력 값인 온도를 출력합니다. 이어 두 센서의 차이를 출력하는 예제입니다.
[TEMP-ON V1 동작 설명 동영상]
다음은 상기 동작에 대한 예제 스케치입니다. AM2320 라이브러리의 Example 소스를 부분 수정했고, TMP36 센서의 데이터를 수집하는 내용을 추가했습니다.
아두이노 아날로그 레퍼런스 전압(AREF)는 3.3[V]로 연결되어 있어 analogReference(EXTERNAL)로 설정해서 사용하는 것이 좋습니다.
/**
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Copyright 2016 Ratthanan Nalintasnai
**/
// Include library into the sketch
#include <AM2320.h>
// Create an instance of sensor
AM2320 sensor;
float AM2320Temp = 0.0;
float AM2320Humi = 0.0;
unsigned int AnalogVal = 0;
float voltage = 0.0;
float TMP36Temp = 0.0;
void setup() {
// Set Arduino ADC reference voltage
analogReference(EXTERNAL);
// Enable serial communication
Serial.begin(9600);
// Call sensor.begin() to initialize the library
sensor.begin();
}
void loop() {
// sensor.measure() returns boolean value
// - true indicates measurement is completed and success
// - false indicates that either sensor is not ready or crc validation failed
// use getErrorCode() to check for cause of error.
if (sensor.measure()) {
AM2320Temp = sensor.getTemperature();
AM2320Humi = sensor.getHumidity();
Serial.print("Temperature: ");
Serial.print(AM2320Temp);
Serial.print(" Humidity: ");
Serial.println(AM2320Humi);
}
else { // error has occured
int errorCode = sensor.getErrorCode();
switch (errorCode) {
case 1: Serial.println("ERR: Sensor is offline"); break;
case 2: Serial.println("ERR: CRC validation failed."); break;
}
}
AnalogVal = analogRead(A0);
// Changing analog value to voltage
voltage = (float)AnalogVal * 3.3;
voltage /= 1024.0;
// Converting from 10[mV] per degree, subtract 500[mV] offset
TMP36Temp = (voltage - 0.5) * 100;
Serial.print("Temperature: ");
Serial.print(TMP36Temp);;
Serial.println();
Serial.print("Difference : ");
Serial.print(AM2320Temp - TMP36Temp);
Serial.println();
delay(2000);
}
두 센서의 출력을 비교해 보니 약 3도 가까이 차이가 납니다. 단정하기는 어려우나 AM2320 센서가 캘리브레이션 센서이다 보니 이 센서를 기준으로 TMP36 센서를 맞추는 것이 낫지 않을까 합니다.
소스 코드 중 67라인의 "voltage = (float)AnalogVal * 3.3;" 에서 3.3을 3.4로 바꾸면 두 센서의 온도 값이 어느 정도 비슷해질 것 같습니다.
TEMP-ON V1 노드모듈을 통해 I2C 통신과 아날로그 입력에 대한 센서 데이터 수집에 대한 이해에 도움이 되었으면 합니다.
이상으로 블로그를 마치겠습니다.
감사합니다.
'앱스킷(APPSKIT) 강좌' 카테고리의 다른 글
[코딩노트_문자열] String 클래스 (0) | 2018.11.29 |
---|---|
[코딩노트_스케치] 스케치 동작원리 (0) | 2018.11.29 |
[앱스킷](LED-ON V1) I2C LED 모듈 사용방법 알아보기 (0) | 2018.11.28 |
[코딩노트_통신] Serial 라이브러리 (0) | 2018.11.28 |
[아두노트] 아두이노? (0) | 2018.11.28 |
댓글