본문 바로가기

아두이노/IoT 아두이노 프로젝트!

[Part 3] 쉽게 화분 키우기 !!(스마트 농장)

모든 센서를 구현할 시간이 부족하다.. 그래서 몇가지 센서를 빼고 최종 Smart plant를 마무리 지으려고 한다.

최종적으로 위 센서들을 Cloud서버로 전송하고 Cloud에서 위 모듈 및 센서를 제어할 수 있다.


그 전의 Part 1과 Part2의 각 센서의 설명은 아래 링크에 있으니 참고해주길 바란다.

아두이노를 이용한 Smart plant(farm) Part.2: http://openstory.tistory.com/54

아두이노를 이용한 Smart plant(farm) Part.1: http://openstory.tistory.com/53


아래 품목들이 Smart plant에 사용된 최종 품목이다.


 Component List

 1. WizArduino 2ea (12V input, 3.3V operation)

 2. PM1001, 먼지 센서(Dust Sensor)

 3. DHT22, 온습도 센서(Temperature & Humidity)

 4. 레인 센서(Rain)

 5. 모이스처(수분) 센서(Moisture Sensor)

 6. DWP-385 WATER PUMP (DC Motor)

 7. Transistor 2ea (Relay 제어)

 8. Relay 2ea (5V input, maximum 220V)

 9. DC FAN motor (12V input)


1. Dust Sensor (PM1001)

먼지 센서는 엘레파츠에서 구매하였다. (알리 익스프레스가 훨씬 싸겠지만.. 빨리 구매하려고 엘레파츠에서 구매하였다.)

설명하기 이전에, PM1001을 사용한 느낀점을 잠깐 말해주면, 크게 믿을 건 못된다? 라는 느낌이었다.

생각보다 센서의 오동작(?)인지, 오차가 큰건지 모르겠지만 굉장히 값이 들쑥날쑥하다.

내 자리가 먼지가 많이 쌓여있는건지는 모르겠지만;; 굉장히 값이 왔다갔다 거린다.. 이 점 참고해서 사용해주기 바란다.

(이건 다른 센서도 피차 마찬가지라고 본다.)


개요부터 설명하자면, 먼지 센서(dust sensor)는 광 산란 방식을 이용해서 단위 체적당의 입자수량에 따라 펄스 출력을 얻어 사용한다.

위 말은 처음에 보면 이해가 안된다. 간단하게 설명하면, 아래 그림이 되겠다.

즉, 오른쪽 그림을 보면 먼저 Inlet쪽으로 먼지가 들어오면 적외선(IR LED)을 이용하여 광을 쏘게 된다. 그러면 이때 적외선이 각 먼지 입자와 맞닿으면서 산란이 된다. (반사와는 다른 개념)

그래서 그 산란광을 이용하여 적외선 값을 읽고 이를 증폭기로 증폭해서 펄스파형으로 출력한다.

솔직히 이게 다다.. 나머지는 제작한 회사의 기밀이라고 알려줄 수 없다고 하니, 우리는 동작 원리만 알면 되겠다.

실제로, 내가 센서로 data를 보내면 센서는 그냥 먼지 값 읽어서 보내주는 것 밖에 없다. 따라서 값의 오차가 이상하거나 이상한 값이 읽히면, 다음의 2가지 경우가 문제일 가능성이 있다.

1. 잘못된 Data를 보냈을 경우

2. 센서가 문제인 경우

  

<먼지 센서 동작 개요>


다음으로는 센서 내부의 구성도와 Block diagram이다. 왠만한 먼지 센서는 아래와 같이 구성되어 있다.

아래 왼쪽은 먼지센서의 내부 구성도이다. 위 빨간글씨에서 설명한 바와 같이, Intake 방향으로 먼지가 들어오면, Resistor(Heating Element)에서 열이 발생한다. (상승 기류) 그래서 먼지는 위 상승 기류를 타고 올라가게 되는데, 이 때 적외선 LED에서 적외선을 발사하고 이게 먼지와 맞닿아서 산란이 발생한다. 그래서 산란된 적외선을 Photodiode Detector에서 값을 읽어 이를 증폭하여 펄스파형으로 출력하게 된다.


  

<먼지 센서 내부 구성도>                                                <먼지 센서 Block Diagram>


PM1001은 UART 통신으로 모듈을 제어한다.

즉, 정해진 데이터 포맷을 센서로 보내면, 센서가 알아서 측정해서 응답 데이터를 보내주게 된다.

그 데이터는 아래와 같다. 아래의 데이터 포맷대로 센서로 데이터를 Send하면, 센서로 부터 Response를 받게된다.

그리고 아래에 Ex) 부분 처럼 데이터가 들어오게 된다.


