헬륨(Helium) & DF로봇 무선 토양 수분 센서 시스템 – 실시간 식물 케어
부품 및 소모품
| 헬륨 아톰 XBee 모듈 (Helium Atom Xbee Module) |
1개 |
| 헬륨 엘리먼트 액세스 포인트 (Helium Element Access Point) |
1개 |
| DF로봇 Gravity: 아날로그 정전용량식 토양 수분 센서 |
1개 |
| 헬륜 아두이노/mbed 어댑터 (Helium Arduino/mbed Adapter) |
1개 |
| 아두이노 우노 (Arduino UNO) |
1개 |
앱 및 온라인 서비스
- 아두이노 IDE
- 헬륨 대시보드 (Helium Dashboard)
프로젝트 소개
무선 토양 수분 센서로 식물에게 '목소리'를 주세요
식물은 물 부족으로 자주 죽습니다. 바쁘신 분들을 위해 이 프로토타입 토양 수분 프로브로 고사리와 고무나무를 건강하게 지켜주세요.
다룰 내용 (약 60분 소요)
- DF로봇 Gravity 정전용량식 토양 수분 센서, 헬륨 아톰 프로토타이핑 모듈, 헬륨 아두이노 어댑터, 아두이노 보드(우노 사용)로 완전한 프로브 제작
- 헬륨 엘리먼트와 아톰 모듈을 헬륨 대시보드에 등록해 자체 저전력 광역 무선 네트워크 구축
- 아두이노 IDE로 프로그래밍: Helium 및 ArduinoJson 라이브러리 설치
- 식물에서 헬륨 대시보드로 실시간 토양 수분 데이터 전송, 헬륨 HTTP 채널로 파이핑
토양 수분 프로브 제작
완성된 프로브 모습:
- 헬륨 아톰 모듈을 헬륨 아두이노 어댑터에 꽂고, 이를 아두이노 보드에 결합. RX/TX 점퍼 설정을 보드에 맞게 구성하세요 (상세 가이드 여기 참조).
- DF로봇 토양 수분 프로브의 3선 점퍼 케이블(검정/빨강/파랑)을 헬륨 아두이노 어댑터에 연결:
- 검정 → GND
- 빨강 → 5V
- 파랑 → AD0 헤더
DF로봇 배선도 여기 참조. 올바른 배선 모습:
- 점퍼 케이블의 흰색 헤더를 DF로봇 토양 수분 프로브에 연결 (딸깍 소리 나면 완료).
헬륨 엘리먼트 배포
자체 헬륨 네트워크 구축, 약 30초 소요. (엔드투엔드 애플리케이션 구조와 무선 네트워킹 처리 방식은 아키텍처 개요 참조)
엘리먼트를 전원과 라이브 이더넷 포트에 연결 (제공된 케이블 사용). 셀룰러 백업 엘리먼트라면 이더넷은 선택 사항이나 권장. 전면 LED가 녹색(이더넷) 또는 청록색(셀룰러)이면 연결 완료. 연결 방법 영상 여기.
헬륨 대시보드에서 엘리먼트와 아톰 등록
대시보드는 헬륨의 호스팅 UI로 하드웨어 배포 모니터링/관리용. 출하 시 시스템에 등록되어 있으나 배포자 정보 필요.
- 헬륨 대시보드 계정 생성 (없다면)
- New Atom 클릭 → 이름 입력(예: 'Fern Saver') → MAC 주소 끝 4자리와 4자리 HVV 코드 입력 → 저장
- New Element도 동일하게 등록. 위치 정보 입력하면 지도에 표시됨.
대시보드 'Status & Signal'에서 엘리먼트 온라인 여부 확인 가능.
헬륨 HTTP 채널 배포
채널은 웹 서비스(AWS IoT, Google Cloud IoT, Azure IoT)나 프로토콜(MQTT, HTTP)로의 사전 구축 커넥터. 헬륨이 통합 작업을 모두 처리해줍니다. 예를 들어 HTTP 채널로 IFTTT에 데이터 보내 문자 알림 받기 가능.
여기서는 테스트용 무료 서비스 requestb.in으로 HTTP 채널 설정 예시. 스케치에서 채널 이름 HTTP 참조.
아두이노 IDE 설정 및 스케치 업로드
- 최신 아두이노 IDE 설치
- 라이브러리 매니저에서
Helium과 ArduinoJson 검색 후 설치 (JSON 포맷 전송용)
- GitHub(여기)의 전체 소스 복사해 새 스케치에 붙여넣기 후 업로드
완전 스케치: Soil_Humidity.ino
/* Copyright 2017, Helium Systems, Inc. All Rights Reserved.
* SEN0192 정전용량식 습도 센서로 습도 측정.
* 배선: https://www.dfrobot.com/wiki/index.php/Capacitive_Soil_Moisture_Sensor_SKU:SEN0193
* 라이브러리: ArduinoJson, Helium (스케치→라이브러리 포함→라이브러리 관리에서 설치)
*/
#include "Board.h"
#include <Arduino.h>
#include <ArduinoJson.h>
#include <Helium.h>
#include <Wire.h>
#define CHANNEL_NAME "HTTP" // 대시보드에 배포한 채널 이름과 일치해야 함
#define CHANNEL_DELAY 5000 // 1초 지연 (실제는 5초)
#define CHANNEL_SEND_CYCLE 12 // 60사이클(초)마다 전송
Helium helium(&atom_serial);
Channel channel(&helium);
int channel_counter;
void report_status(int status, int result = 0) {
if (helium_status_OK == status) {
if (result == 0) Serial.println(F("Succeeded"));
else { Serial.print(F("Failed - ")); Serial.println(result); }
} else Serial.println(F("Failed"));
}
void connect() {
while (!helium.connected()) {
Serial.print(F("Connecting - "));
int status = helium.connect();
report_status(status);
if (helium_status_OK != status) delay(1000);
}
}
void channel_create(const char * channel_name) {
int8_t result; int status;
do {
connect();
Serial.print(F("Creating Channel - "));
status = channel.begin(channel_name, &result);
report_status(status, result);
if (helium_status_OK != status) delay(1000);
} while (helium_status_OK != status || result != 0);
}
void channel_send(const char * channel_name, void const * data, size_t len) {
int status; int8_t result;
do {
Serial.print(F("Sending - "));
status = channel.send(data, len, &result);
report_status(status, result);
if (status == helium_status_OK && result != 0) channel_create(channel_name);
else if (status != helium_status_OK) delay(1000);
} while (helium_status_OK != status || result != 0);
}
void setup() {
Serial.begin(9600);
Serial.println(F("Starting"));
helium.begin(HELIUM_BAUD_RATE);
channel_create(CHANNEL_NAME);
channel_counter = 0;
}
#define DRY_VALUE 536 // 공기 중 측정값
#define WET_VALUE 303 // 물속 측정값
#define HUM_RANGE (DRY_VALUE - WET_VALUE)
void loop() {
Serial.print(F("Reading - "));
float reading = analogRead(A0);
float percent = 100 * (1 - (reading - WET_VALUE) / HUM_RANGE);
Serial.print(reading); Serial.print(" - "); Serial.println(percent);
if (--channel_counter <= 0) {
StaticJsonBuffer<JSON_OBJECT_SIZE(2) + 100> jsonBuffer;
JsonObject & root = jsonBuffer.createObject();
root[F("value")] = reading;
root[F("percent")] = percent;
char buffer[HELIUM_MAX_DATA_SIZE];
size_t used = root.printTo(buffer, HELIUM_MAX_DATA_SIZE);
channel_send(CHANNEL_NAME, buffer, used);
channel_counter = CHANNEL_SEND_CYCLE;
}
delay(CHANNEL_DELAY);
}
업로드 후 아톰 모듈 LED가 깜빡이면 헬륨 네트워크 연결 중. 에러 없으면 성공.
토양 수분 데이터 참고
데이터는 JSON으로 인코딩되어 전송. 예시:
{ "value": 433, "percent": 55.5 }
DF로봇 센서는 건조/습윤 기준값 사이 아날로그 판독값을 백분율로 변환. 상세 캘리브레이션 여기. 환경에 맞게 조정 필요할 수 있음.
헬륨 대시보드에서 센서 연결 및 데이터 확인
대시보드 아톰 UI에서 확인 가능:
- Status & Signal로 온라인 여부 및 메타데이터 확인
- Event Log로 각 데이터 포인트 전송 성공/실패 확인 (HTTP 채널로 전송됨)
- Debug 인터페이스에서 실시간 판독값 확인 (활성화 시)
다음 단계 및 도움말
축하합니다! 이제 무선 토양 수분 프로브로 고사리를 미래에도 안전하게 지킬 수 있습니다. 고사리들이 감사할 거예요. 🌿
더 알아보기: