반응형

WiFi 기능이 있는 D1 mini 를 사용한 스마트 화분을 만들어 볼게요.
이번에 다루는 내용(목차)입니다.


이번 스마트 화분은 WiFi를 활용하고 미니 사이즈로 만들어 실용성을 높여 제작하였습니다.
ThingSpeak라는 IoT 클라우드 서버를 활용하는 방법에 대해서도 다루고 있으니 여러 방면으로 도움이 되실 듯 합니다.


1. 주요 부품별 특징과 개요 

 ① D1 mini

 D1 mini의 실제 크기 비교입니다.

D1 mini의 가장 큰 장점은 크기가 작고  WiFi 기능을 사용하면서도, esp-01 모듈보다 여유 있는 입출력 포트와 함께 강력한 성능을 발휘한다는 점입니다.

D1 mini 스펙

3.3V 전원을 사용하는 무선통신 모듈이나 OLED등 여러 모듈들과 전원을 연계하기가 편하며, 3.7V 리튬 배터리로도 구동 가능하여 제품의 사이즈를 작게 만들 수 있습니다.

기존 자료에 PWM기능핀을 표시하였습니다

 ② 토양 습도 센서

  토양습도 센서의 스펙입니다.

토양수분 센서는 측정 단자로 전류를 흘려서 되돌아오는 전류량으로 저항값을 알아내고 모듈의 A0 단자를 통해 저항값에 대응하는 0~4.2V 사이의 전압을 출력해 주는 모듈입니다.


이 전압 값을 우노 보드의 경우 10bit의 분해능을 가진 아날로그 A0 포트로 입력받으면 10 bit (2의 10승), 즉 0~1024의 데이터로 처리할 수 있게 됩니다.
그럼, code에서는 'if'와 같은 '비교문'으로 입력 값에 따라 모터를 돌리거나 멈추게 하면 됩니다.

 ③ OLED (Organic Light Emitting Diodes)

클릭 후, 확대하여 보세요


  OLED는 통신방식에 따라 'I2C' 타입과  'SPI' 타입으로 나뉘는데요, 위 이미지와 같은 장단점이 있으며, 보통 선 연결이 간단한 'I2C' 타입을 많이 선호하고 있습니다.  여기에서도 'I2C' 타입으로 진행하고자 합니다. 

우노와 I2C OLED를 연결한 예시입니다

 ④ AMS1117 (3.3V 출력용)

AMS1117레귤레이터는,  3.3V 정전압 출력용이 있고, 5V 정전압 출력용이 있습니다. 
먼저 레귤레이터란, 입력 전압에 상관없이 출력 전압을 일정하게 고정시켜 주는 것을 말하는데요, AMS1117을 거치게 되면 출력되는 전압은 3.3V로 일정하게 유지됩니다.  따라서 3.3V 전용 전압을 사용해야 하는 주요 모듈에는 이러한 정전압 컨버터를 사용하게 됩니다 . 다만, 입력 전압은 최소 4.3V 이상 되어야 하는데, 회로를 거치며 1V 가량이 다운되기 때문이죠. 

아래는 AMS1117을 사용하여 3.3V 전원을 필요로 하는 기기에 연결하는 방법을 보여드립니다.

D1 mini 와 OLED 모두 3.3V 전원으로 동작이 되는 보드입니다

 

 ⑤ L9110S 모터드라이버

L9110S H-Bridge 모터 드라이버 모듈입니다. 
아두이노 포트의 출력(전류)은 최대 40mA로 그리 크지 않은데요, LED를 작동시키는 데는 문제없지만, 모터, 특히 기어가 달린 모터를 사용하거나 용량이 큰 모터 혹은, 부하가 걸린 상태에서는 모터를 제대로 작동 시킬 수 없습니다.
이럴 때, 전원을 분리 공급해 줄 수 있는 릴레이 모듈을 사용하거나,  L9110S나, L298N 모듈처럼, 출력을 증폭시켜 줄 모터 드라이버 모듈을 사용하게 됩니다.

사용방법은 아래 그림처럼 사용할 수 있습니다.  직류 모터는 모듈 하나당 2개 연결이 가능하며, 스텝모터의 경우 4선식 스텝모터 하나의 연결이 가능합니다.

L9110S 사용 방법 예시

⑥ 워터 펌프

워터 펌프는 전원을 넣으면, 모터 끝에 연결한 날개형태의 임펠러가 회전하면서 물을 '입수구'로 빨아들여서,  '출수구'로 배출하게 됩니다. 펌프 종류에 따라 다른데요, 화면과 같은 펌프는 물속에 잠기게 하여 작동시켜야 하며 물 밖에서 테스트할 때는 너무 오래 작동시키지 않아야 합니다. 물속에서 작동되는 이유로 모터 회전에 따른 과열을 상쇄해 주는 점을 고려해 만들었기 때문입니다.
(입수 튜브가 달려 있는 펌프는 물 밖에서 사용할 수 있음, 단 물 밖에서 사용되는 소형 펌프의 경우 구조상 물 흡입이 잘 안 될 수 있음) 

튜브의 길이는 물통과 화분의 위치를 고려해 조금 여유 있게 정하면 됩니다.
튜브의 내경은 펌프 출수구의 외경보다 조금 작은 것을 선택해야 물의 수압으로 인해 쉽게 빠지지 않습니다. (튜브를 벌려 출수구 바깥으로 끼워주세요)

 

⑦ 기타 부품


물통으로는 어떤 것이든 괜찮지만, 엎질러질 것을 감안해 뚜껑을 닫을 수 있는 것이 좋으며 수중 펌프 모터를 사용한다면, 구하기도 쉽고 입구를 쉽게 통과하는 '1.8L 우유통'으로 선택해 보세요.  기타 부품으로는 회로의 연결을 도와줄 작은 사이즈의 브레드 보드가 필요하고요, 터미널 단자는 배터리 소켓의 전선처럼 단단하지 않은 흐물흐물한 연선을 브레드 보드에 꽂으려 할 때 사용하면 편리합니다. 

회로를 만들 때 기본적으로 회로의 전원을 켜고 끌 수 있도록 스위치를 달아주면 좋습니다. 하지만 스위치와 터미널 단자가 반드시 있어야 하는 것은 아니니,  재료를 준비하지 못했다면 제외하고 제작해도 됩니다.
회로에 사용할 전원 방식은,  이미지에 보이는 것처럼 다양하게 선택할 수 있습니다. 
이동이 잦거나 크기를 작게 만들려 할 경우에는 건전지나 리튬이온배터리가 좋으며, 상시적으로 화분에 적용하고자 한다면, 배터리 교환/충전의 번거로움이 없는 어댑터를 추천해요.
배터리를 연결할 경우, 생각보다 오래 가지 못합니다. 실제로, '리튬폴리머',  '18650 리튬이온' 등의 배터리로 테스트해본 결과, 배터리 용량에 따라,  1일~3일 정도 작동된 후 배터리가 소진되었으니 참고하세요.


