[아두이노] 자동토양물주기 원리

IOT/아두이노|2019. 7. 12. 22:07

[아두이노] 자동토양물주기 원리



지난 시간에 토양수분센서 측정기를 만들어 보았습니다. 오늘은 토양수분센서를 이용한 자동토양물주기 원리에 대해 살펴보고자 합니다. 실제 구현은 아래와 같은 모습이지만 모터펌프가 없고 DC모터로 간단히 동작을 실험하려고 했는데 차라리 가상시뮬레이터로 실험을 하여 post를 읽는 분들도 직접 실험에 참여할 수 있게 하는 방향으로 나가는게 좋을 것 같아서 간단히 가상시뮬레이터로 자동토양물주기 원리를 실험하는 것이 좋을 것 같아서 post의 방향을 변경했습니다.


위 그림처럼 디자인하고 제작했다면 좀 더 좋았을 텐데 준비물 화분과 워터펌프가 없어서 실제 구현은 못했네요.

오늘 post 실험은 자동토양물주기 원리를 이해하기인데 여기서 사용되는 부품은 조도센서와 DC모터입니다. 조도센서는 토양수분센서이고 DC모터는 모터펌프라는 가정하에 실험이 가상시뮬레이터에서 이루어 집니다. 실제로 가상시뮬레이터에서는 토양수분센서와 모터펌프를 제공하지 않기 때문에 조도센서와 DC모터를 통해 자동토양물주기 원리를 이해하는 시간이니깐 조도센서와 DC모터를 상상으로 토양수분선세와 모터펌프라고 머리속에 담아놓고 post를 보시기 바랍니다.

1. 자동토양물주기 회로도


  • 준비물 : LED 2개, 저항 200옴 2개, 저항 10k옴 1개, 조도센서, 릴레이모듈, 토양수분센서, 아두이노우노, 외부전원
  • 내용 : 아두이노우노 A0핀을 조도센서의 A0에 연결하고 LED를 각각 11,12핀에 연결한다. 그리고 릴레이모듈핀으로 7번에 연결한다.

아두이노 가상시뮬레이터에서는 토양수분센서를 제공하지 않습니다. 가상시뮬레이터에 실험하기 위해서는 대신 할 센서가 필요합니다. 실험에 사용할 센서는 조도센서입니다. 조도센서가 토양수분센서라는 가정하에서 가상으로 실험을 하기 때문에 감안하시고 글을 읽어주시기 바랍니다.


3. 코딩



LED, 조도센서, 릴레이모듈 등을 사용하기 위해서는 위 참고 자료를 한번 살펴보시 오시면 됩니다.

회로도의 기본 동작원리를 유사 post와 거의 90%이상 유사합니다. 차이점은 화분자동물주라는 코딩부분만 약간 차이가 있을 뿐 기본 베이스 코딩은 동일합니다. 아무튼 복습차원으로 이번 post를 공부하시기 바랍니다.

화분에 자동토양물주기를 가정하고 실험 코딩을 해보도록 하겠습니다.

[설계]

  1. 조도센서의 값의 따라 motor on/off 설정(조도센서을 토양수분센서로 가정)
  2. led를 이용하여 토양의 현재 상태를 시각적으로 표현
  3. 릴레이모듈을 이용하여 외부전원을 이용하여 motor를 회전(일반모터를 모터펌프로 가정)

설계는 3가지로 크게 나눠서 생각하게 되었습니다. 동작 원리는 가령 토양수분센서가 건조하여 수분이 없을 때 일정 센서의 일정 수치가 되면 모터펌프로 물을 공급을 하고 토양의 일정한 수분값을 갖게 되면 모터펌프를 중단하는 기본 동작이 코딩입니다. 이때 현재상태로 토양수분상태가 양호하면 Green LED가 켜지고 토양수분이 부족하면 Red LED에 불이 들어오게 하여 현재 상태를 시각적으로 보여주도록 하는 간단한 테스트입니다.

참고로, 모터는 릴레이모듈을 이용하여 motor의 외부전원을 사용하도록 하였습니다. 릴레이모듈은 스위치 역활을 하고 아두이노에서 스위치를 누르면 모터를 동작하고 해제하면 모터를 중단하는 느낌이라고 이해하시면 됩니다.

자~! 이제부터 설계할 3부분을 자세히 살펴 볼까요.

1) 조도센서의 값의 따라 motor on/off 설정


물을 자동으로 주기 위해서는 물을 주기위한 센서값에 도달했을 때 모터펌프로 화분에 물을 주도록 코딩해야 합니다. 어떻게 해야 할까요. 처음에는 정교한 코딩을 할 필요는 없습니다. 단순하게 생각하고 코딩하시면 됩니다.

m_cds = analogRead(cdsPin); //Sensor Read
if(m_cds>=물주기상태값){
  digitalWrite(motorPin, HIGH);
}else{
  digitalWrite(motorPin, LOW);
}

위와 같이 if문으로 간단히 코딩을 할 수 있습니다. 여기서, 조금 개선 시켜볼까요.

if(m_cds>=물주기상태값 && state==false){ //모터동작 체크
    state=true;
    digitalWrite(motorPin, state);
        timeVal=millis();
}else if(m_cds<=물중단상태값 && state==true){ //모터중지 체크
    if(millis()-timeVal>=2000){ //모터동작 최소유지시간 
      state=false;
      digitalWrite(motorPin, state);
    }           
}

위와 같이 timeVal(이전시간값)의 현재시간 millis()함수로 저장됩니다. 그 시간을 기준으로 모터가 최소 동작하는 시간을 2초로 잡았는데 이경우는 실제 실험에서는 적당한 시간을 잡아 주시면 됩니다. 가상 실험이니깐 대충 2초정도로 motor 동작하게 설정했습니다.

참고로, 모터동작이 시작되면 다음 loop()함수가 수행될 때 물공급 상태값과 물중단 상태값을 체크할 때 state를 조건문으로 추가했는데 이 조건문은 모터가 동작했을 때에 모터중단 동작을 수행하게 하기 위해서 추가한 조건문입니다. 물공급은 모터상태가 false(중지) 상태일 때 가동해야 하니깐 false인지 확인하고 물중단이면 state은 가동중단 해야하니깐 true인지 확인해야 합니다. 물공급/물중단 상태를 나타내는 토양수분센서값으로 비교하지만 같이 현재 Motor상태도 비교하면 중복 반복되는 동작을 줄일 수 있습니다.

2) led를 이용하여 토양의 현재 상태를 시각적으로 표현


센서의 값으로 모터를 동작을 제어했지만 시각적으로 현재 상태를 확인하기가 애매합니다. 그래서 LED 2개로 현재 토양상태를 표현해 봅시다.

[토양수분충분상태]

digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);

[토양수분부족상태]

digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);

위 두가지 조건을 어디에 코딩해야 할까요.

if(m_cds>=물주기상태값 && state==false){ //모터동작 체크
  토양수분충분상태;
}else if(m_cds<=물중단상태값 && state==true){ //모터중지 체크
  토양수분부족상태;
}

위 코딩 위치에 위 상태 코딩을 넣으시면 됩니다.

3) 릴레이모듈을 이용하여 외부전원을 이용하여 motor를 회전


모터는 아두이노에서 전원으로 돌리는 것은 문제가 있습니다. 그래서 외부전원을 사용하여 motor를 동작시켜야 하는데 이경우는 여러가지 방법이 있습니다.

첫번째, 트랜지스터를 이용하여 motor를 동작시키는 방법

두번째, 모터쉴드를 이용하여 motor를 동작시키는 방법

세번째, 릴레이모듈을 이용하여 motor를 동작시키는 방법

세번째의 경우는 전구 대신에 motor로 교체하시면 됩니다. 릴레이모듈을 제어하기 위해서 릴레이핀의 상태값으로 motor를 제어하게 됩니다.

digitalWrite(motorPin, HIGH); //동작

digitalWrite(motorPin, LOW); //정지

릴레이 모듈이 좀 햇갈리시면 위 링크 걸어놓은 post에 가셔서 한번 원리를 이해하시고 오세요.

위 설계된 내용을 종합하여 코딩하면,

const byte cdsPin = A0;
const byte redPin = 12;
const byte greenPin = 11;
const byte motorPin = 7;

unsigned long timeVal = 0; //이전시간
unsigned long checkTime = 0;
boolean state = false; //모터상태값

int m_cds =0; //센서값 변수

void setup()
{
  Serial.begin(9600);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(motorPin, OUTPUT);
  
  //초기상태
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
}

void loop()
{
  if(millis()-checkTime>=1000){ //1초단위로 센서읽기
    m_cds = analogRead(cdsPin); //Sensor Read
    Serial.println(m_cds);
    checkTime=millis();
  }
  
  if(m_cds>=960 && state==false){ //모터동작 체크
    state=true;
    digitalWrite(motorPin, state);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW); 
    timeVal=millis();
  }else if(m_cds<=60 && state==true){ //모터중지 체크
    if(millis()-timeVal>=3000){ //모터동작 최소유지시간 
      state=false;
      digitalWrite(motorPin, state);
      digitalWrite(redPin, LOW);
      digitalWrite(greenPin, HIGH); 
    }
  }
}

센서값을 모터 동작값으로 960이상으로 가상으로 설정했고, 모터 중지값으로 60이하로 설정했습니다. 나머지는 위에 설명한 부분을 합쳐놓은 코딩이니깐 어렵지 않을거라 생각합니다.

