프로젝트 대시보드는 Soracom Lagoon에서 호스팅됩니다. 데이터는 백엔드의 Soracom Air에서 수신되고, Soracom Harvest가 데이터를 수집한 후 Lagoon이 Harvest에서 쿼리합니다.
플릿의 각 디바이스 위치와 모든 센서 데이터가 대시보드에 플로팅됩니다. 대시보드 스크린샷은 아래와 같습니다.
알림
사용자는 디바이스가 수집한 UV 지수나 토양 수분이 비정상적일 때 이메일 알림을 받도록 백엔드를 설정할 수도 있습니다. 이렇게 하면 작물이 관리가 필요한지 알 수 있습니다.
이점
이 프로젝트를 운영하는 사용자는 많은 이점을 누릴 수 있습니다:
대시보드를 사용하여 언제 어디서나 이동 중에도 데이터 시각화 가능
디바이스를 쉽게 확장하여 여러 대 사용 가능
시장의 일반적인 솔루션보다 낮은 비용
프로젝트 구성
1단계: 필수 장비
이 프로젝트는 센서 및 기타 재료 목록이 필요합니다. 필요한 전체 재료 목록은 다음과 같습니다.
아두이노 MKR GSM
아두이노 MEM 쉴드
GY-21 온도 및 습도 모듈
방수 온도 센서
SI-1145 UV 라이트 센서
토양 수분 센서
2AA 배터리 박스 (배터리 포함) 또는 리포 배터리
Soracom SIM 카드
SD 카드
점퍼 와이어
2단계: 회로 연결
모든 부품을 납땜하기 위해 납땜 인두가 필요합니다. 회로도는 아래 프리칭 파일에 나와 있습니다.
MEM 쉴드를 보드에 부착하는 것을 잊지 마세요!
MKR GSM 준비
아두이노 MKR GSM을 준비해야 합니다. 저는 VIN 포트를 통해 2개의 AA 배터리로 보드에 전원을 공급했습니다. 단계는 아래와 같습니다.
3단계: 코드 이해
프로젝트에 사용된 코드에는 4가지 주요 섹션이 있습니다.
SD 카드 준비
데이터 수집
SD 카드에 데이터 기록
Soracom으로 데이터 전송
이 모든 섹션은 아래에 설명되어 있습니다.
SD 카드 준비
bool createFile() {
Serial.println("Creating File");
Serial.println(" OK - Creating and Opening File");
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
Serial.println(" OK - File Created");
Serial.println(" OK - Appending Legend to File");
Serial.print(" OK - Appending ");
Serial.println(legend);
dataFile.println(legend);
dataFile.close();
Serial.println(" Success - Data Appended");
} else {
Serial.println(" Error - File Not Detected");
Serial.println(" OK - Trying Again in 5 seconds");
Serial.println("________________________________________");
Serial.println("");
dataFile.close();
delay(5000);
return false;
}
Serial.println("________________________________________");
Serial.println("");
return true;
}
void checkFile() {
Serial.println("Checking .csv");
Serial.println("________________________________________");
Serial.println("Setting Up File");
Serial.println(" OK - Checking for File Presence");
if (SD.exists("datalog.csv")) {
Serial.println(" OK - File Exists");
Serial.println(" OK - Will Append to Existing File");
Serial.println("________________________________________");
Serial.println("");
} else {
Serial.println(" OK - File Not Present");
Serial.println(" OK - Creating File");
Serial.println("");
while (!createFile()) {};
}
}
checkFile() 함수는 디바이스가 추가할 .csv 파일이 존재하는지 확인합니다. 파일이 존재하면 함수가 종료되고, 그렇지 않으면 createFile()을 호출하여 새 .csv 파일을 생성합니다.
데이터 수집
void collectData() {
Serial.println("Gathering Data");
Serial.println("________________________________________");
Serial.println("Getting Data from Sensors");
Serial.println(" OK - Contacting all Sensors");
// 모든 센서에서 데이터 수집
soilSens.requestTemperatures();
soilTemp = soilSens.getTempCByIndex(0);
soilHumidity = analogRead(A1);
soilHumidity = map(soilHumidity, 1023, 0, 0, 100);
atmoTemp = gy21.readTemperature();
atmoHumidity = gy21.readHumidity();
visibleLight = uv.readVisible();
irLight = uv.readIR();
rawUVLight = uv.readUV();
uvLight = (rawUVLight / 100);
Serial.println(" OK - Data Collected");
Serial.println(" OK - Dumping Data");
Serial.print("[Light] Visible "); Serial.println(visibleLight);
Serial.print("[Light] Infrared "); Serial.println(irLight);
Serial.print("[Light] Ultraviolet "); Serial.println(uvLight);
Serial.print("[Atmo] Temperature "); Serial.println(atmoTemp);
Serial.print("[Atmo] Humidity "); Serial.println(atmoHumidity);
Serial.print("[Soil] Temperature "); Serial.println(soilTemp);
Serial.print("[Soil] Humidity "); Serial.println(soilHumidity);
Serial.println(" Success - Data Dumped");
Serial.println("________________________________________");
Serial.println("");
}
이 섹션은 보드의 모든 센서에서 데이터를 수집합니다. 대기 온도/습도, 토양 수분/온도, UV 지수, IR 라이트 값, 가시광선을 측정합니다.
SD 카드에 데이터 기록
bool burnData(String data) {
Serial.println("Burning Data");
Serial.println("________________________________________");
Serial.println("Burning Data to SD Card");
Serial.println(" OK - Opening File");
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
Serial.println(" OK - File is Present");
Serial.print(" OK - Appending ");
Serial.println(data);
Serial.println(" OK - Burning data");
dataFile.println(data); // 데이터를 SD 카드에 기록
dataFile.close();
Serial.println(" Success - Data Appended");
Serial.println("________________________________________");
Serial.println("");
} else {
Serial.println(" Error - File Not Present");
Serial.println(" OK - Trying Again in 5 Second");
Serial.println("________________________________________");
Serial.println("");
delay(5000);
}
Serial.println("");
}
이 함수는 이전에 .csv 파일의 한 줄로 컴파일된 데이터를 SD 카드에 기록합니다. 데이터는 카드의 파일에 추가됩니다.
Soracom으로 데이터 전송
void parseData(String dataToSend) {
Serial.println("Sending Data");
Serial.println("________________________________________");
Serial.println("Sending Data to Soracom");
Serial.println(" OK - Setting Up Connection");
if (client.connect(url, 80)) {
Serial.println(" OK - Connection Established, Parsing Data");
client.println("POST / HTTP/1.1");
client.println("Host: harvest.soracom.io");
client.println("User-Agent: Arduino/1.0");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(dataToSend.length());
client.println("");
client.println(dataToSend);
Serial.println(" OK - Data Parsed");
}
Serial.println(" OK - Getting Responce");
Serial.println("");
// 서버에서 응답 읽기
while (1) {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
break;
}
}
Serial.println(" Success - Data is Parsed");
Serial.println("________________________________________");
Serial.println("");
}
마지막으로 데이터가 Soracom으로 전송됩니다. 디바이스는 서버와 연결을 설정하고 자격 증명을 준비합니다. 데이터가 서버로 전송되고 응답이 시리얼 모니터에 출력됩니다.
디바이스는 정의된 시간 동안 슬립 모드로 진입한 후 단계를 반복합니다.
4단계: 변수 설정
프로젝트 사용 전에 사용자가 편집해야 할 몇 가지 변수가 있습니다. 편집 가능한 변수는 코드의 메인 파일에 있으며 아래에 설명되어 있습니다.
deviceName: 디바이스의 사용자 지정 이름. 페이로드와 함께 Soracom으로 전송되며, 플릿 관리 시 디바이스 식별에 유용합니다.
sleepTime: 읽기 사이에 디바이스가 슬립할 시간(밀리초). 배터리 소모를 줄이기 위해 읽기 사이에 슬립합니다.
proDebug: 디버깅 시 true, 그 외 false. true인 경우 디바이스는 시리얼 모니터가 켜진 컴퓨터에 연결되어 있어야 작동합니다. 디버깅 시 true로 설정하지만 필드에 배치 시 false로 설정하세요. proDebug가 false여도 시리얼 출력은 계속됩니다.
5단계: SD 카드 설정
SD 카드는 디바이스와 함께 사용하기 전에 준비해야 합니다. SD 카드는 FAT32로 포맷되어야 합니다. 아래 단계에 따라 SD 카드를 준비하세요.
6단계: 코드 업로드
백엔드 설정 전에 데이터가 전송되어야 합니다.
MKR GSM을 컴퓨터에 연결하고 코드를 디바이스에 업로드하세요. 이 설정에서는 디바이스 모드가 1로 설정되어 있는지 확인하세요. 코드 업로드 후 모든 센서를 물에 담그세요.
이제 디바이스의 버튼을 누르고 데이터가 수집되고 전송될 때까지 기다리세요. Soracom Air를 채우기 위해 이 과정을 몇 번 반복하세요.
7단계: Soracom 설정
이 단계는 2개 섹션으로 나뉩니다. 첫 번째는 Soracom 계정 생성 및 SIM 등록, 두 번째는 Soracom Harvest 설정으로 Air에서 데이터 수집. 이미 Soracom 계정이 있다면 첫 번째 섹션을 건너뛰세요.
섹션 1: 계정 생성
섹션 2: 그룹 및 Harvest
8단계: Soracom Lagoon 설정
Soracom에서 마지막으로 설정할 것은 Lagoon입니다. 이 도구로 데이터를 시각화하고 데이터가 좋지 않을 때 이메일 알림을 생성합니다. 아래 단계를 따르세요.
라이브러리
ArduinoLowPower (c) 2016 Arduino LLC GNU LGPL
MKRGSM (c) 2016 Arduino AG GNU LGPL
Wire (c) 2006 Nicholas Zambetti GNU LGPL
OneWire (c) 2007 Jim Studt GNU GPL
DallasTemperature GNU GPL
RTCZero (c) 2015 Arduino LLC GNU LGPL
SPI (c) 2015 Hristo Gochkov GNU LGPL
SD (C) 2010 SparkFun Electronics GNU GPL
마무리
마지막으로 프로젝트용 인클로저를 설계했습니다. UV 센서를 인클로저 내부에 배치할 수 있도록 상단이 투명하면 좋겠지만, 간섭을 방지하기 위해 센서를 외부에 배치했습니다.
SD 카드 모듈 사용
아두이노 MKR MEM 쉴드를 선택한 이유는 사용이 쉽고 컴팩트하기 때문입니다. SD 카드 모듈도 사용할 수 있지만 대부분 5V로 동작하는 반면 MKR GSM은 3.3V만 제공하므로 3.3V를 5V로 승압하는 레벨 컨버터가 필요합니다.
배경
버스를 타고 들판을 지나가다 이 아이디어를 떠올렸습니다. 농업 필드 모니터링에 사용되는 새로운 디바이스에 대해 읽은 기억이 났지만, 대부분 농부들이 감당하기 어려운 비용이라는 것을 알게 되었습니다.
그래서 저렴한 아두이노를 사용하여 농장의 여러 매개변수를 모니터링하고, 크고 작은 모든 농장이 IoT와 스마트 농업의 시대로 진입할 수 있게 하기로 결정했습니다.