단선은 내부의 선이 하나의 굵고 단단한 선으로 되어 있어 '브레드보드'에 직접 꽂기가 편하지만 연선은 여러 가닥의 얇은 선으로 되어 있어 잘 휘어지기 때문에 영상과 같은 터미널 단자를 이용하면  쉽게 '브레드보드'에 연결할 수 있습니다.

 

2. 핵심 부품 활용법 및 환경설정 

 ① D1 mini 활용법

그럼,  'D1 mini'와   'OLED'에 대해 좀 더 상세히 설명드려 볼게요.
'Wemos D1mini'기종은 ESP8266시리즈 중,'ESP-12EX'칩을 적용한 'NodeMCU'의 한 종류인데요, 'WiFi' 기능을 핵심으로, 사용하지 않는 핀을 전부 제거하여 보드 크기를 최소화한 기종입니다. 즉, 아두이노 '우노'의 축소 버전인 '나노'가 있다면, 'Wemos D1'의 '나노' 버전이라 할 수 있습니다. 

D1mini는 Wifi를 지원하고 크기가 작으면서 가격도 저렴해, 다양한 'IoT'기기 제작에 활용됩니다. 
아두이노와 같은 보드들은 하나의 핀에 여러 가지 핀 명칭이 붙는데요 잠시 정리해 볼게요. 

이런 보드들은 다목적용으로 사용할 수 있도록 여러 기능의 핀들이 필요하게 됩니다. 만약, 한 핀에 하나의 전용 기능만 둔다면 지금의 핀 수보다 훨씬 많아야 하며 그렇게 된다면, 보드 사이즈 또한 매우 커지게 됩니다. 
때문에, 어떤 조건이나 코드에 따라 하나의 핀이 여러 가지 기능을 할 수 있도록 화면과 같은 '핀 맵'(Pin Map)을 구성하게 됩니다. 
우선, 보드에 인쇄되어 있는 핀은 하드웨어적으로 부르는 핀 명칭이며, ESP pin은  ESP 칩셋을 개발한 'ESPRESSIF SYSTEMS'회사에서 붙여놓은 핀 번호이고요, 아두이노와 같은 보드 종류에 상관없이 일반적으로 명명되는 GPIO라는 핀 명칭이 있습니다. 
그 밖에, 전원핀과 아날로그 입력(A0), SPI, I2C, UART 통신을 위한 핀이 표시되어 있어요. 
'GPIO'란 'General Purpose Input Ouput' 의 줄임말로, 핀을 입력 또는 출력 용도로 사용할 수 있게 하는 핀을 말합니다.
'아두이노'뿐 아니라 '라즈베리파이' 등 다른 보드에서도 일반적으로 많이 사용하는 명칭입니다. 
그런데, 아두이노 코딩에서는 이런 'GPIO핀'과 '보드핀' 번호를 구분해야 동작이 됩니다. 
숫자만 적으면 GPIO 핀 번호로 인식되고, 숫자앞에 D를 붙이면 보드의 핀번호로 인식되어 처리됩니다.

코드 작성시 보드핀 번호와 GPIO핀 번호를 구분하여 사용합니다

 그리고, 보드를 재부팅하려면 리셋 버튼을 눌러주면 됩니다.
그럼, 보드 전원 관련하여 정리해 드릴게요.  'D1 mini' 보드는 '마이크로 5핀' 케이블을 이용하여 전원을 공급받고 PC와 통신도 할 수 있는데요, micro 5핀 단자로 전원이 공급되면, 5v 단자로 5v ,  3.3v 단자로는 3.3v가 각각 출력됩니다.

그럼, 회로에서는 3.3v 전원과 5v 전원을 여기서 끌어다 사용할 수 있습니다.
그리고 'micro 5핀' 커넥터 전원의 공급이 없더라도 ,  'D1 Mini' 보드를 구동 시킬 수 있는데요,
5v 단자에 전원을 넣거나,  3.3v 단자에 전원을 넣으면 동작이 됩니다. (최대 24v, 이하로 입력) 
결론적으로 전원 단자는 입력과 출력이 되는 양방향 단자인데요,  
5v 단자에  5v를 넣으면 ,  3.3v 단자에서도  3.3v 전원을 뽑아 쓸 수 있습니다. 

반대로, 3.3v 단자에 3.3v 를 넣으면 , 5v 단자에는 약2.8v 정도만 출력 되는데요,  전압이 소모되어 낮아질 수는 있어도 입력한 전압에 비해 커질 수는 없기 때문이죠. 

② 아두이노 IDE 환경설정

이 주소를 복사 후 붙여넣으세요     https://arduino.esp8266.com/stable/package_esp8266com_index.json  

D1 mini 보드 또한 esp8266 칩셋을 사용하기 때문에, esp-01과 똑같은 주소 링크를 '파일》환경설정》추가적인 보드... URLs' 항목에 넣어 주세요.
그리고,  '툴 》보드 》보드매니저...' 항목을 열어서  검색창에 'esp8266'으로 검색하세요. 검색된 'esp8266' 보드 패키지를 설치해 주면, IDE에 'esp8266' 관련 보드 메뉴들이 추가됩니다.


그럼, 그중에서 'WeMos D1 R2 & mini' 보드를 선택하면, IDE에서의 설정은 끝나게 됩니다.

아두이노 IDE 버전이 업데이트 되면서 표시되는 이름이 조금씩 다를 수는 있습니다

③ OLED 활용법

 'OLED'에  로고 이미지를 넣고 활용하는 방법에 대해 설명드릴게요. 
이미 언급했듯이 연결이 좀 더 간편한 'I2C' 타입 'OLED'를 사용해 보려고 합니다.
'OLED'기본 사용법이 궁금하다면, 아래 링크 해드리는 'OLED'기초 영상을 참고해 보세요

【 아두이노모듈#29】 OLED 처음 사용 설명서 #1 (SPI, I2C 주요 5종 사용법 안내)

'OLED'에 단순히 데이터만 표시하는 것보다 화면처럼 작품에 어울리는 이미지를 넣어주면 좋아요. 


로고로 사용할 이미지는 구글 등에서 검색해도 되지만, 종류별로 잘 분류되어 있는 아이콘 이미지 사이트를 알려드릴 테니 활용해 보세요.  웹 주소는 'IconArchive.com'인데요,  보이는 것처럼 깔끔한 이미지들이 잘 분류되어 있어요.
https://iconarchive.com/

여기서는 화면에 보이는 '꽃화분' 이미지를 다운로드 받아 보세요. 검책창에 'flowerpot'으로 검색합니다.
검색된 이미지 중에서, 화면과 같은 이미지를 클릭해서 다운로드해 보세요.