4. 결과


조도센서를 토양수분센서로 가정했기 때문에 조도센서를 토양수분센서라고 상상하시고 동작을 이해해 주시기 바랍니다. 조도센서가 960이상이되면 Red LED에 불이 들어고 DC모터가 동작하게 하게 됩니다. 그리고 일정시간(3초)동안은 최소 동작하게 하고 조도센서값이 60이하이고 최소 동작시간이 지나게 되면 Green LED에 불이 들어오고 DC모터가 정지됩니다.

위 코딩에서 모터동작/정지에 사용되는 제어값 960과 60은 가정하에서 설정한거라 실제 토양에서의 수분값은 측정해보고 물주는 토양수분상태값을 정하시고 위 코딩에서 수정하시면 됩니다. 그리고 모터동작을 최소 3초동안 동작하게 했는데 이 경우도 토양에 물주는게 딱 3초로 할 수 없습니다. 실제로는 일정이상의 시간으로 물을 줘야하는데 water pump의 물을 끌어올리는 양을 기준으로 테스트해보고 이정도의 시간으로 물을 주면 되겠다 싶은 정도의 시간을 water pump로 실제 물을 주면서 시간을 측정해 놓고 위 코딩에서 시간값을 수정하시면 됩니다.

그리고, 위 코딩에서 센서값을 읽은 if문안에 나머지 모터동작 코딩을 넣으셔도 됩니다. 센서의 읽은 값을 기준으로 모터의 동작을 결정하게 되기 때문입니다. 외부로 뺀 이유는 따로 몇가지 추가할 경우 별도의 동작을 체크할 일을 감안하여 외부로 모터 동작 if문을 뺐놓은 것일뿐 여러분들은 안에서 넣을지 뺄지는 알아서 판단하시고 코딩을 배치하시면 됩니다.


5. 진짜 자동토양물주기 회로도




대충 지금까지 다뤘던 것들을 종합해서 회로도로 만들어 보았네요. 토양수분 측정기의 회로도에 추가로 bluetooth를 연결해 보았고 모터펌프는 이미지를 못찾아서 그냥 DC모터로 표현했네요. [아두이노] 토양수분 측정기의 회로도와 오늘 배웠던 회로도를 결합해 보았네요.

위 회로도는 토양수분센서 값을 따라 Motor를 동작을 제어를 기본으로 하는데 추가로, 토양수분센서의 값을 LCD16x2에 출력할 수 있고 현재 상태를 LED로 확인이 가능하고 Bluetooth로 스마트폰에 센서값을 출력이 가능합니다.

코딩은 오늘 배운 코딩과 토양수분측정기 코딩을 합치고 시리얼통신 코딩 부분을 bluetooth 통신 코딩형태로 변경하면 됩니다.

코딩부분은 post에 올리지 않겠습니다. 한번 오늘 배웠던 내용을 기반으로 LCD16x2 I2C모듈과 Bluetooth 모듈만 추가 되었으니깐 그 부분만 상상해서 코딩을 하시면 됩니다. 난이도를 살작 올렸습니다. 이번 post에서 회로도만 보시면 코딩을 상상할 수 있는지 보기 위해서 코딩부분은 생략했습니다. 각 부품이 주어질 때 이 부품은 어떻게 제어할 수 있는지와 이 부품에 어떤 출력을 할 것인지는 여러분들의 상상에 맡기겠습니다.

마무리


오늘은 가상시뮬레이터에서 조도센서를 이용하여 Motor 동작을 제어하는 실험을 하였습니다. 가상시뮬레이터로 실험한 이유는 여러분들도 한번 동작 원리를 체험을 해보셨으면 하는 맘으로 표현 했네요. 위 실험을 실제로 실험해 봐야 하는데 모터펌프가 없네요. DC모터로 대신해서 실험해도 되지만 RC카에 조립된 DC모터를 다시 분해해서 만들기가 좀 그래서 구현된 실제 모습은 없습니다. 실제 구현을 안하더라고 가상시뮬레이터로 충분히 의미를 전달할 수 있기 때문에 오늘 내용은 가상시뮬레이터로만 실험을 마무리 하겠습니다.

오늘 내용은 조도센서는 토양수분센서이고 DC Motor는 모터펌프라고 가정하에 실험한 post 입니다. 간단하게 동작 제어만을 실험한 것이라 추가로 좀더 상황을 만들어 업그레이드를 해야 좀 더 완벽한 자동토양물주기 시스템이 도비니다. 이부분은 여러분들의 상상력을 발휘하는 부분으로 남겨 놓겠습니다. 상상은 전류 공급문제, 자동토양물주기 모형틀, 추가 연동 할 부품 등을 여러분들이 상상해서 한번 업그레이드 시켜 보세요.


댓글()