-
스마트팜, 센서 그리고 LTE CATM1 모뎀HTTP 통신 2022. 5. 3. 21:21
최근에 토양의 온도, VWC(Volumetirc Water Content:체적 수분함량), EC(전기전도도)를 모두 측정할 수 있는
토양 센서와 최신 기술이 적용된 이산화탄소 센서 샘플을 전달받아서 라이브러리 구현 및 응용 가능한 애플리케이션을 제작하게 되었습니다.해당 작업을 진행하면서 해당 센서에 LTE CATM1 모뎀을 연결해서 심플한 스마트팜용 애플리케이션을 제작하게 되었습니다.
이유는 간단하게라도 스마트팜을 만들어보려고 할 때 먼저 맞닥뜨리는 문제 중 하나는 통신이기 때문입니다.
비닐하우스나 온실은 일반적으로 주거지에서 떨어져 있어서 전용선을 끌어오거나 WIFI통신을 하기가 쉽지 않아 내부에서 다양한 센서들로 수집한 정보들을 외부로 전달할 수 없는 경우가 많은데 이와 같은 문제를 LTE망을 사용하는 CATM1 모뎀을 사용하면 현장에서 해당 정보를 원할 때 즉시 서버 또는 클라우드로 데이터 전송이 가능하기 때문에 언제든지 웹 또는 앱으로 모니터링하고 해당 정보를 근거로 조치할 수 있습니다.
사용한 토양 센서는 UART(Serial, 9600bps)통신 방식을 사용하는 제품입니다. 현재 LTE CATM1 내장형 모뎀이 UART(Serial1, 115200bps)포트를 하나 사용하고 있어서 또 다른 UART를 써야 합니다. 애플리케이션에 사용한 Arduino NANO 33 BLE Sense 제품에는 더 이상 사용할 수 있는 UART 포트가 없어서 아래와 같은 방식으로 Software Serial을
사용했습니다.
#include "Arduino.h"
#include "wiring_private.h"
#include "HardwareSerial.h"
#include <Serial.h>
UART soilSensor(digitalPinToPinName(4), digitalPinToPinName(3), NC, NC);
soilSensor.begin(9600);
Software Serial의 경우 115200bps를 커버하기에는 무리가 있지만, 9600bps의 경우 인터럽트 처리방식으로 충분히 커버가 가능하기 때문에 저속에서도 동작 가능한 토양 센서를 연결했습니다.
이산화탄소 센서의 경우 0~3000 ppm의 값을 0~5V로 표현하기 때문에 3.3V ADC Reference를 가지고 있는 BLE Sense 보드의 경우 표현 범위가 넘어가기 때문에 아래와 같이 분배 저항 작업을 해서 전압을 1/2 값을 출력하도록 설정하였습니다.좀 더 높은 ADC Resolution을 위해서 12비트로 아래와 같이 설정했습니다.
analogReadResolution(12);
최종적으로 아래와 같은 수식을 이용해서 CO2값을 변환했습니다.
#define VLEVEL 0.6103515 //(3.3V를 4096(2^12)으로 분해했을 때 단위)
sensorValue = analogRead(sensorPin);
CO2 = ((sensorValue+1)*VLEVEL*2/1000)*600;간단한 스마트팜 애플리케이션에서는 매시간마다 토양 센서와 CO2센서를 통해 환경을 측정해서 ThingSpeak.com 클라우드 서버로 데이터를 전송합니다.
데이터 전송 시 우선 LTE CATM1 모뎀을 통해 클라우드 서버와 TCP Socket 연결을 하고 아래와 같은 순서로
데이터를 전송하게 됩니다. 3번 항목이 HTTP형식으로 텍스트를 서버로 전달하는 부분입니다.
/* 1 :TCP Socket Create ( 0:UDP, 1:TCP ) */
if (TYPE1SC.socketCreate(1, IPAddr, _PORT) == 0)
DebugSerial.println("TCP Socket Create!!!");
INFO:
/* 2 :TCP Socket Activation */
if (TYPE1SC.socketActivate() == 0)
DebugSerial.println("TCP Socket Activation!!!");
if (TYPE1SC.socketInfo(sckInfo, sizeof(sckInfo)) == 0) {
DebugSerial.print("Socket Info : ");
DebugSerial.println(sckInfo);
if (strcmp(sckInfo, "ACTIVATED")) {
delay(3000);
goto INFO;
}
}
/* 3 :TCP Socket Send Data */
String data = "GET /update";
data += "?api_key=" + WApiKey + "&field1=" + String(TEMP,2) + "&field2=" + String(EC_BULK,2) + "&field3=" + String(VWC,2) + "&field4=" + String(EC_PORE,2) + "&field5=" + String(CO2,2);
data += " HTTP/1.1\r\n";
data += "Host: api.thingspeak.com\r\n";
data += "Connection: close\r\n\r\n";
if (TYPE1SC.socketSend(data.c_str()) == 0) {
DebugSerial.print("[HTTP Send] >> ");
DebugSerial.println(data);
} else
DebugSerial.println("Send Fail!!!");
/* 4 :TCP Socket Recv Data */
if (TYPE1SC.socketRecv(recvBuffer, sizeof(recvBuffer), &recvSize) == 0) {
DebugSerial.print("[Recv] >> ");
DebugSerial.println(recvBuffer);
DebugSerial.print("[RecvSize] >> ");
DebugSerial.println(recvSize);
} else {
DebugSerial.println("Recv Fail!!!");
/* 5 :TCP Socket DeActivation */
if (TYPE1SC.socketDeActivate() == 0)
DebugSerial.println("TCP Socket DeActivation!!!");
if (TYPE1SC.socketInfo(sckInfo, sizeof(sckInfo)) == 0) {
DebugSerial.print("Socket Info : ");
DebugSerial.println(sckInfo);
}
/* 6 :TCP Socket DeActivation */
if (TYPE1SC.socketClose() == 0)
DebugSerial.println("TCP Socket Close!!!");
테스트 환경은 아래와 같습니다.
좌측이 CO2 센서입니다.토양 센서는 IP68 수준의 방수처리가 되어 있고 토양뿐 아니라 물 환경도 측정 가능하기 때문에 임의로 물컵에 넣어 둔 상태입니다.
전체 시스템 셋업 후 어제부터 사무실에서 1시간 단위로 센서 측정 후 CATM1 모뎀을 통해 클라우드로 데이터
업로드하며 테스트를 진행하고 있습니다.Murata Sensor, Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 차장 010-6556-5405 sipark@asung.com
LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.krhttps://www.devicemart.co.kr/goods/view?no=14077527
https://smartstore.naver.com/codezoo/products/7153689192
'HTTP 통신' 카테고리의 다른 글
모뎀에 사전 설치된 인증서로 https 통신하기 (0) 2023.08.15 버튼 인터럽트, 온습도센서 그리고 HTTP통신 (0) 2023.08.11 https 서버와 통신하기 두번째 이야기 (1) (2) 2023.02.04 https 서버와 통신하기 (2) 2022.12.06 LTE-CATM1 내장형 모뎀 사용자와 함께 HTTP 테스트 진행 (0) 2021.12.08