'다운로드 PNG' 버튼을 누르면 이미지가 확대되는데요, 
아래 이미지 위에서 마우스 '우클릭'으로 다운로드 하세요.

배경이 투명한 PNG 파일 포맷은, 로고 작업에 매우 유용한 파일 형식입니다.
물론 그림 형태의 이미지도 사용할 수 있지만, 검정과 흰색의 단색만 표현되는 OLED에서는 이미지가 깔끔하게 표시되지 않기 때문에, 이런 심플한 이미지를 권해드립니다.

이제, 그림판을 실행시켜 다운로드한 이미지를 불러오세요.

이미지 크기를 'OLED'에 표시될 사이즈로 맞추고 단색 비트맵 형식으로  바꾸어줘야 하는데요, 그림판으로 손쉽게 해결할 수 있습니다.
그림판의
1. 화면 메뉴에서 "크기 조정" 도구 버튼을 클릭하세요. 


2. 기준을  "픽셀"로 바꾸어 주세요.

3. 이미지의 세로 길이가 OLED 세로 사이즈인 '64pixel'을 넘지 말아야 하므로 60 정도로 할게요.

만약 '가로 세로 비율 유지' 체크를 해제하면, 가로 세로 크기를 각각 설정할 수 있습니다.
4. '파일 》 다른 이름으로 저장' 메뉴에서  'BMP 그림'을 선택하세요.

5. '파일형식' 옵션에서 '단색 비트맵'으로 선택하고 저장 버튼을 클릭하세요.

아래처럼,
6. 경고 팝업창이 뜨면 모두 '확인'을 클릭하면 됩니다.

이제 이미지에 대한 정보를 아두이노 IDE 코딩 툴에서 처리할 수 있도록 'XBM' 파일로 변환해 볼 텐데요.
화면에 보이는 사이트로 접속하면  프로그램 설치 없이 간단히 변환할 수 있습니다 (링크참조).

XBM 파일은 이미지 데이터를 쉼표로 구분한,  바이트 값으로 인코딩 된 파일인데요,  C소스 파일의 형태를 취하고 있어

아두이노 IDE에서 바로 활용하기 편한 장점이 있습니다.
C소스 파일의 형태를 취하고 있어 아두이노 IDE에서 바로 활용하기 편한 장점이 있습니다.

1. Convert image to XBM 화면에 있는 '파일 선택'을 클릭하세요.
2. 조금 전에 60x60 pixel로 저장한 '~~~.bmp'파일을 선택하세요.
3. 'Convert and Download' 버튼을 누르면, '~~~.XBM' 파일로 변환되어 저장됩니다.
4. 'Convert and Download' 버튼을 누르면, '~~~.XBM' 파일로 변환되어 저장됩니다.
5. 이 파일을 '메모장' 혹은 '워드패드' 등으로 연결하여 열어 보면,

아래 이미지처럼 이미지가 C언어 기반의 데이터 배열로 변환 된 것을 알 수 있습니다.

4.그럼 이 부분을 'flowerpot'이라는 적당한 배열 변수명으로 바꾸어 아두이노 코드에 넣으면 됩니다.


아래처럼 별도로 'image.h'형태의 텍스트 파일을 만들어 추가해 주거나,  직접 코드에 넣으면 됩니다 .

아두이노 메인 코드에서는 화면과 같은 형식으로 함수를 호출해 주면 이미지정보를 불러오게 됩니다.
'#define'으로 정의하지 않고, 폭과 높이 값을 숫자로 직접 넣어도 됩니다.

 

④ L9220S / AMS1117 / Soil Sensor / Slide SW 활용법

그럼, 센서와 나머지 모듈들의 활용법에 대해 설명드립니다.
펌프 모터를 원활히 돌리기 위한 모터 구동용 드라이버 L9110S 사용법을 설명드릴게요.


아울러 출력을 조금 높이고 싶은데,  'L298N' 모듈을 갖고 있다면, 이 모듈로 바꾸어 사용해도 됩니다
(단, 코드 수정 필요)

L9110S 모듈을 자세히 보면 반을 나누어 '모터 A'쪽 입출력과 '모터B'쪽 입출력으로 나뉘어 있는데요,
A, B 중 어느 한 쪽에 모터를 연결해서 사용하면 됩니다. 

만약 'A쪽'에 연결하였다면,  아두이노로부터의 제어신호 입력은 여기 'A쪽'으로 넣어 주어야 합니다. 
그리고 여기에 전원을 넣어주면 모터 모듈을 통해 모터가 동작하게 되죠.

모터는, A-1A에 HIGH, A-1B에 LOW신호를 넣으면 모터가, 예를들어 시계방향으로 회전하게 되고 , 반대로, 'A-1A'에 LOW, 'A-1B'에 HIGH 신호를 넣으면 모터가, 반대 방향으로 회전하게 됩니다.
화면과 같은 펌프는 회전방향에 상관없이 출수구로 물이 나오니 모터회전 방향은 신경쓰지 않아도 되
요

'AMS1117' 모듈의 사용법입니다
아두이노에 사용되는 모듈은 3.3v혹은 5v의 일정하게 유지되는 전압을 입력받아야 정상작동됩니다 .
이렇게 일정한 전압을 출력해 주는 것을 '전압 레귤레이터(Voltage Regulator)라고 합니다.

3.3v 칩을 사용한 3.3v 레귤레이터가 있으며, 5v 칩을 사용한 5v 레귤레이터 모듈이 있는데요,
여기서는 3.3v 레귤레이터 모듈을 사용하고 있습니다.

주의사항으로는 레귤레이터를 거치면서 1v 가량이 소모되기 때문에 입력은 최소 4.3v이상이어야 하며, 최대 허용 전류용량(mA)이 800mA이기 때문에 소모 전력이 이를 넘어서는 큰 장치나, 너무 많은 수의 장치를 연결할 경우 'AMS1117'모듈이 손상될 수 있습니다.  이럴 때는 용량이 보다 더 큰, 다른 종류의 레귤레이터 모듈을 사용해야 합니다.

AMS1117 모듈의 전원 연결 예시

회로 연결을 보면, 레귤레이터에서 나오는 출력을 장치 세 곳의 전원으로 연결한 것을 알 수 있는데요,  출력의 +(플러스)는 각 모듈의 +전원(Vcc) 단자에 연결하고, 출력의 -(마이너스)도 각각의, -GND 단자에 연결해 주면 각각의 기기에 3.3v의 전원이 공급됩니다. 

토양(soil) 센서의 활용법입니다.
아래 보이는 센서는 일반적으로 많이 활용되는 센서인데요
토양 센서는 탐침 사이로 수분이 있으면 전류가 잘 흐르는 원리를 이용하는데요,

