본문 바로가기
모두의 아두이노

[아두이노][센서]토양 상태를 스마트하게 모니터링하는 방법! 아두이노와 BNC-MEC10 센서 사용 가이드

by 로니킴 2024. 10. 29.


이 프로젝트는 아두이노와 BNC-MEC10 토양 전도도 센서를 활용하여 초보자도 쉽게 따라 할 수 있도록 구성되었습니다. 단계별 설명을 통해 하드웨어 연결부터 소프트웨어 코딩, 동작 확인까지 모든 과정을 다룹니다. 이제 아두이노 세계로 한 걸음 나아가 보세요!

 

 

목차

     

     

     


    [아두이노][센서] 토양 상태를 스마트하게 모니터링하는 방법! 아두이노와 BNC-MEC10 센서 사용 가이드

    이번 프로젝트에서는 아두이노와 BNC-MEC10 센서를 MAX485 모듈을 통해 연결하여 RS485 통신으로 데이터를 송수신하는 방법을 다루었습니다. 센서는 토양의 온도, 수분 함량(VWC), 전도도(EC), 염도(Salinity), 총 용존 고형물(TDS), 유전율(Epsilon)을 측정하여, 아두이노를 통해 실시간으로 데이터를 수집하고 시리얼 모니터에 출력합니다. 센서의 내구성과 방수성(IP68 등급)을 갖추어 다양한 환경에서 장기간 사용이 가능하며, 농업, 원예, 환경 모니터링에 이상적입니다. 이번 프로젝트는 기본적인 데이터 수집에서 나아가 원격 모니터링 시스템으로 확장할 수 있는 가능성을 제공합니다.

     


     

    1. BNC-MEC10이란 ?

    BNC-MEC10은 토양의 수분, 전도도(EC), 온도를 동시에 측정하는 센서로, 농업, 원예, 환경 모니터링과 같은 다양한 분야에서 사용됩니다. 이 센서는 내부에 장착된 금속 전극을 통해 토양 내 수분과 염분 농도를 측정하며, 온도 보상 기능이 포함되어 있어 온도 변화에 영향을 받지 않고 안정적으로 데이터를 제공할 수 있습니다. RS485 통신 인터페이스Modbus-RTU 프로토콜을 지원하여 장거리에서도 아두이노나 다른 제어 장치와의 원활한 데이터 통신을 보장합니다​.

    BNC-MEC10의 주요 특징은 다음과 같습니다.

    • 토양 수분: 0-100%까지의 범위를 측정하며, FDR(주파수-영역 반사법) 방식으로 안정적이고 정확한 수분 함량 측정이 가능합니다.
    • 전도도(EC): 0-20,000 μS/cm의 EC 범위로, 토양의 비료 및 염분 농도를 감지합니다. AC 방식으로 EC를 측정하여 데이터 정확성을 높이고, 외부 간섭에 대한 내성이 강합니다.
    • 온도: -40~80°C까지의 온도 범위를 측정하여, 환경 모니터링과 온도 보정에 기여합니다.

    이 센서는 IP68 등급의 방수 기능을 갖추고 있어 습한 환경에서도 장기간 안정적으로 사용할 수 있으며, 농업, 원예, 연구 시설 등 다양한 분야에 적합한 고내구성 센서로 설계되었습니다​.

     


    2. BNC-MEC10의 동작 원리 

    BNC-MEC10은 토양의 유전율을 측정하여 수분 함량(VWC)을 계산합니다. 이 원리는 토양 내 물의 양이 높을수록 유전율이 증가하는 특성을 이용한 것으로, 이를 통해 토양의 수분 함량을 정확하게 측정할 수 있습니다. 센서는 AC 방식으로 전도도(EC) 측정하여 토양 내 이온 농도, 즉 비료와 염분 농도를 파악합니다. 이와 같은 EC 측정 방식은 외부 간섭을 최소화하여 데이터의 신뢰성을 높입니다​.

     

    또한, BNC-MEC10은 온도 보상 기능을 내장하고 있어 다양한 온도 환경에서도 일관된 데이터를 제공합니다. 센서와 제어 장치는 RS485 통신을 통해 연결되며, 기본 통신 속도는 9600 bps입니다. Modbus-RTU 프로토콜을 사용하여 온도, 수분, 전도도 데이터를 실시간으로 송수신할 수 있습니다. 센서의 Modbus 레지스터는 필요한 데이터를 쉽게 접근할 수 있도록 설계되었으며, 사용자는 요청 명령을 통해 데이터를 조회할 수 있습니다​.

    이와 같은 구조와 원리 덕분에 BNC-MEC10은 다양한 환경 모니터링과 농업 응용 프로그램에서 매우 유용한 도구로 활용됩니다.

     

     

     


    BNC-MEC10은 RS485 통신을 통해 Modbus-RTU 프로토콜로 다양한 토양 데이터를 제공하며, 온도, 수분 함량(VWC), 전도도(EC), 염도(Salinity), 총 용존 고형물(TDS), 유전율(Epsilon), 그리고 토양 타입(Soil Type) 정보를 측정하여, 환경 조건에 맞춘 맞춤형 토양 데이터를 제공합니다​.

    1. 온도(Temperature) 측정
    BNC-MEC10은 -40°C에서 80°C까지의 온도를 측정하며, 레지스터 값에 100을 나누어 실제 온도 값을 얻습니다. 예를 들어, 레지스터 값이 0x0702일 경우, 이 값은 17.94°C로 변환됩니다. 온도 보정 기능이 포함되어 있어 환경 온도 변화에도 정확한 측정이 가능합니다.

    2. 수분 함량(VWC) 측정

    토양의 수분 함량은 주파수 영역 반사법(FDR)으로 측정되며, 이는 유전율의 변화를 기반으로 토양 내 수분 비율을 계산합니다. 예를 들어, 레지스터에서 0x0E93 값을 읽어 들인 경우 이를 100으로 나누어 37.31%의 수분 함량으로 해석할 수 있습니다. 이 방식은 토양 종류에 관계없이 높은 정확도를 유지하여, 관개 시스템 제어 및 농업 관리에 필수적인 정보를 제공합니다.

     

    3. 전도도(EC) 측정
    전도도는 토양 내 이온 농도를 반영하는 지표로, BNC-MEC10은 AC 전류 방식을 사용해 EC 값을 측정합니다. 이는 외부 간섭을 줄이고 데이터의 신뢰성을 높이며, 예를 들어 레지스터 값이 0x04E2일 경우 1250 μS/cm로 해석됩니다. EC 측정은 토양 내 비료 및 염분 농도를 파악하는 데 유용하며, 비료 시기 조절 등에 중요한 데이터를 제공합니다.


    4. 염도(Salinity) 측정
    염도는 EC 데이터를 바탕으로 계산되며, 레지스터에 저장된 전도도 값에 염도 계수(Salinity Coefficient)를 곱하여 산출됩니다. 기본 염도 계수는 0.55로 설정되어 있으며, 예를 들어 EC 값이 2000 μS/cm일 경우, 염도는 1100 mg/L로 계산됩니다. 이는 과도한 염류 축적을 방지하고 작물의 생장 환경을 최적화하는 데 중요한 역할을 합니다.


    5. 총 용존 고형물(TDS) 측정
    총 용존 고형물(TDS)은 EC 값을 바탕으로 한 추가 정보로, TDS 계수에 따라 EC에서 파생됩니다. 기본 TDS 계수는 0.5로 설정되어 있으며, 예를 들어 EC가 1500 μS/cm일 경우 TDS는 750 mg/L로 산출됩니다. TDS는 토양 내 비료 성분을 종합적으로 평가하는 데 유용하며, 장기적인 토양 건강 관리에 필수적입니다.


    6. 유전율(Epsilon) 측정
    유전율은 수분 함량을 추정하는 데 핵심적인 요소로, BNC-MEC10은 0.88에서 81.88까지의 유전율을 측정할 수 있습니다. 레지스터에 저장된 유전율 값을 100으로 나누어 실제 값을 산출하며, 예를 들어 0x0702 값은 17.94로 해석됩니다. 유전율 데이터는 센서의 자동 교정에 활용되며, 토양의 전반적인 상태를 파악하는 데도 중요한 지표로 작용합니다.

     

    7. 토양 타입(Soil Type) 설정
    센서는 특정 환경에 맞춰 토양 타입을 설정할 수 있는 기능을 제공합니다. 이는 레지스터를 통해 설정되며, 토양을 광물질(Mineral), 모래(Sand), 점토(Clay), 유기질(Organic)로 구분할 수 있습니다. 이러한 설정을 통해 각 토양 타입에 맞춰 측정 정확도를 높일 수 있으며, 데이터 해석에서 보다 최적화된 결과를 얻을 수 있습니다.

     

    8. Modbus 레지스터 및 통신 설정
    BNC-MEC10은 Modbus 통신 프로토콜을 통해 사용자가 센서의 다양한 매개 변수를 직접 설정하거나 데이터를 읽을 수 있도록 합니다. 레지스터 주소에 따라 온도, VWC, EC, 염도, TDS, 유전율, 토양 타입 정보를 읽어 올 수 있으며, 기본 설정으로는 Slave 주소 1, 통신 속도 9600 bps, 8 데이터 비트, 패리티 없음, 1 스톱 비트를 사용합니다​.

    이와 같이 BNC-MEC10 센서는 토양의 다양한 물리적, 화학적 상태를 분석할 수 있는 종합적인 도구로, 농업 및 환경 모니터링에서 실시간으로 신뢰할 수 있는 데이터를 제공하여 효과적인 토양 관리와 농작물 생장 최적화를 지원합니다.

     

    RS485 Soil Moisture & Temperature & EC Sensor (S-Temp&VWC&EC-02A).pdf
    0.58MB
    Soil Moisture&Temperature&EC Sensor User Manual-S-Temp&VWC&EC-02.pdf
    0.80MB
    UM-MEC10-Soil-Moisture-EC-and-Temperature-Sensor.pdf
    0.95MB

     

     


     

    3. 구입하기

    BNC-MEC10 센서는 토양의 수분 함량, 전도도, 온도를 측정할 수 있는 다기능 센서로, RS485 통신을 지원하여 원거리에서도 안정적인 데이터 전송이 가능합니다. 이 센서를 아두이노와 연결하여 사용하려면 RS485 신호를 TTL 신호로 변환해 주는 MAX485 모듈(TTL-RS485 신호 변환기)을 추가로 구입해야 합니다. 이 모듈은 BNC-MEC10의 RS485 출력 신호를 아두이노에서 처리할 수 있는 TTL 신호로 변환해 주며, 안정적인 통신을 보장합니다.

     

    BNC-MEC10 센서 및 MAX485 모듈 구입 시 고려 사항

    1. 센서 가격:
      • BNC-MEC10의 가격대는 보통 5만 원에서 10만 원 사이이며, 온라인 전자 부품 쇼핑몰에서 쉽게 구입할 수 있습니다. 일부 해외 판매처(예: 알리익스프레스)를 통해 구매하면 다소 저렴하게 구매할 수 있지만, 배송 시간이 길어질 수 있으므로 프로젝트 일정에 따라 적절히 선택해야 합니다.
      • 국내 판매처에서는 다소 높은 가격대일 수 있으나, 빠른 배송과 A/S 지원을 받을 수 있습니다.
    2. MAX485 모듈 가격:
      • MAX485 모듈은 RS485 신호를 TTL로 변환하여 아두이노와 통신이 가능하게 해주는 장치입니다. 가격은 약 1천 원에서 3천 원 사이로 비교적 저렴하게 구매할 수 있으며, BNC-MEC10 센서와 함께 구입하는 것이 좋습니다.
      • MAX485 모듈은 다양한 온라인 판매처에서 구매할 수 있으며, 회로 기판에 쉽게 연결할 수 있는 핀 형태로 제공되어 설치가 간편합니다.
    3. 구매 시 주의 사항:
      • 신뢰할 수 있는 판매처 선택: BNC-MEC10과 MAX485 모듈은 안정적인 데이터 전송이 필요한 장치이므로, 정품을 취급하는 판매처에서 구입하는 것이 좋습니다.
      • 배송 기간 확인: 해외 판매처는 배송 기간이 2주 이상 소요될 수 있으므로, 프로젝트 일정에 맞춰 충분한 시간을 두고 구매하세요.
      • 통신 호환성 확인: BNC-MEC10은 RS485 프로토콜을 사용하기 때문에, 아두이노와 통신하려면 반드시 MAX485와 같은 신호 변환 모듈이 필요합니다.

    이렇게 BNC-MEC10 센서와 MAX485 모듈을 함께 사용하면, 아두이노를 통해 실시간으로 토양 데이터를 수집할 수 있습니다. MAX485 모듈을 통해 RS485 신호를 TTL 신호로 변환하여 아두이노와의 호환성을 높이고, 다양한 농업 또는 환경 모니터링 프로젝트에 응용할 수 있습니다.

     

     

     


     

     

     

    4. 하드웨어 연결하기

     

    BNC-MEC10 센서를 아두이노와 연결하기 위해서는 RS485 통신을 TTL 신호로 변환해주는 MAX485 모듈이 필요합니다. RS485는 산업용 통신 프로토콜로 장거리 및 노이즈가 많은 환경에서 안정적인 통신을 보장하지만, 아두이노는 RS485 신호를 직접 처리할 수 없기 때문에 MAX485 모듈을 사용하여 TTL 신호로 변환해야 합니다.

     

    1. 연결 개요

    아두이노, MAX485 모듈, BNC-MEC10 센서를 연결하여 통신할 때, 아래와 같은 기본 연결을 사용합니다:

    • 아두이노에서 RS485 통신 신호를 수신하고 전송하기 위해 MAX485 모듈을 중간에 연결
    • MAX485 모듈의 A/B 핀을 통해 BNC-MEC10 센서의 RS485 통신선을 연결하여 신호를 송수신
    • 아두이노의 디지털 핀을 통해 MAX485 모듈의 송신 및 수신 활성화 제어

    2. 하드웨어 연결 방법

    1. MAX485 모듈과 아두이노 연결
      • VCC (5V): 아두이노의 5V 핀과 MAX485 모듈의 VCC 핀을 연결하여 전원을 공급합니다.
      • GND: 아두이노의 GND와 MAX485 모듈의 GND 핀을 연결하여 공통 접지를 설정 합니다.
      • DI (Data In): 아두이노의 TX 핀(예: D3 핀)과 MAX485의 DI 핀을 연결하여 데이터를 전송할 수 있도록 합니다.
      • RO (Receiver Out): 아두이노의 RX 핀(예: D2 핀)과 MAX485의 RO 핀을 연결하여 수신된 데이터를 읽어 들입니다.
      • RE (Receiver Enable)DE (Driver Enable): 송신 및 수신 제어를 위해 두 핀을 아두이노의 다른 디지털 핀(예: D4)에 연결합니다. DE 핀을 HIGH로 설정하면 송신 모드가 활성화되고, RE 핀을 LOW로 설정하면 수신 모드가 활성화됩니다.
    2. MAX485 모듈과 BNC-MEC10 센서 연결
      • A (RS485+): MAX485의 A 핀을 BNC-MEC10 센서의 RS485+에 연결합니다.
      • B (RS485-): MAX485의 B 핀을 BNC-MEC10 센서의 RS485-에 연결하여 RS485 통신선을 완성합니다.

    3. 통신 활성화 및 제어

    MAX485 모듈은 반이중 통신(half-duplex) 방식으로 작동하므로 송신과 수신이 순차적으로 이루어집니다. 따라서, 아두이노에서 RE와 DE 핀의 신호를 제어하여 송신 및 수신 모드를 전환해야 합니다:

    • 데이터 송신 시: DE 핀을 HIGH로 설정하여 송신 모드를 활성화합니다.
    • 데이터 수신 시: RE 핀을 LOW로 설정하여 수신 모드를 활성화합니다.

    4. 예제 설정

    아래와 같은 예제 핀 설정을 통해 연결을 구성할 수 있습니다.

    • 아두이노 D3 핀 → MAX485의 DI 핀 (데이터 입력)
    • 아두이노 D2 핀 → MAX485의 RO 핀 (데이터 수신)
    • 아두이노 D4 핀 → MAX485의 DE 및 RE 핀 (송신 및 수신 모드 제어)
    • MAX485의 A/B 핀BNC-MEC10 센서의 RS485+/RS485- 핀

    이러한 설정을 통해 아두이노는 MAX485 모듈을 통해 BNC-MEC10 센서로부터 데이터를 안정적으로 송수신할 수 있습니다.

     


     

    5. 소프트웨어 코딩하기(온도(°C), 수분 함량(%), 전도도(μS/cm) 값을 표시)

    아두이노와 BNC-MEC10 센서를 MAX485 모듈을 통해 RS485 통신으로 연결하여 데이터를 송수신할 수 있는 최적화된 코드를 작성했습니다. 이 코드는 송신 모드와 수신 모드 전환을 제어하며, 수신된 데이터를 아두이노 시리얼 모니터에 출력합니다.

     

    아래 코드는 주석과 함께 각 기능을 설명하고, 코드 흐름을 통해 각 단계의 동작 방식을 이해할 수 있도록 구성되었습니다.

     

    #include <ModbusMaster.h>  // Modbus 라이브러리 포함
    
    // 핀 정의
    const int RS485_DE = 4; // 송신/수신 제어 핀
    const int RS485_RE = 4; // 송신/수신 제어 핀
    const int RS485_RX = 2; // 데이터 수신 핀
    const int RS485_TX = 3; // 데이터 전송 핀
    
    ModbusMaster node;
    
    void preTransmission() {
      digitalWrite(RS485_DE, HIGH);  // 송신 모드 활성화
      digitalWrite(RS485_RE, HIGH);
    }
    
    void postTransmission() {
      digitalWrite(RS485_DE, LOW);   // 수신 모드 활성화
      digitalWrite(RS485_RE, LOW);
    }
    
    void setup() {
      // 아두이노 시리얼 초기화
      Serial.begin(9600);
    
      // Modbus 통신 설정 및 전송/수신 모드 핀 설정
      node.begin(1, Serial);  // 슬레이브 ID 1로 설정
      node.preTransmission(preTransmission);
      node.postTransmission(postTransmission);
    
      pinMode(RS485_DE, OUTPUT);  // 송신/수신 제어 핀을 출력 모드로 설정
      digitalWrite(RS485_DE, LOW); // 초기 수신 모드 설정
    }
    
    void loop() {
      uint8_t result;
      uint16_t data[3];
    
      // 레지스터 0x0000에서 3개의 데이터(온도, 습도, 전도도) 읽기
      result = node.readInputRegisters(0x0000, 3);
    
      // 데이터 수신 성공 여부 확인
      if (result == node.ku8MBSuccess) {
        data[0] = node.getResponseBuffer(0x00);  // 온도 값
        data[1] = node.getResponseBuffer(0x01);  // 수분 함량 값
        data[2] = node.getResponseBuffer(0x02);  // 전도도 값
    
        // 수신된 데이터 변환 및 출력
        float temperature = data[0] / 100.0;    // 온도 (°C)
        float moisture = data[1] / 100.0;       // 수분 함량 (%)
        float conductivity = data[2] / 100.0;   // 전도도 (μS/cm)
    
        Serial.print("Temperature: ");
        Serial.print(temperature);
        Serial.print(" °C, Moisture: ");
        Serial.print(moisture);
        Serial.print(" %, Conductivity: ");
        Serial.print(conductivity);
        Serial.println(" μS/cm");
      }
      delay(1000);  // 1초 대기 후 새로운 데이터 요청
    }

     

     

    코드 동작 설명

    1. 초기 설정
      • RS485_DE와 RS485_RE 핀을 송신/수신 제어 핀으로 설정하여 데이터 전송과 수신을 전환합니다.
      • preTransmission() 및 postTransmission() 함수를 통해 송신과 수신 모드를 각각 전환하며, 송신 전 HIGH, 수신 후 LOW 상태로 설정합니다.
    2. 데이터 요청 및 수신
      • node.readInputRegisters(0x0000, 3) 명령으로 온도, 수분, 전도도 데이터를 포함한 세 개의 레지스터 값을 요청합니다.
      • 데이터가 성공적으로 수신되면 node.ku8 MBSuccess를 통해 수신 결과를 확인하고, 데이터를 getResponseBuffer() 함수로 읽어 들입니다.
    3. 데이터 변환 및 출력
      • 수신된 온도, 수분, 전도도 데이터를 100으로 나누어 실제 측정값으로 변환하여 시리얼 모니터에 출력합니다.
      • 각 데이터는 센서에서 측정된 값이며, 변환 후 Serial.print()로 시리얼 모니터에 출력됩니다.
    4. 반복 측정 및 대기
      • delay(1000)을 통해 1초마다 데이터를 요청하여 실시간 모니터링이 가능하도록 합니다.

    이 코드 구조는 RS485 모듈과의 통신을 안정적으로 유지하며, 송신과 수신 전환을 원활하게 제어하여 데이터 신뢰성을 높입니다. ModbusMaster 라이브러리를 통해 통신 제어가 간단하며, RS485를 활용한 장거리 데이터 전송이 가능합니다.

     


     

    아래는 위 코드가 시리얼 모니터에 출력하는 데이터의 예시입니다. 이 예시는 온도(°C), 수분 함량(%), 전도도(μS/cm) 값을 표시합니다. 센서에서 수신된 값이 변환 후 시리얼 모니터에 다음과 같이 출력됩니다.

    Temperature: 23.45 °C, Moisture: 65.23 %, Conductivity: 1350.56 μS/cm
    Temperature: 23.47 °C, Moisture: 65.20 %, Conductivity: 1351.00 μS/cm
    Temperature: 23.50 °C, Moisture: 65.25 %, Conductivity: 1350.75 μS/cm

     

    위와 같은 출력은 1초마다 새롭게 갱신되며, 23.45 °C는 현재 온도, 65.23 %는 토양의 수분 함량, 1350.56 μS/cm는 토양의 전도도 수치를 나타냅니다. 이 데이터는 실시간으로 갱신되며, 관개 및 비료 관리에 유용한 정보를 제공합니다.

     

     

     


     

    5-2. 소프트웨어 코딩하기

    아래 코드는 BNC-MEC10 센서를 통해 토양 온도, 수분 함량(VWC), 전도도(EC), 염도(Salinity), TDS, 유전율(Epsilon)을 아두이노 시리얼 모니터에 출력하는 최적화된 예제입니다.

     

     

     

    이 코드는 RS485 통신을 위한 MAX485 모듈을 사용하여 아두이노와 센서를 연결하며, Modbus 프로토콜을 사용해 데이터를 요청하고 송수신 모드를 제어합니다.

     

    #include <ModbusMaster.h>  // Modbus 라이브러리 포함
    
    // 핀 정의
    const int RS485_DE = 4; // 송신/수신 제어 핀
    const int RS485_RE = 4; // 송신/수신 제어 핀
    const int RS485_RX = 2; // 데이터 수신 핀
    const int RS485_TX = 3; // 데이터 전송 핀
    
    ModbusMaster node;
    
    void preTransmission() {
      digitalWrite(RS485_DE, HIGH);  // 송신 모드 활성화
      digitalWrite(RS485_RE, HIGH);
    }
    
    void postTransmission() {
      digitalWrite(RS485_DE, LOW);   // 수신 모드 활성화
      digitalWrite(RS485_RE, LOW);
    }
    
    void setup() {
      Serial.begin(9600);             // 아두이노 시리얼 초기화
      node.begin(1, Serial);           // 슬레이브 ID 1로 설정
      node.preTransmission(preTransmission);
      node.postTransmission(postTransmission);
    
      pinMode(RS485_DE, OUTPUT);       // 송신/수신 제어 핀을 출력 모드로 설정
      digitalWrite(RS485_DE, LOW);     // 초기 수신 모드 설정
    }
    
    void loop() {
      uint8_t result;
      uint16_t data[6];
    
      // 레지스터 0x0000에서 6개의 데이터 읽기 (온도, 수분 함량, 전도도, 염도, TDS, 유전율)
      result = node.readInputRegisters(0x0000, 6);
    
      // 데이터 수신 성공 시 출력
      if (result == node.ku8MBSuccess) {
        data[0] = node.getResponseBuffer(0x00);  // 온도
        data[1] = node.getResponseBuffer(0x01);  // 수분 함량
        data[2] = node.getResponseBuffer(0x02);  // 전도도
        data[3] = node.getResponseBuffer(0x03);  // 염도
        data[4] = node.getResponseBuffer(0x04);  // TDS
        data[5] = node.getResponseBuffer(0x05);  // 유전율
    
        // 수신된 데이터 변환 및 출력
        float temperature = data[0] / 100.0;      // 온도 (°C)
        float moisture = data[1] / 100.0;         // 수분 함량 (%)
        float conductivity = data[2];             // 전도도 (μS/cm)
        float salinity = data[3] / 100.0;         // 염도 (mg/L)
        float tds = data[4] / 100.0;              // TDS (mg/L)
        float epsilon = data[5] / 100.0;          // 유전율
    
        Serial.print("Temperature: ");
        Serial.print(temperature);
        Serial.print(" °C, Moisture: ");
        Serial.print(moisture);
        Serial.print(" %, Conductivity: ");
        Serial.print(conductivity);
        Serial.print(" μS/cm, Salinity: ");
        Serial.print(salinity);
        Serial.print(" mg/L, TDS: ");
        Serial.print(tds);
        Serial.print(" mg/L, Epsilon: ");
        Serial.print(epsilon);
        Serial.println();
      }
      delay(1000);  // 1초마다 새 데이터 요청
    }

     

    코드 동작 설명

    1. 초기 설정
      • RS485_DE 및 RS485_RE 핀을 사용하여 송신과 수신 모드를 전환합니다.
      • preTransmission()과 postTransmission()을 통해 송신 모드 전환 시 HIGH, 수신 모드 전환 시 LOW로 설정합니다.
    2. Modbus 데이터 요청
      • node.readInputRegisters(0x0000, 6) 명령으로 센서 레지스터에서 6개의 값을 읽어옵니다. 이 레지스터들은 순서대로 온도, 수분 함량, 전도도, 염도, TDS, 유전율 데이터를 포함하고 있습니다​.
    3. 데이터 변환 및 시리얼 출력
      • 각 데이터는 센서에서 반환된 원시 값을 기준으로 변환됩니다.
        • 예를 들어, 온도와 수분 함량은 100으로 나누어 소수점을 맞추고, 전도도는 μS/cm 단위 그대로 출력됩니다.
      • 시리얼 모니터에 모든 값을 출력하여 토양의 현재 상태를 실시간으로 모니터링할 수 있도록 합니다.

    예시 출력값

    첨부된 매뉴얼에 따라 예제 레지스터 값 0x08 90이 온도를, 0x0E 93이 수분 함량을, 0x02 4E이 전도도를 나타낸다면, 변환된 데이터는 다음과 같습니다​.

    Temperature: 21.92 °C, Moisture: 37.31 %, Conductivity: 590 μS/cm, Salinity: 32.45 mg/L, TDS: 29.50 mg/L, Epsilon: 17.94

     

    위 예시 출력에서:

    • 온도는 0x0890 = 2192 / 100 = 21.92°C
    • 수분 함량(VWC)은 0x0E93 = 3731 / 100 = 37.31%
    • 전도도(EC)는 0x024E = 590 μS/cm
    • 염도(Salinity), TDS, **유전율(Epsilon)**은 각각 변환된 값으로 나타납니다.

    이 출력 값은 BNC-MEC10 센서로부터 실시간으로 데이터를 수신하여, 현재 토양 상태를 모니터링하고 필요시 관개와 비료 조정을 돕는 데 유용합니다.

     

     

     

     


     

    5-3. 소프트웨어 코딩하기 (라이브러리 에러)

     

    C:\Users\ronniekim\AppData\Local\Temp\.arduinoIDE-unsaved2024929-33280-mhlvii.4flgh\sketch_oct29a\sketch_oct29a.ino:1:10: fatal error: ModbusMaster.h: No such file or directory
     #include <ModbusMaster.h>  // Modbus 라이브러리 포함
              ^~~~~~~~~~~~~~~~
    compilation terminated.
    exit status 1

    Compilation error: ModbusMaster.h: No such file or directory

     

    이 오류는 아두이노 IDE에서 ModbusMaster 라이브러리를 찾을 수 없기 때문에 발생한 것입니다. ModbusMaster.h 파일을 포함하려면, 먼저 아두이노 IDE에 해당 라이브러리를 설치해야 합니다. 다음은 이 문제를 해결하기 위한 단계입니다:

     

     

    해결 방법

    1. 라이브러리 설치:
      • 아두이노 IDE를 열고, 상단 메뉴에서 스케치 > 라이브러리 포함하기 > 라이브러리 관리를 선택합니다.
      • 라이브러리 관리 창이 열리면, 검색창에 ModbusMaster를 입력하여 관련 라이브러리를 검색합니다.
      • 검색 결과에서 ModbusMaster 라이브러리를 선택하고 설치 버튼을 클릭하여 설치합니다.
    2. 설치 후 확인:
      • 라이브러리가 정상적으로 설치되었는지 확인하려면, 설치 완료 후 IDE를 다시 시작한 다음, 프로젝트에 #include <ModbusMaster.h> 코드가 포함된 상태에서 컴파일을 다시 시도합니다.
    3. 대체 경로로 수동 설치 (자동 설치가 실패할 경우):
      • ModbusMaster GitHub 저장소에 접속하여 라이브러리 파일을 다운로드할 수 있습니다.
      • ZIP 파일을 다운로드한 후, 아두이노 IDE에서 스케치 > 라이브러리 포함하기 > .ZIP 라이브러리 추가를 선택하여 방금 다운로드한 파일을 추가합니다.
    4. 컴파일 오류 재확인:
      • 라이브러리가 설치된 후 ModbusMaster.h 파일을 찾을 수 있어야 하므로, 스케치 > 확인/컴파일을 다시 실행하여 오류가 해결되었는지 확인합니다.

    이 단계를 완료하면 ModbusMaster 라이브러리가 IDE에 추가되어 오류 없이 컴파일을 진행할 수 있을 것입니다.

     

     

     

     


     

    6. 동작 확인

    이제 코드와 하드웨어 연결이 완료되었으므로, BNC-MEC10 센서가 아두이노와 정상적으로 통신하고 있는지 확인해야 합니다. 확인 과정은 다음과 같이 진행됩니다:

     

    1. 시리얼 모니터 열기
      • 아두이노 IDE 상단 메뉴에서 도구 > 시리얼 모니터를 클릭하여 시리얼 모니터 창을 엽니다. 시리얼 모니터는 아두이노가 센서로부터 수신하는 데이터를 실시간으로 표시합니다.
      • 시리얼 모니터의 통신 속도를 설정할 때, 코드에서 설정한 Serial.begin(9600);에 맞춰 **9600 보드(bps)**로 설정되어 있는지 확인합니다.
    2. 데이터 확인
      • 시리얼 모니터에 출력되는 데이터가 온도, 수분 함량(VWC), 전도도(EC) 값으로 표시되는지 확인합니다. 각 값은 센서에서 전달된 원시 데이터를 바탕으로 변환되어 표시됩니다. 예를 들어:
         
        Temperature: 21.92 °C, Moisture: 37.31%, Conductivity: 590 μS/cm
         
    3. 오류 및 문제 해결
      • 만약 시리얼 모니터에 데이터가 나타나지 않거나 잘못된 값이 출력된다면, 아두이노와 MAX485 모듈, BNC-MEC10 센서 간의 배선 연결을 다시 확인합니다.
      • RE/DE 핀 제어 오류: 송수신 모드 전환이 제대로 작동하지 않으면, RS485_DE 및 RS485_RE 핀 제어 설정을 다시 검토합니다.
      • 시리얼 통신 오류: 시리얼 모니터 통신 속도가 9600 bps로 설정되어 있는지 확인하고, 필요시 Modbus 설정도 다시 확인합니다.

    이 과정을 통해 아두이노가 BNC-MEC10 센서로부터 데이터를 정상적으로 수신하고 있음을 확인할 수 있습니다.


     

    7. 마무리

    BNC-MEC10 센서를 활용한 프로젝트를 마무리하면서, 센서의 주요 데이터(온도, 수분, 전도도)를 실시간으로 모니터링하는 기능이 완성되었습니다. 이 프로젝트를 통해 사용자는 토양 상태를 실시간으로 파악하고, 필요할 경우 관개나 비료 관리를 조정할 수 있습니다. 특히, BNC-MEC10 센서의 다양한 측정 기능을 활용하여 정확한 농업 관리와 환경 모니터링을 할 수 있습니다.

    또한 이 프로젝트를 기반으로 더 복잡한 시스템으로 확장할 수 있으며, IoT 기능을 추가하여 데이터를 원격으로 모니터링하거나 클라우드 기반 데이터 저장 시스템을 구축하여 장기적인 토양 상태 분석도 가능합니다.

     

     

     

    반응형


    댓글