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

[아두이노][센서] SEN0193 토양 수분 측정 센서로 실시간 토양 수분 모니터링 프로젝트

by 로니킴 2024. 11. 11.


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

 

목차

     

     

     


    SEN0193 센서로 실시간 토양 수분 모니터링 

    SEN0193 토양수분센서를 활용한 아두이노 프로젝트는 실시간으로 토양의 수분 상태를 모니터링할 수 있는 효율적인 솔루션을 제공합니다. 이 프로젝트를 통해 아두이노와 센서를 연결하고, LCD를 통해 측정 결과를 직관적으로 표시하는 방법을 배웠습니다. 특히, 정전 용량 방식을 사용하는 SEN0193 센서는 내구성이 강하고 안정적이며, 이를 통해 식물 관리, 스마트 농업 등 다양한 환경 모니터링 프로젝트에 응용할 수 있습니다. LCD 화면을 통해 사용자는 건조, 습기, 물속 상태를 쉽게 확인할 수 있으며, 필요한 경우 기준 값을 조정하여 환경에 맞게 사용할 수 있습니다. 이 경험을 바탕으로 아두이노를 활용한 자동화 시스템과 다양한 센서 응용 프로젝트로 확장할 수 있습니다.


     

    1. SEN0193 토양수분센서란? 

    SEN0193 토양수분센서는 전도도가 아닌 정전 용량(Capacitive) 방식을 사용하여 토양 내 수분을 감지하는 센서로, 습도에 민감하게 반응하여 높은 정확도를 제공합니다. 이 센서는 부식에 강한 재질로 제작되어 내구성이 높고, 토양에 오랫동안 삽입하여 사용할 수 있어 긴 수명을 자랑합니다. 3.3~5.5V의 낮은 전압에서 동작하기 때문에 아두이노, 라즈베리파이 등의 다양한 마이크로컨트롤러와 쉽게 호환됩니다. 다만, 라즈베리파이와 같은 아날로그 입력을 지원하지 않는 기기와 연결할 때는 ADC 변환기가 필요합니다.

     

     

    이 SEN0193 센서는 Gravity I/O 확장 쉴드와의 호환성을 제공하여 아두이노와 간단하게 연결할 수 있으며, 외부에 LED나 LCD와 같은 모듈을 함께 사용해 직관적인 수분 상태를 시각화하는 용도로 많이 사용됩니다. 사용자는 이 센서를 식물 주변 토양에 삽입하여 실시간으로 토양의 수분 상태를 측정할 수 있습니다. 농업 자동화, 스마트 가드닝 등의 프로젝트에서 주로 사용되는 만큼, 환경 모니터링이 필요한 다양한 분야에서 활용 가능성이 큽니다​.


     

     

    2. SEN0193 토양수분센서의 동작 원리 

     

    SEN0193 센서는 토양 내 수분량을 감지하기 위해 정전 용량 원리를 사용합니다. 정전 용량 방식은 주변 환경의 습기에 따라 센서의 전도율이 달라지는 원리를 이용하며, 이 변화는 아날로그 신호로 출력됩니다. 일반적인 저항성 센서와 달리, 정전 용량 방식은 전극이 노출되지 않아 센서의 부식을 방지할 수 있습니다. 이를 통해 센서의 수명을 연장하면서도 안정적인 측정을 가능하게 합니다.

     

     

    이 센서는 토양이 건조할수록 높은 아날로그 값을, 수분이 많을수록 낮은 아날로그 값을 출력하는 방식으로 동작합니다. 아날로그 출력은 0~3V 범위로 제공되며, 아두이노의 아날로그 입력 핀(A1)을 통해 수분량을 측정할 수 있습니다. 측정된 아날로그 값은 소프트웨어로 처리되어 수분 상태를 '건조', '습함', '물속'과 같은 다양한 상태로 구분할 수 있습니다. 예를 들어, 일반적인 설정으로 520이 건조한 토양의 기준값, 260이 매우 습한 토양의 기준값으로 사용됩니다. 사용자는 센서를 토양에 삽입하여 이러한 값의 범위 안에서 수분 상태를 모니터링하고, 필요에 따라 자동 급수 시스템과 같은 추가 기능을 구현할 수 있습니다​.


     

     

    3. 구입하기

    SEN0193 토양수분센서는 국내외 다양한 쇼핑몰에서 구매할 수 있습니다. 네이버 쇼핑에서는 5,000원에서 7,000원대에 판매되고 있으며, 알리익스프레스에서는 배송료 포함 약 3,000원에서 5,000원 사이에서 구매할 수 있습니다. 구입 시 센서의 민감도와 품질을 고려하여 신뢰할 수 있는 판매처에서 구매하는 것이 좋습니다.

     


     

     

    4. 하드웨어 연결하기

    SEN0193 토양수분센서를 아두이노와 연결하는 과정은 비교적 간단합니다. 다음은 기본적인 연결 단계입니다:

     

    1. 아날로그 출력 연결
      아두이노의 A1 아날로그 핀을 SEN0193 센서의 AOUT 핀에 연결합니다. 이를 통해 센서에서 출력된 아날로그 신호를 아두이노가 읽을 수 있습니다.
    2. 전원 연결
      SEN0193 센서는 3.3V에서 5.5V 사이의 전압에서 동작할 수 있습니다. 아두이노의 5V 핀을 SEN0193의 VCC 핀에 연결하여 전원을 공급합니다.
    3. GND 연결
      아두이노의 GND 핀을 SEN0193의 GND 핀에 연결하여 회로의 기준 전압을 맞춥니다.
    4. LCD 쉴드 연결
      LCD 실드(16x2)는 아두이노의 상단에 장착되며, LCD 실드의 A1 아날로그 핀이 SEN0193의 AOUT 핀과 연결되어 토양 수분 데이터를 LCD에 표시할 수 있습니다.

    연결이 완료되면 아두이노와 SEN0193 토양수분센서, 그리고 LCD 쉴드 간의 하드웨어 설정이 끝납니다. 이 구성을 통해 실시간으로 토양 수분 상태를 모니터링할 수 있습니다.

     

    아두이노 UNO와 SEN0193 센서, 그리고 LCD 쉴드는 모두 5V에서 안정적으로 작동하기 때문에 호환성에 문제가 없습니다. 그러나 아날로그 출력값이 정확히 측정되기 위해 센서의 캘리브레이션이 필수적입니다. SEN0193의 캘리브레이션은 공기 중의 값과 물에 담긴 상태의 값을 기준으로 설정하여, 토양의 습도 상태를 정확하게 측정할 수 있습니다​.


     

     

    5. 소프트웨어 코딩하기

     

    센서를 제어하기 위한 소프트웨어 준비 과정은 다음과 같은 단계로 이루어집니다

     


    01 연결

    - 아두이노와 PC 연결

    - 아두이노 IDE 실행

    - 메뉴 → 툴 → 보드:아두이노 UNO 확인

    - 메뉴 → 스케치 → 확인/컴파일

     

    02 컴파일 확인

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행합니다.

     

    03 아두이노 우노 업로드

    컴파일이 이상없이 완료되면 스케치> 업로드(CTRL+U)를 선택해서 컴파일 파일을 업로드합니다.

     

    04 동작 확인

    센서의 동작을 확인할 수 있습니다.

     

     

    #include <LiquidCrystal.h>  // LCD 라이브러리 포함
    
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // LCD 핀 설정 (RS, E, D4, D5, D6, D7)
    
    const int soilSensorPin = A1;  // SEN0193 센서가 연결된 아날로그 핀
    int soilMoistureValue;         // 토양 수분 값을 저장할 변수
    
    void setup() {
      pinMode(soilSensorPin, INPUT);  // 센서 핀을 입력으로 설정
      initializeLCD();                // LCD 초기화 함수 호출
    }
    
    void loop() {
      measureSoilMoisture();  // 토양 수분 측정 함수 호출
      displaySoilMoisture();  // LCD에 토양 수분 상태 표시 함수 호출
    }
    
    // LCD 초기화 함수
    void initializeLCD() {
      lcd.begin(16, 2);             // LCD 크기 설정 (16x2)
      lcd.setCursor(0, 0);          // 첫 번째 줄 첫 번째 칸으로 커서 이동
      lcd.print("SEN0193 SOIL");    // LCD에 초기 메시지 표시
      lcd.setCursor(0, 1);          // 두 번째 줄 첫 번째 칸으로 커서 이동
      lcd.print("Initializing..."); // 초기화 중 메시지 표시
      delay(1000);                  // 1초 대기
      lcd.clear();                  // 초기 메시지 지우기
    }
    
    // 토양 수분 측정 함수
    void measureSoilMoisture() {
      soilMoistureValue = getAverageReading(soilSensorPin);  // 평균 측정 함수 호출
    }
    
    // 아날로그 핀에서 평균 값 읽기 함수
    int getAverageReading(int pin) {
      const int sampleCount = 10;   // 샘플링 횟수
      int total = 0;                // 총합 초기화
    
      for (int i = 0; i < sampleCount; i++) {
        total += analogRead(pin);   // 아날로그 값 읽어서 누적
        delay(20);                  // 20ms 대기 (잡음 제거)
      }
      
      return total / sampleCount;   // 샘플링 평균 반환
    }
    
    // LCD에 토양 수분 상태 표시 함수
    void displaySoilMoisture() {
      lcd.clear();                  // 화면 지우기
      lcd.setCursor(0, 0);          // 첫 번째 줄 첫 번째 칸으로 커서 이동
      lcd.print("Moisture: ");
      lcd.print(soilMoistureValue); // 측정된 토양 수분 값 출력
    
      // 수분 상태에 따른 메시지 표시
      lcd.setCursor(0, 1);          // 두 번째 줄 첫 번째 칸으로 커서 이동
      if (soilMoistureValue > 520) {
        lcd.print("DRY SOIL");      // 건조 상태
      } else if (soilMoistureValue > 430) {
        lcd.print("HUMID SOIL");    // 습함 상태
      } else if (soilMoistureValue > 260) {
        lcd.print("IN WATER");      // 물 속 상태
      }
    }

     

     

    코드 설명

    1. 변수 선언:
      • soilSensorPin: 토양 수분 센서가 연결된 아날로그 핀 (A1).
      • soilMoistureValue: 측정된 토양 수분 값을 저장하는 변수.
    2. setup() 함수:
      • 센서 핀을 입력으로 설정하고 LCD 초기화 함수(initializeLCD())를 호출하여 LCD를 준비.
    3. loop() 함수:
      • 토양 수분을 측정하는 measureSoilMoisture() 함수와 LCD에 수분 상태를 출력하는 displaySoilMoisture() 함수를 반복 호출하여 센서 데이터를 실시간으로 갱신.
    4. initializeLCD() 함수:
      • LCD 초기 메시지를 설정하여, 센서가 준비 상태임을 사용자에게 안내합니다.
    5. measureSoilMoisture() 함수:
      • 센서로부터 수분 값을 읽어오며, getAverageReading() 함수를 호출하여 측정값의 평균을 계산해 soilMoistureValue에 저장.
    6. getAverageReading() 함수:
      • 지정된 핀에서 다수의 샘플을 읽어 평균을 계산하여, 측정값의 정확성을 높임.
    7. displaySoilMoisture() 함수:
      • 측정된 토양 수분 값을 LCD에 표시하며, 각 수분 상태에 따라 'DRY SOIL', 'HUMID SOIL', 'IN WATER' 등으로 상태를 안내합니다.

     

    동작 순서도에 따른 코드 설명

    1. 초기 설정 (Setup)
      프로그램이 시작되면 setup() 함수가 한 번 실행됩니다. 이 함수에서 아두이노는 토양 수분 센서 핀(soilSensorPin)을 입력으로 설정하고, initializeLCD() 함수를 호출해 LCD 화면을 초기화합니다. LCD에는 초기 메시지("SEN0193 SOIL"과 "Initializing...")가 표시되어 센서가 준비 중임을 안내합니다. 초기화 후 1초 대기(delay(1000)) 후 메시지를 지워 LCD가 새롭게 데이터를 표시할 준비를 합니다.
    2. 반복 루프 (Loop)
      loop() 함수는 아두이노가 실행되는 동안 지속적으로 반복됩니다. 여기서 measureSoilMoisture() 함수와 displaySoilMoisture() 함수가 순차적으로 호출됩니다.
      • 토양 수분 측정 (measureSoilMoisture)
        measureSoilMoisture() 함수는 토양 수분 센서에서 아날로그 값을 읽고 이를 soilMoistureValue에 저장합니다. 이때, getAverageReading() 함수가 호출되어 핀에서 여러 번 값을 읽고, 그 평균값을 반환하여 값의 정확도를 높입니다. 이 평균값이 최종적으로 soilMoistureValue에 저장되어, LCD에 표시될 준비가 됩니다.
    3. LCD에 수분 상태 표시 (Display)
      displaySoilMoisture() 함수는 LCD를 통해 측정된 수분 값을 사용자에게 시각적으로 표시합니다. 이 함수는 다음과 같은 단계를 통해 LCD를 업데이트합니다.
      • LCD 화면 업데이트
        LCD 화면을 초기화한 후, 첫 번째 줄에 "Moisture:" 텍스트와 함께 soilMoistureValue 값을 출력합니다. 이 값은 현재 토양의 수분 상태를 나타내며, 사용자에게 직접적인 데이터를 제공합니다.
      • 상태에 따른 수분 상태 표시
        soilMoistureValue 값에 따라 LCD의 두 번째 줄에 수분 상태를 문자로 표시합니다. 측정된 값이 건조 범위(예: 520 이상) 일 경우 "DRY SOIL", 습기 범위 일 경우 "IN WATER"라는 메시지가 나타납니다. 이를 통해 사용자는 토양의 상태를 한눈에 확인할 수 있습니다.
    4. 반복 측정
      loop() 함수는 계속 반복되므로, 토양 수분 값이 실시간으로 업데이트됩니다. 센서는 현재 토양 상태에 따라 계속해서 수분 상태를 측정하고 LCD에 표시하여, 토양이 건조하거나 습할 때 바로 알 수 있습니다.

     


     

    6. 동작 확인

     

    SEN0193 토양수분센서와 LCD 실드가 제대로 작동하는지 확인하기 위해 아두이노에 코드를 업로드한 후 실험을 진행합니다. 먼저, 아두이노와 PC를 USB 케이블로 연결하고, 아두이노 IDE에서 코드를 업로드합니다. 업로드가 완료되면 LCD 화면에 "SEN0193 SOIL" 메시지가 잠시 표시된 후 사라지면서 센서가 측정을 시작하게 됩니다. LCD에는 실시간으로 측정된 토양의 수분 값이 나타나며, 이 값은 설정된 범위에 따라 "Give me Water!!" (건조 상태), "Moisture OK" (적정 상태), "Water Enough!!" (충분한 물)이라는 메시지로 출력됩니다.

     

     

     

    테스트를 위해 센서를 토양에 삽입하지 않고 공기 중에 둬서 건조 상태에서의 값을 확인하고, 물이 담긴 컵에 센서를 담가 수분 상태 변화를 관찰할 수 있습니다. LCD에 표시되는 값이 예상한 범위와 일치하는지 확인하여, 각 상태별 메시지가 올바르게 나타나는지 점검합니다. 만약 측정된 값이 예상 범위를 벗어난다면, 코드 내의 수분 상태 기준 값을 다시 설정하여 정확한 측정을 보장합니다. 이 과정을 통해 센서와 LCD의 정확한 동작을 확인할 수 있습니다.

     

     


     

     

    7. 마무리

    이번 프로젝트를 통해 SEN0193 토양수분센서를 활용하여 실시간으로 토양의 수분 상태를 측정하고, LCD 화면에 직관적인 메시지를 표시하는 방법을 배웠습니다. 이 프로젝트는 식물 관리, 스마트 가드닝 및 농업 자동화와 같은 다양한 분야에 적용될 수 있습니다. 초보자도 쉽게 접근할 수 있도록 단계별로 설명하였으며, 코드를 직접 수정해 보거나 센서의 기준 값을 조정하여 다양한 환경에서의 활용 가능성을 탐구할 수 있습니다.

     

    이 프로젝트를 확장하여, 센서 값을 바탕으로 자동 급수 시스템을 구현하거나, 무선 통신 모듈을 추가하여 원격 모니터링 시스템을 구성할 수도 있습니다. SEN0193 센서와 아두이노를 활용한 이번 경험을 바탕으로 더 다양한 센서를 사용해 환경 모니터링 시스템을 구축해 볼 수 있을 것입니다.

    https://youtu.be/wohwz5s7YNE?t=2

     

     

    반응형


    댓글