그 변화되는 값을 아날로그 A0 단자로는 0v~4.2v 사이의 전압 값으로 출력 시키며(5v 입력 기준) 디지털 D0단자로는 특정 경계값 아래로는 0v(Low), 위로는 5v(High)를 출력 시킵니다(5V입력기준)

하지만, 이 센서의 단점이 있는데요, 장기간 사용 시 금속 부분이 산화에 의한 부식이 진행되어,  제대로 동작되지 않을 수 있습니다.  

따라서, 이를 해결하고자,  부식에 강한 얇은 '금도금'을 입힌 제품이 있으며,
아래 처럼, 아예 금속 자체를 사용하지 않는 정전 방식의 센서가 있습니다.

또는, 아예 금속 자체를 사용하지 않는 정전 방식의 센서가 있습니다. 

둘 다, 앞의 센서보다 가격이 조금 비싼데요, 활용 목적에 맞게 선택해 보세요. 

정전식 센서의 사용법도 'D0' 단자가 없는 것을 제외하고는 같습니다. 
알려드리는 아두이노 코딩도 변경 없이 사용하면 됩니다.

회로 연결 또한, 그림처럼 간단하게 연결됩니다.

 

녹색 영역이 흙에 삽입되는 권장 구간이며, 

화분의 특성상 물과의 접촉이 예상되는 붉은 원 영역을 보호하면 좋은데요, 방수를위해 절연테이프를 감거나 본영상에서처럼 글루건을 이용해 글루스틱으로 코딩하면 좋습니다.

스위치의 원리와 활용법입니다.
스위치는 토글, 푸시버튼, 로커, 리밋(limit) 스위치 등 많은 종류가 존재하지만, 기본 기능은 두 선(전기적 접점)을 연결하거나, 끊어 주는 역할입니다. 

여기서는 슬라이드 타입의 스위치를 사용하는데요, '브레드보드'에 꽂기 편한 타입이며, 전원을 연결하거나 차단하는 용도로 사용합니다.
아래 스위치의 작동 구조를 눈여겨보세요.  슬라이드 스위치에서는 가운데 핀이 제일 중요한데요,

가운데 핀을 어느 한쪽에 반드시 연결하여 사용하여야  On / Off 기능을 사용할 수 있습니다.
아래는 스위치를 A-B 연결시킨 ON 상태로 두면, 전원이 연결되어 LED가 켜지게 되고,

아래와 같이 스위치를 B-C 연결시킨다면 OFF 상태로 되고, 전원이 차단되어 LED가 꺼지게 됩니다.



다음으로 전원 방식을 사용 환경에 맞게 선택하면 됩니다.

AA 타입의 건전지는 가장 구하기 쉬운 장점과 교체가 번거롭고 비용이 많이 든다는 단점이 있습니다 .
리튬 폴리머 또는 이온 배터리는 얇고 가벼운 장점과 충전 및 작은 커넥터 연결의 불편함이 있습니다.|
'18650 리튬이온' 배터리는 이동성과 충전의 편리함이 있고, 
주기적 교환의 불편함과, 회로 내 쇼트에 의한 발화를 ※주의! 해야 합니다.
어댑터를 연결하면 배터리 교환에 대한 불편함이 없고, 상시적인 전원 공급이 가능한 장점이 있고,
설치되는 곳에 전원 공급 콘센트 등이 있어야 한다는 제약이 있습니다.
실습에서는 배터리 연결도 해보았고, 어댑터 또는 마이크로5핀 USB전원케이블도 연결해 보았는데요, 

(추천)분리형 어댑터/USB멀티탭을 이용, 마이크로5핀 케이블만 간단히 연결할 수 있어 매우 편리해요. 

 

① IoT 화분 개념도

수분 자동 공급 IoT 화분의 개념도입니다.  개념도를 보면서 어떻게 연결을 해야할지 파악하면 좋습니다.

수분 자동 공급 화분을 구현할 때, 단계를 나누어 작업해보면 좋습니다.
1단계로 기본적인 물공급 화분을 제작하는 것으로 진행하고, 
2단계는 wifi를 이용해 클라우드 서버에 접속해 IoT기능을 활용해 볼 수 있는 실습으로 진행해 보세요.

② IoT화분 연결도면

아래는, 이 개념을 바탕으로 실제 회로 동작을 위한 연결도입니다.

이미지를 클릭하여 확대해서 보세요

전원은 앞서 설명드린 것처럼,  배터리 혹은 어댑터 중 선택하면 됩니다. 
펌프 모터는 물에 잠기는 것과 물 밖에서 호수만 넣어 동작되는 것을 선택할 수 있습니다. 
이번 프로젝트에 사용한 펌프는 3v~6v로 동작하는 소형 펌프이기 때문에 문제가 없지만, 
만약 용량이 좀 더 큰 펌프로 교체할 경우,  전력 부족으로 제대로 동작하지 않을 수 있어요,
필요하다면 용량에 맞추어 릴레이 모듈 추가나 '전원공급부'를 보강하여야 합니다(코드 변경도 필요함)

③ 펌프모터 전선 연장하기

펌핑모터 전선 연장하기
펌프 모터의 '전원선'은 기본적으로 길이가 매우 짧기 때문에,  '전원선'을 여유 있게 아래처럼 연장해 보세요.

전기적 연결이 안정적이려면 연결 부위에 인두기로 납땜을 해주면 제일 좋고, 인두기가 없더라도 전선 외피를 충분히 탈피하여 접촉면이 커지도록 손으로 잘 꼬아 주면 됩니다. 
그리고 물에 접촉될 확률이 높은 만큼 연결 부위를 전기 테잎 혹은 열수축튜브 등으로 감싸주어야 해요. 
수축 튜브는 사이즈 별로 있으며, 라이터 혹은 헤어드라이기 등으로 수축 시킬 수 있습니다.

각각의 선을 수축 튜브로 감싸준 다음, 좀 더 굵고 긴 튜브로 전체를 다시 감싸주면 깔끔하게 마감을 할 수 있습니다.

④ 펌프 물통 제작하기

이제 우유통을 이용해서 수분 공급 물통을 만들어 볼게요. 물통은 생수통도 있고 여러 가지를 생각해볼 수 있지만, 
물이 오염되거나 쏟아지지 않도록 뚜껑을 닫을 수 있는 것이 좋으며, 수중모터가 통과할 수 있는 입구 크기를 지니는 물통을 찾다 보니, 구하기도 쉬운  1.8L 우유통을 사용하게 되었습니다. 

⑤ 펌프 호수(튜브) 끼우기

이제 펌프 호수를 끼워 볼게요, 만약, 펌프 호수를 끼울 때, 너무 쉽게 들어간다면, 좀 더 작은 내경의 호수를 사용하세요.
펌프가 가동될 때, 물의 압력으로 호수가 쉽게 빠져버릴 수 있기 때문입니다. 