Send[IP] [LB] [CMD] [DF] [CS]
[IP] address
fixed as 11)。
[LB] byte length followed does not include CS
[CMD] command
[CS] CS=
-(IP +LB+CMD
Response
aWhen the command is implemented correctly, it responses
[ACK] [LB] [CMD] [DF] [CS]
[ACK]=0X16 right command
[LB] byte length followed does not include CS
[CMD] command
[CS] CS=
-(ACK +LB+CMD

Ex)

SEND : 0x11, 0x01, 0x01, 0xED

Response : 0x16, 0x0D, 0x01, (4BytePM), (4BytePM), (4Byte PM), [CS] (1byte)


아두이노와 연결은 아래 그림과 같다.

위 연결도는 PM1001을 구매한 곳에서 제공한다.


위와 같이 연결했다면, 이제 구동할 차례이다. 

코드는 아래 사이트에서 다운로드 가능하다.

http://diwellshop.com/product/%EB%A8%BC%EC%A7%80%EC%84%BC%EC%84%9C-pm1001-%EC%BB%A4%EB%84%A5%ED%84%B0-%ED%8F%AC%ED%95%A8/172/

동작 설명 및 Datasheet도 있으니 같이 확인하면 될 것 같다.

아래 사진은 PM1001을 제작한 회사에서 제공해준 결과 값이다. 근데 나중에 구현해보면 알겠지만 이렇게 값이 나오지 않는다. 굉장히 값이 들쑥날쑥 하다.

그래서 위 부분은 따로 문의를 해봐야 할 것이다. (근데, 전화해봤자 본사로 연결해서 기술적인걸 물어보지 않는 이상 대충 대답해줄 것이니, 확실히 공부하고 문의하는 것을 추천한다.)


2. DC FAN (12V input)

 DC FAN은 PC(computer)에 부착되어 있는 발열 방지용으로 많이 사용된다. (혹은 환기용)

단순 모터를 제어하는 것과 원리는 같다. 다만, 모터보다는 많은 전류를 땡겨가지는 않는 것 같다. (실제 동작시켜보니)

모터의 원리는 아래 블로그를 참조 바란다.

http://dokkodai.tistory.com/103


DC FAN을 추가한 이유는 Dust 먼지센서로 부터 먼지 값을 읽었을 때, 미세먼지 및 기타 안좋은 공기를 배출하여 환기를 시키는 용도로 부착하게 되었다.

그래서 먼지 값을 클라우드로 수시로 확인하고, FAN을 동작시켜서 환기를 시키는 것을 목적으로 하며, 이를 나중에 다른 센서들과 혼합하여 동작하게 된다.


DC FAN은 트랜지스터와 Relay를 사용하여 동작시켰다. 아무래도 12V 동작이다 보니, 아두이노의 전압/전류 로는 동작시킬 수가 없다.

동작 회로는 아래와 같다. 12V의 외부 전원과 Motor의 VCC를 COM측에 연결하고, NO측에 motor의 GND와 전체 GND(아두이노의 GND)와 연결한다.

그러면 아두이노의 GPIO에 연결된 트랜지스터의 B(Base)에 High(3.3V or 5V)를 인가하면 트랜지스터는 ON되면서 5V가 트랜지스터의 C와 E 방향으로 흘흘러내린다. 이 때 릴레이는 동작하면서 COM의 스위치가 NO와 연결되면서 Motor는 동작한다.

Relay 및 Transistor의 설명을 보고 싶으면, 아래 페이지를 참조바란다.

http://openstory.tistory.com/53



3. Final Configuration

DC FAN까지 동작이 완료되었다면, 이제 다른 센서들과 전부 합쳐서 하드웨어 구성을 한다.

최종 구성도는 아래와 같다.


위 최종 구성도를 화분에 적용시킨 것이 아래 그림이다.

각 센서들을 구현해서 아래와 같이 구성하였다. 원래대로라면 케이스를 제작해서 FAN을 부착하고 워터펌프를 연결해야겠지만,

케이스까지는 시간이 걸릴 것으로 예상되므로 패스한다.


4. Source Code & Cloud

마지막으로 구동 소스 코드와 사용한 클라우드이다.

사용한 클라우드는 Ubidots라는 클라우드이다.

클라우드 사용법은 아래 링크를 확인하여 사용하면 된다.

http://openstory.tistory.com/57


위 설명대로 진행해서 클라우드에 가입하여 Source의 Variable을 생성했다면, 거기에 사용되는 Variable ID 및 Token 2가지만 사용한다면, 클라우드를 사용할 수 있다.


사용법은 코드를 참조바란다. 실제 Variable 및 Token ID를 코드에 등록하고 그대로 사용하는 것 밖에 없다.

그리고 이는 아두이노를 사용하여 통신하게 된다.

코드는 2가지 타입이 있다. Arduino Mega용과 WizArduino용이다.

왜 2가지로 나누었냐면, 2개의 동작이 조금 다르다.

WizArduino의 경우 Cortex-M0가 Main core이기 때문에, IDE는 무조건 org tool을 사용해야 한다.

그리고 코드가 조금 다르다. Arduino uno 및 mega의 경우 UART를 사용할 때, Serial.begin() 이렇게 사용을 하는데, WizArduino의 경우 SerialUSB.begin()

으로 사용을 한다.


클라우드 동작은 아래 그림과 같다. Dashbord를 활용해서 모듈로 부터 온/습도 값, 수분, 먼지의 값을 받아와서 클라우드에서 확인할 수 있으며, 워터 펌프와 DC 모터를 클라우드에서 ON/OFF가 가능하다. rain은 비가 오는지 안오는지 확인하는 용도로 부착하였다.

만약 비가 온다면, 비가 오는 아이콘으로 변경된다.



위와 같이 최종적으로 Smart plant가 완성되었다. 다만, 이를 양산목적으로 제작하기 위해선 다른 절차가 필요하다.

회로를 PCB로 제작해야되고, 클라우드도 다른걸로 변경해야한다. (Ubidots는 취미 목적으로 사용하는 것이 좋을 것 같다.)

최종 소스 코드는 아래 코드를 받아서 사용하면 된다.


Ubidots_Ethernet_sensor_Finish_WizArduino_v2.ino

Ubidots_Ethernet_sensor_Finish_MEGAv2.ino