이제 호수가 통과할 크기의 구멍을 뚫어주겠습니다.  

구멍은 핸드드릴을 사용해서 뚫을 수도 있지만, 드릴 작업은 손을 다칠 위험이 있으니 장갑을 끼고 안전에 주의해 주세요. 
가급적이면, 아래처럼, 집에 막 쓰는 인두기 '막두기'가 있다면, 인두기 사용을 권해드려요,  드릴로 뚫는 것보다, 작업이 훨씬 수월해집니다. 

호수와 모터의 전원 케이블을 함께 끼워주세요. 

그리고,  펌프의 전원선은 호수와 전원 케이블이 따로 놀지 않도록 머리를 땋듯이 감아주면 좋습니다

 

⑥ 아두이노 코드 작성하기

아두이노 코딩입니다.


현재 WiFi 기능이 있는 것과 없는 것, 두 가지 코드를 제공해드리는데요,
먼저,  
1.  WiFi 기능을 사용하지 않는 코드로 기본기능을 테스트해 보세요. 
2. 사용하고자 하는  OLED가 따로 있다면, 해당 부분의 코드를 수정하세요.
3.  펌프를 작동시킬 센서의 값은 화분의 종류와 상태에 따라 테스트해보며 수정하면 됩니다.
4. 코드 '컴파일'할 때  발생하는 에러의 대부분은 라이브러리 문제입니다.
5. 라이브러리가 없거나, 같은 이름이라도 버전이 다르거나, 제공자가 다르면 에러가 발생하게 됩니다.

《 ① WiFi 기능 없는 Basic Code 》

: WiFi로 데이터 전송하는 기능 없이 순수하게 자동 물관리하며 작동 상태를 OLED에 표시해 주는 기본 코드입니다.

#include <ESP8266WiFi.h>
#include "SSD1306Wire.h"            // I2C용 OLED 라이브러리 사용
// SSD1306Wire  display(0x3c, 2, 0);   // esp8266-01 과 OLED를 연결할 경우 GPIO (SDA, SCK) 포트 번호
SSD1306Wire  display(0x3c, 4, 5);  // D1 mini 와 OLED를 연결할 경우 GPIO (SDA, SCL) 포트 번호
int motorA1 =  D6; // L9110S 모듈에 연결할 핀 번호 (D1 mini 보드에 적힌 ESP핀 번호 임)
int motorA2  = D7; // L9110S 모듈에 연결할 핀 번호 (D1 mini 보드에 적힌 ESP핀 번호 임)
int sensorVal = A0; // D1 mini 보드의 아날로그 포트 번호

void setup(){
    Serial.begin(9600);
    pinMode( motorA1 , OUTPUT); 
    pinMode( motorA2 , OUTPUT);   
    display.init();
    display.flipScreenVertically();  // 스크린 상하 플립
    display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24
    display.drawString(20, 32, "by RasINO IoT");        
    display.display();  // 이미지나 글자를 출력(변경) 하고자 할 때는 이 명령어를 보내야 화면에 나타납니다.
    delay(2000);
    display.clear();
}

void loop () {    
    sensorVal = map(analogRead(A0), 450, 1023, 100, 0); //토양센서 측정범위를 확인 후 100~0의 값으로 변환함
//    Serial.print("Sensor = ");
//    Serial.println(analogRead(A0));  // 0(건조) ~ 100(습함) 값 출력    
    display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24  
    display.drawString(0, 0, "Pot :");
    display.drawString(40, 0, String(sensorVal));    
// #A --테스트 후, 모터를 작동시킬 센서 값을 조절해주세요 -- 현재는 80으로 설정 --  
    if ( sensorVal < 80) {
      display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24  
//      Serial.print("Pot is Very Dry !");
//      Serial.print("Now Pumping...");
      digitalWrite(motorA1, HIGH);
      digitalWrite(motorA2, LOW);
      display.drawString(0, 30, "Pot Dri!");
      display.drawString(0, 45, "Pumping...");
      display.display();
      delay(10);
    } else {
      digitalWrite(motorA1, LOW);
      digitalWrite(motorA2, LOW);
      display.drawString(0, 30, "Pot OK!");
      display.drawString(0, 45, "Sleeping...");
      display.display();
      delay(10);
    }
    display.clear();
}

<코드 다운로드>

AutoPot_OLED_Basic.zip
0.00MB

그럼, 코드를 컴파일합니다.   
만약 아래처럼, 컴파일 에러가 난다면, 특히 라이브러리 에러가 난다면 기존 라이브러리를 백업해 두거나 삭제하고서,
지금 제공해드리는 라이브러리를 설치해 보세요.


 ① <ESP8266WiFi.h> 라이브러리 다운로드 

ESP8266WiFi.zip
0.08MB


 ② <SSD1306Wire.h> 라이브러리 다운로드
(SSD1306 OLED 드라이버를 사용하는 경우에 필요한 라이브러리입니다. 만약 제 작품에 사용한 OLED가 아닌 다른 드라이버를 사용하는 OLED를 사용한다면 라이브러리 에러가 날 수 있으니, 갖고 있는 OLED의 제조사 홈페이지 등에서 관련 라이브러리를 찾아 설치해 보세요)

esp8266-oled-ssd1306-master.zip
0.29MB



만약, 위 라이브러리를 설치하였음에도 라이브러리 에러가 나는 경우에는 아두이노 IDE 메뉴에서 보드 선택을 D1 mini로 해주었는지 확인해 보세요.   기본적인 우노 보드나 다른 보드로 선택되어 있는 상태에서 컴파일 하게 되면 라이브러리 에러가 아님에도 라이브러리 에러처럼 보이는 에러가 날 수 있습니다. (아래 이미지 참조)

보드가 연결 된 포트까지 정확히 선택해 주세요


 보드 메뉴에 "WeMos D1 R2 & mini"와 같은 혹은 유사한 이름의 보드가 없다면,   제 글 상단에 알려드린 것처럼, 아두이노 IDE의 환경설정 부분에 보드 목록(Json 주소)을 추가해 주세요.

이 주소를 복사 후 붙여넣으세요     https://arduino.esp8266.com/stable/package_esp8266com_index.json  

파일 》 환경설정 》 추가적인 보드  'URLs' 부분에 'ESP8266보드' 링크를 추가해 주세요. 
그리고,  "툴 》 보드" 메뉴로 다시 들어가 보면,  ESP8266관련 보드들이 추가된 것을 볼 수 있습니다. 
그럼, 목록 중에서, ' Wemos D1 R2 & mini '를 선택하세요.

컴파일이 문제 없이 되었다면,  D1 mini에 코드를 전송하면 됩니다.

코드를 잠시 살펴볼게요. 
 sensorVal = map(analogRead(A0), 450, 1023, 100, 0);   
이 부분에서는 토양센서를 화분에 꽂아 보고 수분이 제일 적을 때와 제일 많을 때(측정 최대치)를 먼저 확인하여 고쳐주세요. 이 실험에 사용된 화분에서는 450(Min)과 1023(Max) 입니다.   이를 계산하기 쉽게 100~0의 값으로 '매핑(mapping)'하였습니다.

그리고,  if ( sensorVal < 80)  이 부분에서, 센서의 수분이 80이하는 측정되면 펌프를 작동하도록 하였는데요, 
여러분의 화분 상태나 조건에 따라 필요한 수치로 바꾸어 주면 됩니다. 

그리고 모터가 돌아가거나  돌아가지 않을 때의 상태를 쉽게 알 수 있도록 아래처럼, OLED에 글자를 표시하도록 하였습니다.
      display.drawString(0, 30, "Pot Dri!");
      display.drawString(0, 45, "Pumping...");  // 펌프가 작동 중...

      display.drawString(0, 30, "Pot OK!");
      display.drawString(0, 45, "Sleeping...");  // 펌프가 작동 안 함.

그럼 회로를 연결하고 코드를 업로드하여 테스트해보세요.

 

《 ② WiFi 접속 기능 있는 WiFi Web Code 》

만약, 잘 작동한다면, 이제 WiFi 기능을 넣은 코드로 테스트해 보면 됩니다. 
: 자신 주변의 WiFi에 접속해 보는 코드를 가지고 테스트해 보는 코드입니다.  
WiFi에 접속이 되면 ThingSpeak 라는 클라우드 서버로 접속이 되는 코드입니다.
( 단, 이 기능을 완벽히 사용하려면 이 글 후반부에 있는 ThingSpeak의 계정 가입 후 설정 및 토큰을 받아야 하지만, 주변 WiFi접속이 잘 되는지까지는 테스트 가능합니다)  

#include <ESP8266WiFi.h> //제시한 라이브러리를 설치 후에도 이부분에 에러가 나면,ESP8266환경설정과,보드를 D1 mini(esp8266보드 계열)로 선택했는지 확인.
#include <WiFiUdp.h>
#include "mySSID.h"
#include "Images.h"
#include "SSD1306Wire.h"           // I2C용 OLED 라이브러리 사용

// SSD1306Wire  display(0x3c, 2, 0);  // esp8266-01 과 OLED를 연결할 경우 GPIO (SDA, SCK) 포트 번호
SSD1306Wire  display(0x3c, 4, 5);  // D1 mini 와 OLED를 연결할 경우 GPIO (SDA, SCL) 포트 번호
String apiKey = thingSpeak_Pot;  // ThingSpeak의 Write API Key 입력 (사이트 가입후 받은 번호를 직접 입력) 
char ssid[] = mySSID1;  // 파일 추가로 입력해도 되고, 여기에 WiFi이름을 직접 입력해도 됩니다.
char pass[] = myPASS1;  // WiFi 비번 입력.
const char* server = "api.thingspeak.com";
WiFiClient client;    // client 시작하기

int motorA1 =  D6;   // L9110S 모듈 관련 변수 선언
int motorA2  = D7;   // L9110S 모듈 관련 변수 선언
int sensorVal = A0;

void setup(){
    display.init();
    display.clear();
    display.flipScreenVertically();  // 스크린 상하 플립
    display.drawXbm(0, 0, RasLogo_W, RasLogo_H, RasLogo);       
    display.display(); 
    delay(2000);
    display.clear();
    display.drawRect(0, 0, 128, 64);
    display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24
//    display.setTextAlignment(TEXT_ALIGN_CENTER);    // LEFT , RIGHT
    display.drawString(5, 10, "Auto Flower Pot");        
    display.setFont(ArialMT_Plain_10);  // ArialMT_Plain폰트는 10, 16, 24    
    display.drawString(8, 36, "RasINO.TISTORY.COM");            
    display.drawString(11, 48, "YouTube:RasINO IOT");         
    display.display(); 
    delay(3500);    
    
    Serial.begin(9600);
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {
      delay(100);
      Serial.print("*");
      display.clear();
      display.drawString(11, 48, "Connecting WiFi...");               
      display.display(); 
      delay(6000);
      break;
    }
    pinMode( motorA1 , OUTPUT); 
    pinMode( motorA2 , OUTPUT);   
    display.clear();
}

void loop () {
    sensorVal = map(analogRead(A0), 450, 1023, 100, 0);  // 토양센서 측정범위 확인 후 0~9의 값으로 맵핑값 저장
//    Serial.print("Asensor = ");
//    Serial.println(analogRead(A0));  // 0(건조) ~ 100(습함) 값 출력    
    display.drawXbm(0, 0, flowerPot_W, flowerPot_H, flowerPot);
    display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24  
    display.drawString(50, 0, "Pot :");
    display.drawString(90, 0, String(sensorVal));    
    if ( sensorVal < 52) {
      display.setFont(ArialMT_Plain_16);  // ArialMT_Plain폰트는 10, 16, 24  
//      Serial.print("Pot is Very Dry !");
//      Serial.print("Now Pumping...");
      digitalWrite(motorA1, HIGH);
      digitalWrite(motorA2, LOW);
      display.drawString(50, 30, "Pot Dri !");
      display.drawString(50, 45, "Pumping...");
      display.display();
      delay(10);    
    } else {
      digitalWrite(motorA1, LOW);
      digitalWrite(motorA2, LOW);
      display.drawString(50, 30, "Pot OK!");
      display.drawString(50, 45, "Sleeping...");
      display.display();
      delay(10);
    }
    display.clear();

    if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com   
    {  
       String sendData = apiKey+"&field1="+String(sensorVal)+"\r\n\r\n";      
       //Serial.println(sendData);
       client.print("POST /update HTTP/1.1\n");
       client.print("Host: api.thingspeak.com\n");
       client.print("Connection: close\n");
       client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
       client.print("Content-Type: application/x-www-form-urlencoded\n");
       client.print("Content-Length: ");
       client.print(sendData.length());
       client.print("\n\n");
       client.print(sendData);
       delay(10);
    }
}

<코드 다운로드>

AutoPot_OLED_Web01_Ras.zip
0.00MB

 보통 WiFi접속의 경우, 집에서 WiFi공유기에 접속하는 경우와,  회사에서 회사의 WiFi공유기에 접속하는 경우, 그리고 자신의 핸드폰의 핫스팟(테더링) 으로 접속하는 3가지로 나누어 볼 수 있는데요, 
이 3가지의 WiFi에 대응이 되도록 WiFi ID와 비번의 목록 파일(mySSID.h)을 사용자 정의 라이브러리 파일로 따로 만들었습니다.   예를 들어, 1번은 집에서 사용할 때의 WiFi이고,  2번은 회사,  3번은 자신의 스마트폰 핫스팟 입니다.
 그런데, 그냥 이 목록을 만들지 않고 접속 가능한 한 가지 WiFi ID와 비번을 직접입력 해도 됩니다. 

만약 아래와 같은 에러가 난다면, "mySSID.h"와 같은 파일 이름의 라이브러리 파일을 만들고 아두이노 코드가 있는 폴더에 옮겨 놓으면 됩니다. 

그래서 mySSID.h와 같은 파일이 아두이노 코드 폴더에 함께 있으면 아래처럼 표시됩니다. (#include "mySSID.h" 코드 필요)

그런데, 이렇게 여러가지 WiFi 필요 없고 바로 접속 가능한 WiFi 하나만 아래 코드처럼 입력해도 됩니다. 

WiFI ID와 비번을 직접 입력해도 됩니다

 

 OLED에 올릴 이미지 데이터도 코드에 직접 넣어도 되지만  코드가 번잡해지기 때문에 아래처럼 "Image.h"라는 사용자 정의 라이브러리 파일로 만들었습니다. 
위 아두이노 코드 압축파일을 다운로드하면 그 속에 아래의 Images.h파일도 함께 들어 있습니다.

 

그럼 이제, WiFi접속 기능을 넣은 코드를 살펴볼게요.  
기본동작은 앞의 코드와 같고, 'WiFi'접속을 통해서 수분 데이터를 'Web'과 스마트폰에서 볼수 있는 기능입니다 .
이 기능을 활용하려면, 클라우드 서버가 필요한데요, 몇 가지 플랫폼 중에서 'thingspeak.com'를 이용해보겠습니다, 무료기능으로 충분히 사용 가능해요. 

아래처럼,  thingspeak 이용을 위한 내용을 넣어 주어야 합니다

apikey 항목에는 여러분이 Thingspeak 사이트에 회원가입 후 부여받은 Write API Key를 입력해야 해
요.
나머지 부분은 앞의 기본 코드와 동일하며,  표시하고 싶은 내용이나 로고를 추가해 넣으면 됩니다. 
그리고 앞서 설명한 것처럼, 'I2C  OLED'용 라이브러리는 몇 가지 종류가 있습니다.
그 중에서, 본 글에서 사용한 'SSD1306Wire.h' 라이브러리의 사용할 때 중요한 점이 있는데요,
출력하고자 하는 내용 뒤에는 OLED에 뿌려주는 명령어인 'display.display( )'를 꼭 넣어주여야 해요. 

그래서, 'OLED' 관련 기본 코드 구조는 아래와 같으니 참고하세요  ('SSD1306Wire.h' 를 사용할 경우)

여기서는 처음 라즈이노IoT의 로고가 2초가량 나오고 화분 이미지가 나오도록 하였습니다.  
LogoA표시를 위해 display.display( )함수를 사용하고서, 표시할 시간 delay를 적당히 주면 됩니다. 
그리고  LOGO B를 나타내기 전에 이전 로고의 잔상을 display.clear( )함수로 지워주어야 합니다. 

아래 부분이 'thingSpeak 클라우드 서버'로 접속해서 정보를 전달해 주는 부분입니다.

thingSpeak에서 제공하는 형식이며, 오타가 나면, 정보를 제대로 주고받을 수 없으니 주의해야 해요.

그럼,  thingSpeak 서버를 사용하는 방법에 대해 다루어 볼게요. 

《 thingSpeak 서버를 사용하는 방법 》

먼저,  1.  thingSpeak.com으로 접속하여  회원가입을 진행합니다.

아래 2.  Get Started 버튼을 클릭하세요.

 

3.  ' Create one! '을 클릭하여 새로운 계정 만들기로 들어갑니다.

4.  여러분의 'Email 주소'와 함께 관련 내용을 채우고 계속 진행해 주면, 쉽게 회원가입이 됩니다.


5.  가입 완료 후 등록 한 Email을(아이디) 넣고 로그인을 합니다.
그럼,  여러분들의 화면에는 비어있는 My Channels이 열리게 됩니다.


' New Channel '을 클릭하면 화면과 같은 프로젝트 채널을 하나씩 생성할 수 있습니다.

이미 생성된,  각 프로젝트를 클릭해서 열어보면,  아래처럼 설정한 항목들의 데이터가 보이는데요.
데이터를 보내는 하드웨어가 계속 작동 중이면,  데이터가 계속 수집 되게 됩니다. 


" Private " 채널은 본인만 확인할 수 있는 채널이며, " Public " 채널은 측정 데이터를 외부에 공개할 수 있는 채널입니다.
아래처럼, " Channel Settings "에서는 채널에서 측정하고자 하는 항목의 이름과 표시 방법을 정할 수 있습니다. 

" Sharing " 을 통해 데이터를 e-mail로 보낼 수 있고요,


각자 고유한 " API Keys "를 부여받게 되는데요,  아두이노 코드에 사용될 중요한 키입니다.

그 중에서 " Write API Key "는 thingSpeak 서버로 데이터를 보내기 위해 사용되는 인증키입니다.
" Read API Keys "는 thingSpeak 서버에 기록된 데이터를 읽어 올 때 필요한 인증키입니다. 

각 API Key들은 필요하다면, 삭제 후 다시 부여받을 수 있습니다. 
아두이노 코드로 돌아가 보면, 이 부분에 자신의 API Key를 적어 넣으면 되는데요, 화분의 습도 데이터를 서버에 기록하는 상황이므로 "Write API Key"를 적어야 합니다. 

Key를 직접 적어 넣어도 되며, 여기서처럼,  #define으로 정의하여 추가 파일로 연결해도 됩니다. 


새 채널을 만들 때,  복잡해 보여도 실제로 중요한 항목은 몇 가지 되지 않으니 염려 마세요. 
반드시 필요한 항목은,  "새 채널의 이름" 항목과, 데이터를 표시할  항목(Field)만 입력하면 됩니다. 
나머지는 설명을 달거나 필요할 경우의 옵션입니다.


테스트를 해보니, 필드의 제목을 한글로 적으면, 처음엔 문제없지만,  재접속할 때 한글 제목이 깨지는 것 외에는 모두 잘 작동되었습니다.  그래서 그냥 영어로 네이밍 하는게 좋습니다. 
마지막으로 "Save Channel"을 클릭하면 채널 생성이 완료됩니다.

"Field"(항목)가 두 개 이상이라면, "Add Visualizations"으로 추가하여 옵션을 조정할 수 있습니다. 
" Add Widgets "으로 데이터를 표시하고 싶은 형태를 선택하여 추가할 수 있습니다.

위젯의 종류에 따라, 필요한 범위나 표시할 색을 지정해 보세요. 


추후에 데이터가 수신되면 경고 표시는 사라지며, 데이터 표시가 시작됩니다. 

"Export recent data"를 통해 최근의 데이터를 Json, XML, CSV 등의 파일로 저장하여 활용할 수 있습니다.
우선 예시로, 엑셀에서 활용 가능한 CSV 파일로 저장해 보겠습니다.

CSV 파일은 ' , ' 콤마로 구분된 데이터 파일로, 엑셀에서는 '셀(Cell)'단위로 불러올 수 있기 때문에 데이터를 다듬을 필요 없어 편합니다. 
그러면, 측정된 데이터를 가지고 엑셀 차트를 만들어 활용하거나, 엑셀 데이터로 축적해 둘 수 있습니다.

자, 이제 IoT 서버도 준비되었으면,  코드를 컴파일 시켜 아두이노로 업로드하세요.
만약, 자신이 부여받은 API키나 서버 관련 정보가 정확하지 않다면, 아두이노 자동물공급 기능은 실행 되는데 문제 없지만 서버로 데이터가 전달되지 않아 웹이나 앱에서 값이 제대로 표시되지 않을 수 있습니다. 

추가적으로,  영상에서 보았던, 스마트폰용 앱을 설치해서 데이터를 확인해 볼 수 있습니다.
구글 플레이스토어에서, " thingspeak "로 검색해서 앱을 다운로드해 설치하세요. 
'thing Speak'를 이용하는 앱은 몇 가지 있으니 사용해보고 더 편한 것으로 하면 됩니다. 

앱에서 채널을 추가하여 데이터를 표시하고자 할 때,  입력이 요구되는 " Channel ID "는 , 
'thingSpeak' 사이트에서 채널을 생성할 때, 자동 부여되는 '채널 ID'를 입력하면 됩니다.
생성 채널별로 ID가 각각 있기 때문에, 앱에서 보려고 하는 채널의 ID를 입력해 주면 됩니다.



드디어,  회로 조립입니다.

아두이노 코드가 업로드된, D1 mini를 준비하고 회로도에 따라 부품들을 연결해 주세요. 
영상에 보이는 전원 레귤레이터는 뒤집어 꽂을 수 있도록 핀을 반대 방향으로 납땜한 것입니다.
따라서 여러분은 어떤 방향이든, 배치하기 수월한 방향으로 꽂으면 됩니다. 
중요한 것은 영상은 참고로 하고, 부품 연결을 회로도를 보고 극성에 주의하여 정확히 연결해야 합니다.


영상에 보이는 녹색 철심은 말랑한 튜브를 흙 속 깊이 잘 들어가도록 하고 고정하기 위한 용도인데요, 
쉽게 구할 수 있는 세탁소의 철심 옷걸이를 벤치로 잘라, 간단히 만들 수 있습니다. 


그럼, 전원을 'ON' 시키면, 로고가 나오고서,  'WiFi'에 접속을 시도하고 있네요.
그리고 데이터가 함께 표시되는 최종 화면이 나오면 성공입니다.



그럼, 동작이 잘 되는지 확인해 볼게요.
흙이 말랐을 때를 가정해서, 센서를 들어 올려볼게요.


센서 값이 코드에서 정한 값 이하로 내려가면, 곧바로 펌프 모터가 작동해서 물이 나오는지 보세요.
그리고 센서를 습기 가득한 흙 속으로 밀어 넣었을 때, 펌프 모터가 멈추면 정상 작동하는 것입니다


별도로 배터리 소모를 줄이기 위해 'OLED'에 전원 스위치를 연결해 보았는데요, 'OLED'가 꺼져 있어도 잘 작동하는지 확인 중입니다.

네,  아주 잘 작동하고 있네요.

실험을 해보니 OLED를 꺼놓더라도 소형 배터리의 한계로 3일 이상 지속되기는 힘들었습니다.
만약,  배터리 교환이 불편하다면, 어댑터로 상시 전원을 사용하는 것이 가장 좋습니다.
하지만, '리튬폴리머' 배터리를 사용하면 제품의 크기를 가장 작게 만들 수 있는 장점이 있습니다. 

그럼  이번엔,  재충전 사용 및 활용도가 높은 18650 리튬 배터리를 사용해보겠습니다.

다만, '18650'과 같은 '리튬이온 배터리'는 합선에 의한 '발화' 및 '소폭발'이 쉽게 일어나니 ,  따라서 연결 과정이나 사용 과정에서 반드시 주의가 필요합니다.  3.7V 두 개를 '직렬' 연결한 7.4V가 되는 소켓을 사용하고 있는데요,
소켓의 출력 선이 부드러운 연선으로 되어 있어,  '브레드보드'에 꽂기 어렵기 때문에, 
영상에 보이는 터미널 단자를 사용하면 쉽게 꽂을 수 있습니다.

역시 잘 작동 되고 있습니다.

아울러, ThingSpeak 앱을 연결하여 활용성을 높일 수 있습니다. 

스마트폰의 앱과 PC의 웹에서 함께 데이터를 관리할 수 있습니다.


먼저 기본형을 만들어 보세요,  그리고 실제 장시간 테스트를 해보았을 때, 아쉬운 부분을 보완하는 방법을 지금 설명해드릴 테니 적용해 보세요. 


1.  장시간 사용에 따른 금속 탐지 부위의 부식 문제는 
: 센서를 정전용량 방식으로 바꾸면 쉽게 해결할 수 있습니다.


2.  물과의 접촉이 우려되는 연결 부위를 
: 열 수축 튜브를 사용하면 쉽게 차단할 수 있고, 연결도 단단히 할 수 있습니다.


 화분에 직접 삽입되는 센서의 회로 부분이 외부에 노출되어 있어
3. 물이나 흙의 접촉으로 인해 손상이 될 수 있는데요 : 쉽게 구할 수 있는 '글루건'으로 코팅을 해주면 간단히 해결할 수 있습니다.


4. 배터리 장착 테스트를 통해 확인한 결과,  대용량 배터리가 아니라면, 2~3일마다 배터리를 교체나, 충전해 주어야 하는 불편함이 있었는데요,  USB 소켓을 통해 어댑터 혹은 멀티탭의 상시 전원을 사용하면 별다른 관리 없이 사용할 수 있어요.

 

5.  마지막으로  물과의 접촉 가능성이 큰,  회로 본체를 보호하는 것이 필요합니다
 케이스를 씌워주면 좋은데요,  주변에 투명 아크릴 케이스가 있다면, 정말 보기에도 좋을 것 같네요.




※  그럼,  지금껏 설명드린 방법을 사용하여,  집이나 사무실의 화분을 자동으로 관리해 주는 
   IoT 시스템을 재미있게 만들어 보세요 ~  *^^*

감사합니다.

반응형