반응형

안녕하세요. 
라즈이노 ioT입니다.

이번 시간에는 Blynk2.0 업그레이드 강의 네 번째 시간으로 저렴하고 강력한 ESP32 보드를 이용하여 LED와 LED 전등 & 콘센트 제어를 통한 가전기기들을 제어해 보도록 하겠습니다. 

보드의 입출력 포트에 연결된 LED제어는 물론이고, 릴레이를 사용하면, 220V 전기를 사용하는 LED 전등 제어도 가능합니다. 뿐만 아니라, 릴레이 모듈을 Outlet 콘센트에 직접 연결해 놓으면 220V 전기를 사용하는 대부분의 가전제품을 On/Off 제어할 수 있습니다. 

Blynk 서비스가 2.0으로 업그레이드 됨에 따라, 스마트폰뿐 아니라 웹(Web) 페이지에서도 제어가 가능하게 되어 더욱 활용성이 커졌습니다. 앱과 서로 실시간 연동은 당연히 되는데요, 이번 영상을 통해 자신만의 멋진 IoT 시스템을 만들어 보세요~

참고로, 이번 실습을 위해서는 Blynk 서비스 가입 및 기본 사용법 영상을 함께 참고하시면 좋습니다. 

 

그럼 먼저, ESP32에 대해 간략히 알아볼게요

ESP32 칩은 Espressif Systems사에서 개발한 마이크로 프로세서인데요, ESP32 칩을 활용할 수 있도록 플래시 메모리 등의 부품을 넣어 만든 칩셋을 사용하게 됩니다.
이런 칩셋의 종류는 몇 가지 있지만 보편적으로 많이 활용 되는 칩셋이 ESP-WROOM-32입니다.


(아래) 또한 이런 칩셋을 이용해서 제품개발에 활용하기 좋도록 다양한 형태의 마이컴 보드들이 출시되었습니다.

그중에서 가장 기본 모델인 Do it DevKiT V1 보드를 가지고 실습을 진행합니다.

(아래) ESP32 보드의 가장 큰 특징은 블루투스와 WiFi를 이용해서 각종 기기들과 통신이 가능합니다.
이를 이용하여 저렴한 소형 ioT 기기 및 무선 제어 시스템을 구축할 수 있는 큰 장점이 있습니다.


(아래) 그럼, 일반적인 ESP32 보드의 스펙을 다른 보드와 함께 살펴보겠습니다.

보이는 것처럼 ESP32는 다른 보드들에 비해 뛰어난 기능을 제공하고 있습니다. 
Dual Core 이면서, 블루투스 기본 4.2 버전에 저전력 기능인 BLE까지 지원하고 있고, 
많은 수의 GPIO(입출력) 핀과 기능 핀을 제공하고 있고 홀센서도 내장되어 있습니다. 가격 또한 저렴하여, ESP32 칩셋을 이용한 다양한 ioT 관련 장비들이 만들어지고 있습니다. 또한, 기존 아두이노 IDE 플랫폼을 사용하여 동일하게 개발할 수 있기 때문에 쉽게 사용 가능합니다.


(아래)

【 실습을 위한 사전 학습 자료 】


① 【 Blynk 2.0 #1 】Nano33 ioT & Blynk2.0으로 LED On/Off  WiFi 제어하기!
    - 유튜브 자료 : https://youtu.be/4GZox37rXwg
    - 블로그 자료 : https://rasino.tistory.com/351
② 【Blynk2.0 #2】Nano33ioT DHT11 온도/습도값 웹과 앱 출력하기!
    -  유튜브 자료 : https://youtu.be/gxclf4fxvyc
    - 블로그 자료 : https://rasino.tistory.com/353  
③ 【Blynk2.0 #3】220V 가전기기 제어하기 (Nano + ESP01 + Relay)  
   -  유튜브 자료 : https://youtu.be/GL2vqtW6ql8
   - 블로그 자료 : https://rasino.tistory.com/354

★☆★ ④ 【 IoT 실습을 위한 Lamp & 콘센트 만들기 】 ★☆★
   - 유튜브 자료 : https://youtu.be/5QBnhgkfkhE

 

【 이번 영상에서의 주요 목차 】

 ①  이 번 실습의 결과물
 ②  실습의 준비
 ③  회로 실습을 위한 연결 도면
 ④  실습을 위한 아두이노 IDE 필수 라이브러리 설치
 ⑤  실습 예제 파일로 테스트
 ⑥  Blynk 2.0  웹 대시보드 만들기 (DataStream & Web Dashboard)
 ⑦  아두이노 코드 토큰(Auth Token) 값 수정 후 업로드 하기
 ⑧  WiFi 핫스팟 연결하여 동작시키기
 ⑨  APP(앱) 제어 화면 만들기 & 동작
 ⑩  IoT Outlet 콘센트로 가전기기(선풍기 예시)를 웹과 앱에서 제어해 보기
 ⑪  문제해결

실습의 큰 흐름(목차)

 

【 ①  이 번 실습의 결과물 】

 

【  ②~③ 실습 준비와 회로 실습용 연결 도면 】

실습에 사용될 부품에 대한 자세한 내용은 아래 링크를 참고해 주세요
아래는 실습을 위한 연결 도면입니다. 
회로는 크게 LED와 같은 부품을 GPIO포트로 직접 제어하는 기본 실습 부분과, 릴레이 모듈을 통해 220V로 동작되는 가전기기를 제어하는 응용 부분으로 되어있습니다.


[도면 1]  LED Lamp 직접 연결한 도면,

지금처럼 전등 연결선을 작업하여 제어할 수도 있으나, 이는 가전기기마다 케이블 작업을 해야 하는 불편함이 있기 때문에 아래 '도면 2'처럼 콘센트(Outlet)를 개조하여 연결하게 되면, 가전기기마다 별도의 케이블 작업 없이 콘센트에 전자제품을 꽂는 것만으로 쉽게 제어할 수 있게 됩니다. 연결도에 보이는 재료를 준비하여 브레드보드에 연결해 주세요. 
(주의) ESP32 보드 중 DEVKIT V1이 아닌 경우, 핀 수 및 핀 배열이 다르므로 연결 시 확인이 필요합니다.

[도면 2]  콘센트(Power Outlet)에 릴레이(Relay)를 연결한 도면

LED와 같은 부품은 GPIO 출력 포트로 단순히 High, Low와 같은 신호로 제어가 가능합니다. 
하지만, 220V 레벨의 큰 전기는 릴레이라는 부품(모듈)을 사용해야 제어할 수 있습니다. 도면의 릴레이는 LOW 신호에 동작하는 릴레이인데요(LOW level trigger),   동작을 위한 릴레이의 완전한 LOW 레벨 처리를 위해 트랜지스터(TR)를 사용하였습니다(FET 대체가능). 
 D14로 신호가 출력되면 TR의 스위칭 작용으로 GND가(LOW) 릴레이의 IN으로 연결되는 구조입니다. 
그럼, 실습에 사용될 LED 램프 소켓과 릴레이가 결합된 제어용 콘센트 제작 방법은  아래 링크를 통해 확인해 주세요. 
★☆★ ④ 【 IoT 실습을 위한 Lamp & 콘센트 만들기 】 ★☆★
   - 유튜브 자료 : https://youtu.be/5QBnhgkfkhE

 

 

【 ④  실습을 위한 아두이노 IDE 필수 라이브러리 설치 (환경설정) 】

이번 챕터에서는 ESP32 보드 사용을 위한 전반적인 환경설정에 대해 다루고 있습니다.
이것이 ESP32 보드입니다. (DEVKIT V1 버전).  

ESP32 DEVKIT V1 Doit 보드

다른 버전의 esp32 보드와 기능과 성능은 거의 유사하지만, 핀 수나 조합이 조금씩 다릅니다.  다르게 말해서 esp32 보드는 여러 버전이 존재하지만, 사용법은 거의 유사합니다. 
DEVKIT V1 보드는 PC와의 통신을 위해 Silicon Labs사의 CP2102 통신칩을 사용하고 있습니다.(아래)

따라서, PC에 CP2102 통신칩 인식을 위한 드라이버를 먼저 설치해 주어야 보드를 인식할 수 있습니다. 
제어판 혹은 '윈도 + X' 키를 눌러 '장치관리자'를 열어 보세요.
CP2102 칩 드라이버가 문제없이 설치된 PC에는 이렇게 아래와 같이 COM 포트가 할 당 되는 것을 볼 수 있습니다.

1. 드라이버 설치를 하기 위해서는 영상에서와 같이 Silicon Labs를 검색하고, 실리콘 랩(Silicon Labs)의 CP2102 최신 드라이버를 다운로드하여 먼저 설치 후 esp32 보드를 연결해 보세요.
CP2102 드라이버 링크 : https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads
각자의 PC운영체제 환경에 맞는 드라이버를 받으세요. 

2. 아두이노 IDE에서 ESP32 보드를 사용하기 위해서는 ESP32보드를 인식할 수 있도록 환경설정 메뉴에서 esp32 보드 정보가 있는 링크를 추가해 주어야 합니다. 

환경설정 탭에서 추가적인 보드 매니저 URLs 부분에 아래 링크(경로)를 복사 붙여 넣기 하세요. (링크 2가지 중 하나만 링크하면 됩니다)  

링크 1 :  https://dl.espressif.com/dl/package_esp32_index.json

링크 2: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

 

 만약 기존에 다른 보드에 대한 URL이 이미 존재한다면, 우측에 있는 윈도창 모양의 아이콘을 누르면, 팝업창이 하나 더 뜨는데요, 거기 기존 링크 아래에 추가로 붙여 넣기 하면 됩니다.

 

① 이제 Blynk 서비스를 이용하기 위해서는 ,
 아두이노 IDE의 "라이브러리 매니저"창에서 아래와 같이 'blynk'로 검색하여 라이브러리를 설치해 주세요. (이미 설치되어 있다면, 생략하면 됩니다)

 

②  툴 》 보드 》 보드매니저에서 "esp32"를 검색하여 패키지를 설치해 주세요 

그럼 이렇게, ESP32 관련 보드 목록을 볼 수 있습니다. (아래)

목록에서, DOIT ESP32 DEVKIT V1을 선택해 주세요. 또한, 보드가 연결된 통신포트를 선택하세요.

 

【 ⑤  실습 예제 파일로 테스트하기 

[ 기본 실습 ]

▶ 파일 > 예제 > 01.Basics > Blink 예제를 선택하여 보드에 있는 LED를 깜빡여 볼게요.

보드 설정과 포트 설정을 한 번 더 확인하고 우선 업로드(&컴파일) 해 볼게요.
(※ 주의!) esp32 보드에 코드를 업로드할 때는 보드에 있는 Boot 버튼을 몇 초간 눌렀다 떼어야 업로드가 시작됩니다.

[기본 실습 예제 파일 다운로드 ]
1. Blink (빌트인 LED 기본 깜빡이기)

Blink.zip
0.00MB

2.  GPIO23(D23) 포트에 직접 LED를 연결하고 깜빡이도록 하기

LED를 연결하고, 코드내용을 아래처럼 23으로 바꾸어서 실행해 보세요.

ESP32 보드도 기본적인 사용법은 아두이노와 동일하기 때문에 아두이노를 사용해 보았다면 쉽게 다룰 수 있습니다. 

 

▶ WiFi 스캐닝 실습

그럼, ESP32의 핵심 기능인 WiFi를 사용해 볼 텐데요. 
우선, WiFi 스캐너 예제를 통해서 WiFi 기능을 테스트해 볼게요.

아두이노 IDE 메뉴에서  예제 》 WiFi  WiFiScan 예제 파일을 불러옵니다.
이 예제 파일은 보드 주변에서 잡히는 WiFi신호를 스캐닝하여 보여주는 예제 파일입니다.

 그다음, esp32 보드에 네트워크(WiFi)를 연결해 줄텐데요, 가장 편한 방법으로 폰의 핫스팟을 켜서 연결할 수 있습니다.
그럼 코드를 업로드하고 업로드 완료 되면, 시리얼 모니터를 열어서 확인해 봅니다.
( 마찬가지로,  코드 업로드 시에는 보드에 있는 Boot 버튼을 몇 초 길게 눌러주고, 코드 업로드 완료 후에는 재시작할 수 있도록  EN (enable) 버튼을 한 번 가볍게 눌렀다 떼주면 됩니다.)

[ WiFi Scan 코드 다운로드 ]

WiFiScan.zip
0.00MB

esp32의 WiFi 기능 테스트를 통해 주변 WiFi 신호를 스캐닝해 본 결과입니다. (아래)

 

⑥  Blynk 2.0  웹 대시보드 만들기 (DataStream & Web Dashboard)

[ 응용 실습 ]

그럼, 본격적으로 esp32 보드에 회로를 구성하고 Lamp와 콘센트를 제어하는 실습을 진행해 볼게요.

준비 사항으로 Blynk.io 사이트에 회원가입 후,  Cloud 제어화면(blynk.cloud)으로 접속을 해주세요. 
https://blynk.io      &  https://blynk.cloud

아래 연결도를 참고하여 연결해 주세요.

릴레이의 전원은 Vin핀을 통해 전원을 공급받을 수 있는데, 평소에는 Vin 핀은 보드를 동작시킬 수 있는 외부 전원공급 단자로 사용되기도 하지만,  esp32 보드의 마이크로5핀 단자로 전원을 공급받게 되면, Vin단자로 5V(약 4.5v)의 출력이 나오게 되어 전원 Output 단자로 사용할 수 있게 됩니다. 

회로 연결에 사용되는 브레드보드는 어떤 크기든 상관없고, 사이즈가 작다면 이렇게 두 개를 이어 붙여 사용할 수 있습니다.  다만 esp32보드의 폭이 다소 넓기 때문에, 브레드보드 하나를 사용하는 것보다 두 개 이상 붙여 사용하는 것이 작업상 편할 수 있습니다.

 

납땜을 제외하고 브레드보드에서 회로를 연결하는 방법에는 대략 아래 3가지 정도의 방법이 있습니다. 

1. 점퍼케이블을 이용한 회로 연결
2. 브레드보드 전용 점퍼케이블
3. Hook-UP Wire 를 이용한 연결

이 중에서 개인적으로 원하는 길이로 정확하게 잘라 쓸 수 있는 후크업(Hook-Up Wire) 와이어를 이용한 연결을 추천합니다.  이것은 회로를 더욱 간결하게 만들어 복잡한 회로도 파악하기 쉽도록 만들어 주며, 만들어진 결과물도 비록 납땜을 하지 않았지만, 단단히 잘 고정되어 있어 장기간 작품형태로 활용할 수 있어 좋습니다.  이때 이 세 가지의 선의 형태는 여러 가닥으로 뭉쳐진 연선이 아니라 하나의 단단한 단선이라는 것을 주의해 주세요.  일반적으로 브레드보드에 사용되는 단선의 내심 굵기는 22 AWG ~ 24 AWG 정도면 무난하게 사용할 수 있으며, 가급적 좀 더 굵은 22 AWG를 추천합니다. (AWG는 숫자가 작을수록 굵음)

아래는 회로 연결이 완성된 모습입니다. 

콘센트(Outlet)의 전원을 연결하게 되면, 릴레이의 COM / NO 단자 쪽에 220V의 전기가 흐르기 때문에 손으로 직접 터치되지 않도록 감전에 주의해 주세요. 

▶ 웹 대시보드 만들기 (WebDashboard)

웹 대시보드를 만들기 위해, https://Blynk.cloud 로 접속한 다음, 로그인해주세요.   

다음, 아래와 같이 Search 탭에서 + New Template를 클릭하세요. 

 

새 템플릿을 만들기 위한 기본 정보를 입력 및 선택해 주세요. 
HARDWARE에는 'ESP32'   /  CONNECTION TYPE에는 WiFi를 선택해 주세요

 

여기에서는 'Data Stream'  부분과 /  Web Dashboard 부분만 설정해 주면 완성됩니다.

먼저, 아래는 Data Stream 부분을 설정해 주는 모습입니다. 

 

아래처럼 LED1, LED2, Realy 이렇게 3개의 Data Stream을 만들어 주세요.   마지막에 Save 버튼을 눌러 마무리하면 됩니다. 

'Data Stream'은 Blynk 웹(앱)의 버튼으로 제어하기 위한 입출력 핀의 설정을 해주는 것이며,
'web Dashboard'는  Blynk 웹을 통해 제어할 수 있는 버튼들을 디자인하는 메뉴입니다.
그럼, 이제, Web Dashboard로 가서 제어를 위한 버튼 설정을 해볼게요.

먼저 LED에 대한 버튼 설정입니다.  위 이미지처럼 LED 위젯을 적당한 크기로 배치해 주세요.

Data Stream 메뉴에서 설정해 놓은 항목이 자동으로 뜨기 때문에, 선택만 정확히 해주면 쉽게 설정 가능합니다.

 

Data Stream 메뉴에서 설정해 놓은 항목이 자동으로 뜨기 때문에, 선택만 정확히 해주면 쉽게 설정 가능합니다.

지금 설정하는 LED 위젯은 On/Off를 위한 확인기능이기 때문에, 이제 LED를 실제 켜고 끄기 위한 스위치를 설정해 볼게요. 

그리고, LED 위젯과 마찬가지로 스위치(버튼) 위젯을 직접 끌어다 놓을 수도 있고, 어느 정도 설정된 위젯을 복제하여 좀 더 편하게 설정할 수도 있습니다. (아래)

아래와 같이 LED1 & Switch1  ,  LED2 & Switch2 위젯을 각각 배치해 주면 됩니다.

 

그럼 이제 릴레이(Relay)에 대한 위젯을 만들어 볼게요.
릴레이까지 다 동일한 방법으로 설정하게 되면 아래처럼 완성이 됩니다.   

모든 위젯을 설정한 후에는 화면 우측 상단에 있는 Save 버튼을 반드시 눌러 주세요. 

만약 다시 수정해야 한다면 이 버튼이 Edit 버튼으로 바뀌어 있을 것이고 따라서 Edit 버튼을 눌러 수정 후 다시 Save 하면 됩니다. 

 

이렇게만 하면 템플릿은 완성이 됩니다. 

Blynk를 활용하면 이렇게 복잡하지도 않고, 아주 쉽고 빠르게 웹 컨트롤 화면을 만들 수 있습니다. 

 

 ⑦  아두이노 코드, 토큰(Auth Token) 값 수정 후 업로드 하기

그럼, 아두이노 IDE로 가서 핵심 응용회로를 위한 Blynk 파일을 열어 볼 텐데요,  Blynk라이브러리를 설치하면, 함께 들어오게 되는 Blynk 예제 파일을 기본으로 조금만 수정해 주면, 제어용 코드가 쉽게 완성이 됩니다. 

예제 》 Blynk Boards_WiFi ESP32WiFi  예제를 클릭하여 여세요.

예제 파일을 열면 아래처럼 나타나는데요,  분홍 화살표 부분을 그 아래 이미지처럼 적절한 내용으로 바꾸어 주면 됩니다. 

 

Blynk Cloud 사이트에서 아래 분홍색 부분에 해당하는 TEMPLATE_ID,  DEVICE_NAME, AUTH_TOKEN 등을 복붙하면 됩니다. 

아두이노 코드 다운로드

ESP32_WiFi_APP_LED_LAMP.zip
0.00MB

주변 WiFi 또는 스마트폰의 핫스팟을 관련 ID와 패스워드를 입력해 주세요.  그런다음, 통신포트와 보드 선택이 제대로 된 것인지 확인 후 코드를 esp32 보드에 업로드해 주세요. 
코드 업로드 시,  Connecting... 표시가 뜨면 esp32에 있는 'Boot'스위치를 눌러 주세요. 

 

  ⑧  WiFi 핫스팟 연결하여 동작시키기

업로드 완료 후에는, 아두이노 IDE의 시리얼모니터 창을 열고서,  esp32보드에 있는  'Reset'스위치를 눌러 esp32 보드를 재시작시켜줍니다. 
그럼, 아래처럼, 스마트폰의 핫스팟으로 접속한 경우,  접속된 상황을 파악할 수 있습니다. 

 

  ⑧  WiFi 핫스팟 연결하여 동작시키기 

그럼, Blynk.cloud의 Search 탭으로 돌아가서 제어해 볼 텐데요. 
아래 부분이 Online으로 되어 있어야 연결이 제대로 된 것입니다. 
문제없이 Online이 되어 있다면,   LED 스위치들을 On/Off 시켜보세요. 

그럼, 이제 릴레이가 연결된 콘센트에 전원을 연결하고,  LED전등을 연결하거나 테스트할 가전기기를 연결하여 On/Off가 잘 되는지? 테스트해보세요. 

아래 모습은 USB선풍기이지만, 220V 어댑터를 사용하기 때문에 대부분의 가전제품은 동작시킬 수 있다고 보면 됩니다. 
이번엔, LED전등과 선풍기를 모드 콘센트에 연결하여 한 번에 작동시켜 보세요.

네, 아주 잘 작동됩니다.

한 번에 작동시킬 수 있는 용량은 릴레이가 견딜 수 있는 용량(스펙)에 따라 결정되어집니다.  여기서는 250 VAC , 10A 짜리를 사용했습니다. 

 

  ⑨  APP(앱) 제어 화면 만들기 & 동작 


그럼 이번엔 Blynk App을 이용해서 스마트폰에서 제어해 볼게요. 

스마트폰에서 Blynk iot 앱을 검색 후 설치하고 로그인해 주세요. 
Blynk 앱 메뉴 중에서 설정 메뉴를 터치하고 'Developer Mode'를 선택하세요. 

여러 가지 위젯 중에서 'LED'를 선택하고, 2-3초간 눌러 적절한 위치에 끌어다 놓으세요. 

그리고 위젯을 터치하면 세부 설정을 할 수 있습니다.

Blynk Cloud에서 설정해 놓은 DataStrem이 자동으로 뜨는 것을 볼 수 있는데요, 나머지도 똑같은 방법으로 LED와 스위치를 영상을 따라 설정해 주세요. 

나머지도 똑같은 방법으로 LED와 스위치를 영상을 따라 설정해 주세요.

옵션 중에, 스위치 옵션에서 'Push'는 누르고 있는 동안만 On이 되는 방식이고,  'Switch'는 누를 때마다 On/Off가 토글 되는 방식입니다.  (여기서는 터치할 때마다 On/Off가 교대로 되는 Switch 방식으로 선택했습니다.)

(아래) 마지막으로 뒤로 가기(←)와 'X'표시를 눌러 설정 메뉴를 빠져나오면 이제 실행할 수 있는 모드가 됩니다.  

참고로, 스마트폰의 App과 웹에서는 동시에 연동이 됩니다.   

  ⑩  IoT Outlet 콘센트로 가전기기를 웹과 앱에서 제어해 보기

아래는 동작을 실행한 모습인데요, App과 웹에서 서로 연동되며 잘 작동합니다.

 

   ⑪  문제해결 

본 실습을 진행하면서, 동작이 안 되는 놓치기 쉬운 몇 가지 부분에 대해 짚어드리고자 합니다.  
가장 먼저, Blynk웹에서 esp32가 연동이 안 되는 Offline 상태가 되는 문제가 있습니다.

문제&해결법 1.  여러분의 esp32가 접속된 WiFi가 방화벽등 연결이 제한된 경우가 아닌지 확인해 보세요 (만약, 외부에서 집안에 있는(사설 IP) esp32 기기 제어는 WiFi 라우터의 포트-포워딩 또는 DMZ 설정을 해야 함)

문제&해결법 2.  점선 박스에 있는 TEMPLATE_ID 등의 내용이 코드와 일치하는지 확인해야 합니다. 

이 부분이 일치하지 않으면, 서로 연결이 되지 않습니다.   
또한, TEMPLATE_ID는 코드에서 제일 상단에 위치해 있어야 Blynk2.0 서비스로 제대로 인식하게 됩니다. 

해결법 3.  Templates 편집 메뉴가 아니라, Search 탭에 있는 Dashboard에서 실행하는 것입니다.

Templates 탭의 Web Dashboard는 편집 메뉴의 미리 보기 같은 것이기 때문에 실행하는 메뉴가 아닙니다.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

이렇게 해서 esp32 모듈에 릴레이를 이용한 콘센트와 Blynk 서비스를 이용하여 멋진 IoT 작품을 만들어 보았습니다. 

WiFi에 접속만 가능하다면 실생활에 바로 응용할 수 있어 활용도가 높기 때문에 꼭 한 번 만들어 보세요.

감사합니다.

아래 링크는 유튜브 영상으로 쉽게 따라 할 수 있도록 하였으니 참고하세요~  (링크 준비 중)

 

 

 

 

 

 

 

반응형
반응형

안녕하세요. 
라즈이노 ioT입니다.

이번 시간에는 Blynk2.0 업그레이드 강의 세 번째 시간으로 Nano 보드에 ESP01 WiFi 모듈을 연결하여 LED와 LED 전등 & 콘센트 제어를 통한 가전기기들을 제어해 보도록 하겠습니다. 
보드의 입출력 포트에 연결된 LED제어는 물론이고, 릴레이를 사용하면, 220V 전기를 사용하는 LED 전등 제어도 가능합니다. 뿐만 아니라, 릴레이 모듈을 Outlet 콘센트에 직접 연결해 놓으면 220V 전기를 사용하는 대부분의 가전제품을 On/Off 제어할 수 있습니다. 

그리고 더 놀라운 것은 스마트폰의 앱에서만 아니라 Blynk2.0으로 업그레이드되어 웹 접속이 되는 어느 곳이든 웹페이지에서도 실시간으로 제어하고 상태를 확인 할 수 있게 되었습니다. 
더구나, 블링크(Blynk)는 시스템을 구축하기 위해 어렵고 복잡한 코딩이 필요치 않기에 누구나 손 쉽고 빠르게,  자신이 원하는 IoT 시스템을 만들 수 있어 매우 좋습니다. 

그럼, 이번 영상을 통해 자신만의 IoT 시스템을 재미있게 만들어 보세요~!

참고로, 이 프로젝트를 위해서는 더보기에 링크해 드리는 두 개의 필수 영상을 함께 참고해야 합니다. 

 

【 실습을 위한 사전 학습 자료 】


① #1 실습1) 펌웨어업뎃 & Blynk실습,  LED On/Off  WiFi 제어하기! 1편
    - 유튜브 자료 : https://youtu.be/-NdOR-hsR_4
    - 블로그 자료 : https://rasino.tistory.com/335
② #5 실습5) ESP01WiFi로 '220V 전등/가전기기' 제어하기! 
   -  유튜브 자료 : https://youtu.be/JfF4oPhn_gA
    - 블로그 자료 : https://rasino.tistory.com/335

【 Blynk Cloud  Off Line & "Invalid auth token" error 에러 해결방법 】

  - https://rasino.tistory.com/350

 【  블링크2.0에서 기존 프로젝트(템플릿) 삭제하는 방법 /Delete Templates】

  - https://rasino.tistory.com/352   

 

【 이번 영상에서의 주요 목차 】

 ①  이 번 실습의 결과물
 ②  실습의 준비
 ③  회로 실습을 위한 연결 도면
 ④  실습을 위한 아두이노 IDE 필수 라이브러리 설치
 ⑤  실습 예제 파일과 코드 해설
 ⑥  Blynk 2.0  웹 대시보드(Web Dashboard) 만들기 (DataStream & Web Dashboard)
 ⑦  아두이노 코드 토큰(Auth Token) 값 수정 후 업로드 하기
 ⑧  WiFi 핫스팟 연결하여 동작시키기
 ⑨  APP(앱) 제어 화면 만들기 & 동작
 ⑩  Outlet 콘센트로 가전기기(선풍기 예시) 제어해 보기
 ⑪  최종 완성된 작품 두 가지를 하나의 앱과 웹에서 함께 동작시켜 보기

 

【 ①  이 번 실습의 결과물 】

 

【  ②~③ 실습 준비와 회로 실습용 연결 도면 】

실습에 사용될 부품에 대한 자세한 내용은 아래 링크를 참고해 주세요
아래는 실습을 위한 연결 도면입니다. 

여기서는 ESP01-전용 어댑터를 이용해서 실습하게 되는데요,  만약, 이 어댑터가 없다면, 앞서 소개드린 영상이나,
아래  링크를 참고하면, 다른 방법으로도 해결할 수 있어요.
#Blynk+Nano+Esp-01 풀코스 학습자료 : https://rasino.tistory.com/335
어댑터 모듈뿐 아니라 릴레이 모듈이나 다른 부품에 대해서도 상세한 설명이 나와 있으니 꼭 참고해 보세요. 

 

【 ④  실습을 위한 아두이노 IDE 필수 라이브러리 설치】

아두이노 IDE의 "라이브러리 매니저"창에서 아래와 같이 'blynk'로 검색하여 라이브러리를 설치해 주세요.

 

【 ⑤  실습 예제 파일과 코드 해설 】

그럼, 나노 보드에 업로드할 코드에 대해 설명드릴게요.  먼저, Blynk 라이브러리를 설치하게 되면, Blynk 관련 예제 파일들이 설치되는데요, 화면에 보이는 ‘ESP8266_Shield’ 예제 파일을 열어서 약간만 수정하면 됩니다. 


코드의 크기가 한 페이지도 안 되는 코드로 IoT 작품을 만들 수 있다니 정말 놀랍습니다. 

중요한 점 몇 가지만 설명드릴 텐데요, 
뒤에 나오는 Blynk Cloud에서 설정을 통해 얻게 되는 TEMPLATE ID와 NAME, AUTH TOKEN 값들을 이 부분에 복사, 붙여 넣기 해야 합니다. 
그리고 이 값들은 Blynk 관련 라이브러리보다 위쪽에 배치해야 하는데요, 그렇지 않을 경우 Blynk2.0 서버가 아닌 이전(Legacy) 서버로 접속되어 제어되지 않게 됩니다. 하지만 그렇게 배치했음에도 불구하고 “Invalid auth token”에러를 계속 표시하며 서버로 접속되지 않을 때는 기존 예제 코드에서 이 부분, “blynk.cloud”, 80을 추가해 주면 해결됩니다.

이 부분에는 여러분이 접속 가능한 주변 WiFi 혹은 스마트폰의 핫스팟 ID와 패스워드를 입력하세요.

그리고,  SoftwareSerial EspSerial(7,6) 이 부분에는
나노에 연결된 ESP01 어댑터 모듈의 소프트웨어 시리얼 통신 핀 번호를 적어줍니다.
그리고, 여러분이 갖고 있는 esp01 모듈의 보-레이트(Boud-rate)를 정확히 적어주세요. 
#define ESP8266 BAUD 9600
이 보-레이트가 일치하지 않으면 WiFi 통신이 되지 않습니다. 
보-레이트를 알기 어렵다면, 9600 또는 115200 둘 중 하나로 해보세요. 
그럼 이제, 조립된 작품에 코드를 업로드하고,  Blynk.Cloud에서 웹 대시보드를 만들어 볼게요
코드는 앞서 안내해드린 것처럼, Blynk 라이브러리에 포함된 예제를 기본으로 조금 변경해 주면 되는데요,
아래가 편집된 코드 예시이니 참고하세요. 
우선 아래 코드를 다운로드하고 Template ID,  Auth Token , WiFi ID, 비번,  ESP01 보-레이트 등등을 수정하여 업로드하면 됩니다. 

//////////////////////////////////////////////////////////////////////////////////
// *** 라즈이노 IoT Blynk2.0 + Nano+ESP01 실습, 릴레이모듈+전등 제어하기 *** 
// 실습 : Blynk 2.0 시스템에 릴레이 모듈을 연결하고 LED 및 220V용 LED전등을 제어해 보기!
// 사용방법 및 추가 자료 다운로드 
// 게시글    :  https://rasino.tistory.com/  
// 유튜브영상 : https://www.youtube.com/channel/UClO79Cpq72VI63MwGi6VoQw
//////////////////////////////////////////////////////////////////////////////////
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLtjtKWif1"
#define BLYNK_DEVICE_NAME "Nano ESP01 LED Control"
#define BLYNK_AUTH_TOKEN "DamL2Z3CQqS4NbU0UAlxbk86uE5VjSlK"

#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "myGalaxy";
char pass[] = "12345678";    // 만약 패스워드 없는 WiFi라면,  ""로 입력하세요
#define EspSerial Serial1
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(7, 6); // RX, TX , 나노에 연결된 소프트웨어 시리얼 통신 단자.
// 중요! 여러분이 갖고 있는 ESP01 모듈의 펌웨어에 설정된 보드레이트에 맞추어야 합니다
// 보통의 경우는 9600 이며, 안 되면, 115200으로 해보세요.(esp01 펌웨어 버전에 따라 다름)
// esp01-펌웨어 업뎃 및 AT통신 설정 관련 된 사항 참고 : https://rasino.tistory.com/297
#define ESP8266_BAUD 9600

ESP8266 wifi(&EspSerial);

void setup()
{
// 아두이노 IDE의 시리얼 모니터와의 통신속도입니다. 아무속도나 상관 없음
  Serial.begin(9600);
  delay(10);
  EspSerial.begin(ESP8266_BAUD);
  delay(10);
  Blynk.begin(auth, wifi, ssid, pass, "blynk.cloud",80);
}

void loop()
{
  Blynk.run();
}

Blynk 2.0 서버로 접속되지 않는 에러를 방지하기 위해, “blynk.cloud”, 80을 추가해 주세요.

《 코드 다운로드 》

Blynk2_ESP01_Relay_LED_Lamp.zip
0.00MB

Blynk를 이용하면, 보이는 것처럼, 아두이노 코드가 복잡하지 않아 매우 쉽게 작품을 구현할 수 있습니다.

【 ⑥  Blynk 2.0  웹 대시보드(Web Dashboard) 만들기 (DataStream & Web Dashboard) 】

그럼, 가입된 Blynk.Cloud 사이트에 접속 후 로그인하세요. 
아래 이미지처럼, 화면 메뉴 좌측에 보이는 Templates 메뉴를 선택하세요.

중앙에 보이는  + New Template을 클릭하고, 이미지의 내용으로 입력해 주세요.

 입력 완료 후, Done을 클릭하면  기본 템플릿이 만들어지는데요, 상단에 보이는 메뉴 중에서 Data Streams과 Web Dashboard 만 작업해주면 됩니다. 
그럼 Data Streams 탭을 선택하고, +New Datastream에서  Digital 항목을 클릭하세요. 


그리고 아래 이미지를 참고하여 내용을 입력하세요. 

 

LED 2에 대해서도 같은 방법으로 만들어 주세요.

 

 

마지막으로 LAMP(전등)에 연결된 Relay 제어를 위해 Data Stream을 추가해 볼게요.

 

그럼, 이제 Web Dashboard로 가서 컨트롤 화면을 구성해 볼게요.

화면 구성은, LED 1, 2, LAMP에 대해 ON/OFF를 확인할 수 있는 LED 표시와 제어하는 스위치로 구성했습니다.
아래 이미지를 참고하여 설정해 보세요. 

 

LED2에 대해서는 복제(복사)를 해볼 텐데요, 유사한 패턴의 경우 복제 버튼을 이용하면, 좀 더 편하게 작업할 수 있습니다. 

그리고 복제된 위젯의 설정으로 들어가서 아래처럼 옵션을 선택, 입력해 주세요.

 

LED2의 스위치 세팅도 동일한 방법으로 해주시고, 

Relay에 연결된 Lamp에 대한 표시등도 LED 위젯을 이용해서 만들어 주세요. 
그리고 아래와 같이 Relay Lamp 켜고 끄기를 위한 스위치를 만들어 주세요. 

아래 이미지처럼 완성이 되었다면,  이제 Search 탭으로 가서, + New Device를 클릭하고, 조금 전에 만든 Template를 연결해 주세요. 

 

그럼, 이렇게  Autu Token 값 등이 만들어지고, 이 값들을 복사해서 아두이노 코드 상단에 붙여 넣기 합니다.

 

【 ⑦  아두이노 코드 토큰(Auth Token) 값 수정 후 업로드 하기 】

 이렇게 완성된 코드를 가지고  보드를 연결하고 코드를 업로드하세요. 

ESP01 모듈이 연결되어 있는 상태에서 코드를 업로드할 경우 업로드 에러가 종종 발생하니, 잠시 제거하고 업로드해보세요.

’Window’키 + ‘X’ 단축키로 장치 관리자를 열어  Nano보드가 연결된 포트를 정확히 확인해 보세요. 

네 26번 포트에 연결되어 있네요. 그럼, 업로드를 위해 보드와 포트를 정확히 선택해 주세요. 

대부분의 호환 Nano 보드의 경우 프로세서는 “ATmega128P (Old Bootloader)를 선택해야 업로드됩니다

그럼, 업로드해 보세요. 

 

【 ⑧  WiFi 핫스팟 연결하여 동작시키기 】

이제, ESP-01 모듈을 연결해 주세요. 코드에 입력한 대로,  주변 WiFi 또는 핫스팟을 연결해 주세요.
Nano 보드의 리셋을 눌러주면, 핫스팟에 연결되고 시리얼 모니터를 통해 IP를 할당받는 것을 볼 수 있습니다. 
잘 안된다면, 시리얼 모니터를 새로 열거나 ESP01 모듈을 제거 후 다시 연결해 보세요(접촉 불량 가능성)
네, 보이는 것처럼 Ping 테스트까지 완료되어야 연결에 문제가 없습니다

그리고  Search 탭에서(중요!) 동작시켜 보면, 아래처럼, LED가 화면 클릭할 때마다 동작이 잘 되는 것을 볼 수 있습니다.

그럼, 220V LED 램프도 테스트해보기 위해,  220V 전원을 연결하고 테스트해 보세요. 

네, 위 이미지처럼, 동작은 잘하는데요,  다만, 스위치가 ON 신호에 램프가 꺼지고, 스위치 OFF 신호에 램프가 켜져서 반대로 동작합니다. 
그 이유는 Relay 모듈이 Low신호에 동작하는 Active-Low 모듈이어서 그렇습니다. 
이 문제는 DashBoard에서 On/Off 스위치 설정을 반대로 해놓으면 간단히 해결할 수 있습니다. 
그럼, Templates 탭의 편집(Edit)으로 들어가서 Lamp 버튼의 설정을 바꾸어 볼게요. 


ON과  OFF의  논리 값을 반대로 바꾸어 주세요 ( 1 -> 0 , 0 -> 1 )

컬러도 반대 효과를 주기 위해 검정식으로 바꾸어 볼게요 ( 검정 -> 꺼짐 , 흰색 -> 켜짐 ) 

저장하고 Search 메뉴에서 다시 실행해 볼게요.

네, 이제 ON OFF가 일치하며 잘 동작됩니다. 
그럼, 이제 PC 연결 없이 배터리로도  IP 할당받으며 잘 동작하는지 아래 이미지처럼, 확인해 보세요. 

그럼, 이제 앱 화면도 설정하여 제어해 볼게요.
Blynk ioT ( 2.0 버전에 해당되는 앱) 앱을 다운로드하고 로그인하세요. 
Blynk Cloud에서 템플릿을 만들면 자동으로 같은 이름의 빈 템플릿이 보이는데요, 터치하세요. 


개발자 모드로 진입하고,  바닥의 빈 공간 또는 + 키를 눌러 주세요.  


앞서 보았던 동일한 모양의 위젯들이 보입니다. 
LED 위젯을 터치하세요. 


위젯을 2~3초간 누르고 있으면 위치를 옮길 수 있고 사이즈 변경도 가능합니다. 


LED 1에 대한 설정을 영상처럼 해주세요. 

이어서, LED 2에 대한 설정도 동일하게 합니다. 

이제, LED 1에 대한 스위치를 만들어 볼게요

PUSH 옵션은 계속 누르고 있을 때만 On 되는 옵션이며, SWITCH는 터치할 때마다 번갈아 On/Off 됩니다.

마지막으로 LAMP는 스위치만 만들어 볼게요.

스위치 배치 완료된 모습

역시 여기서도 LAMP 스위치는 Low 신호에 On 표시되도록 1과 0의 위치를 바꾸어 줍니다.

이제 개발자(설정) 모드에서 빠저나가기를 누르면 실행 모드가 됩니다.

【  ⑨  APP(앱) 제어 화면 만들기 & 동작 】

네, 아주 잘 작동되며, 웹과의 연동도 잘 됩니다.

 

【 ⑩  Outlet 콘센트로 가전기기(선풍기 예시) 제어해 보기】

그럼, 이전 영상에서 만들었던 Outlet 콘센트도 테스트해 보겠습니다.

Outlet 콘센트의 상세한 제작 영상은 더보기 링크를 참고해 주세요. 
여기에도 똑같은 코드를 올려주면 되는데요,   Esp01 모듈을 탈거하고 업로드해 볼게요.

ID와 Auth Token 값들이 일치하면 같은 화면에서 제어할 수 있습니다.

Outlet 작품도 배터리를 이용해서 동작시켜 볼게요.

현재 두 개의 WiFi 모듈이 접속(IP 할당) 되어 있는 것을 볼 수 있습니다.

그럼, Outlet에 대한 Data Stream을 템플릿 탭에서 추가해 볼게요.

Teamplate 탭에 있는 Edit(편집)를 누르고 영상을 따라 설정해 주세요.

Outlet에서도 켜고 끄는 스위치 버튼 하나만 추가해 볼게요.

네, 이제 모든 준비는 끝났고, 두 개의 다른 작품을 하나의 폰에서 제어해 볼게요.

 

미니 선풍기라 하더라도  220V 콘센트로 제어하기 때문에 220V 전기를 사용하는 거의 대부분의 가전기기도 제어된다고 보면 됩니다.

그럼, Outlet 콘센트 전원을 연결해 볼게요.

릴레이가 Low(꺼짐) 신호에 동작하니, Outlet 스위치 역시 반대로 설정해 볼게요.

네, 잘 동작되는데요,  폰에서도 스위치를 추가하여 제어해 볼게요.

여기서도 On / Off 설정을 반대로 바꾸어 놓을게요.

 

【 ⑪  최종 완성된 작품 두 가지를 하나의 앱과 웹에서 함께 동작시켜 보기 】

그럼 실행시켜 볼게요.

네, 이렇게 해서 Blynk2.0을 이용해서 웹과 폰에서 LED, 전등, 가전기기 등을 제어해 보았습니다.

릴레이를 이용하면 220V와 같은 가전기기들의 On/Off를 제어할 수 있어, 응용하기 매우 좋습니다.

그럼, 지금 나오는 관련 영상들을 함께 참고해서 활용하기 좋은 작품들을 만들어 보세요.

감사합니다~

【 모든 작업과정 동영상으로 보기 】

 

반응형
반응형

 ※ 본 게시물의 모든 이미지는 클릭하면 확대되어 선명하게 확인 가능합니다!

【 How to Display temperature& humidity of DHT11 on a smart phone! 】

# Blynk2.0 은 WiFi 컨트롤 기능을 App뿐 아니라, Blynk Cloud라 하여 웹에서도 제어할 수 있는 기능을 제공하고 있습니다. 
또한,  복잡하고 어려운 코딩이나 함수 사용 없이 매우 쉽게 IoT 시스템을 구축해 주는 멋진 시스템입니다. 

여기에서는 WiFi기능을 가진 나노 33 IoT 보드를 사용하고 있으며, ESP8266 보드류 혹은 ESP32 보드 등으로도 바로 적용 가능합니다. 

이 강의는 시리즈로 제작되며,  전체 학습 내용은 아래와 같습니다.
======================================================
시리즈 전체 실습 내용(예정)
1. Nano33 ioT & Blynk2.0으로 LED On/Off 하기. (업로드 완료)
2. Nano33 ioT & Blynk2.0 으로 DHT11 센서 온도/습도 출력하기.(본 게시글)
3. ESP01 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기. (예정)
4. ESP8266 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기.(예정)
5. ESP32 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기.(예정)
======================================================

【 실습을 위한 사전 학습 자료 】
① Nano33 IoT 처음 사용설명서 1편
    - 유튜브 자료 : https://youtu.be/QwrgDjs4qBc
    - 블로그 자료 : https://rasino.tistory.com/301 
② Nano33 IoT 처음 사용설명서 2편
   -  유튜브 자료 : https://youtu.be/IODHpewucU4
    - 블로그 자료 : https://rasino.tistory.com/310
③ 【 Blynk 2.0 사용법 #1】 Nano33 ioT으로 LED On/Off  제어하기
   -  유튜브 자료 : https://youtu.be/4GZox37rXwg
    - 블로그 자료 : https://rasino.tistory.com/353

【 Blynk Cloud  Off Line & "Invalid auth token" error 에러 해결방법 】
  - https://rasino.tistory.com/350

 【  블링크 2.0에서 기존 프로젝트(템플릿) 삭제하는 방법 /Delete Templates】
  - https://rasino.tistory.com/352   

【 주요 목차 】
  ①  Blynk 2.0 서비스 소개 & 사용 이유
  ②  회로 연결 도면 및 실습 준비
  ③  실습을 위한 아두이노 IDE 필수 라이브러리 설치(4가지)
  ④  기존 템플릿(Templates) 삭제 방법
    데이터 스트림(Data Stream) 핀을 GPIO Pin으로 설정하기 설명

    Blynk Cloud (blynk.cc) 설정 & 웹 대시보드 만들기(Dash Board)
  ⑦  버추얼 핀(Virtual Pin) 개념 설명 & 온도/습도 가상 핀 설정하기
  ⑧  웹 대시보드(Web Dashboard) 핀 설정하기 설명
  ⑨  새 디바이스(New Device) 추가하기 설명
  ⑩  실습을 위한 Nano33 & DHT11용 Blynk 예제 파일 만들기
  ⑪  Nano33 ioT 보드에 코드 업로드 하기 & 핫 스팟 연결하기
  ⑫  동작 확인하기 (Arduino IDE Value & Web Dashboard)
  ⑬  Blynk IoT App에서 Dash Board(대시보드) 설정하기

 

【  ①  Blynk 2.0 서비스 소개 & 사용 이유


 최근 Blynk 서비스가 2.0으로 바뀜에 따라, 현재 가입하려는 분들은 반드시 2.0 시스템으로 사용법을 익히셔야 합니다.
기존에 사용하던 Blynk앱 시스템은 이용자의 폭주와 웹 연동 서비스를 제공하기 위해 Blynk 2.0 시스템을 오픈하였습니다.

물론 기존 Blynk 시스템도 유료 서비스를 이용하던 사용자가 있기 때문에 서비스가 유지되고 있지만,  Blynk 신규 가입자는 반드시 Blynk2.0을 이용해야 합니다. 
다만, Blynk2.0의 경우 국내 자료가 아직 부족하고 사용법이 기존과 달라 접근하기가 쉽지 않습니다.
그래서, 기본 사용법을 익히실 수 있도록 본 게시글을 준비했으니 차근차근 따라 해 보시기 바랍니다.
현재 Nano33 ioT 보드로 기본 실습들을 구성했지만, esp8266 보드나 esp32 보드 들도 이 글을 참고하면, 동일하게 활용 가능합니다.

Blynk 앱을 검색해 보면, 기존(legacy) 앱과 Blynk2.0인 Blynk IoT앱 두 가지를 볼 수 있습니다. 
Blynk 2.0에서는 Blynk Cloud라 하여 웹에서도 아래처럼 컨트롤 버튼을 만들어 제어할 수 있고, 

  Blynk의 가장 큰 장점은 어려운 앱 개발 코딩이 필요 없다는 것과 쉬운 클라우드 서버 툴을 제공하기 때문에 웹코딩이 필요 없으며, 센서 및 회로 제어에 필요한 복잡한 아두이노 함수들을 자체적으로 처리해 주기 때문에 매우 쉽고 빠르게 IoT 응용 작품들을 구축할 수 있습니다. 다만, 동시에 2개의 프로젝트(템플릿)까지만 무료로 제공되며, 추가적인 프로젝트나 고급 위젯 Box를 이용하고자 한다면, 일정 비용을 지불해야 합니다.              
단, 먼저 만들어진 프로젝트를 삭제하면 새 프로젝트를 계속 만들 수 있어요)   
물론, 월 이용료 등의 일정 비용을 지불하면 상업용으로도 손색없는 IoT 시스템을 구축할 수 있을 것으로 생각됩니다.

【 ②  회로 연결 도면 및 실습 준비 】

먼저, 화면과 같은 부품을 준비하여 회로를 연결해 주세요.

[ 연결도면 다운로드 ]

nanoIoT33_DHT11_Blynk2.0연결도.png
0.39MB

Nano33 ioT는 핀 배열이 Nano 보드와 거의 동일한데요, Nano 보드처럼 사용하기 쉽고 WiFi 모듈까지 내장되어 있어 활용하기 좋은 보드입니다.  Nano33 ioT 보드의 상세 설명과 사용법은 위에 링크해 드린, “처음 사용설명서 #1~#2”편을 참고해 보세요. 

   실습을 위한 아두이노 IDE 필수 라이브러리 설치(4가지) 】

그럼, 아두이노 IDE에 필요한 필수 라이브러리 3가지 및 DHT11 센서 사용을 위한 라이브러리 추가로 해서 4가지를 설치해 주세요.
1. ‘보드 매니저’에서 SAMD 또는 NANO 33으로 검색해서 보드 인식을 위한 라이브러리를 설치합니다.
nano 33으로 검색할 때는 중간에 공백을 주어야 합니다. 
그리고, 라이브러리 매니저가 아니라 보드 매니저입니다. Nano 33 ioT는 SAMD21G18A 칩을 MCU로 사용하고 있는 보드입니다. 

SAMD 또는 NANO 33 으로 검색 후 설치

 

2. ‘라이브러리 매니저’에서 NINA 또는 WIFININA로 검색하여 WiFi 통신을 위한 라이브러리를 설치합니다.

WiFi 통신을 위한 NINA 라이브러리

 

3. ‘라이브러리 매니저’에서 blynk로 검색하여 BLYNK 라이브러리를 설치합니다.

BLYNK 함수 사용을 위한 라이브러리 설치

 

4. ‘라이브러리 매니저’에서 'DHT'로 검색하여 Adafruit 사에서 제공하는 DHT 센서용 라이브러리를 설치합니다.

그럼, 이제 모든 준비 사항은 끝났으며, LED1과 2를 웹과 앱을 통해 직접 제어해 볼게요.

아래는 실제 연결된 회로 모습입니다.  점퍼선을 이용해도 좋지만,  이렇게 굵은 단선으로 길이에 맞추어 연결하면 훨씬 간결하고 튼튼하게 오랫동안 유지됩니다.

《 DHT11 센서 스펙 》

만약, 좀 더 정밀한 데이터를 원한다면, 아래 이미지와 같은 소수 첫 째 자리까지 출력되는 DHT22 센서를 사용하면 됩니다. 



【 ④ 기존 템플릿(Templates) 삭제 방법

Blynk 서비스는 템플릿(프로젝트) 2개까지는 무료로 이용할 수 있습니다.  따라서, 여러 가지 다양한 프로젝트 연습을 위해서는 기존 만들었던 템플릿을 삭제하면서 진행하면 되는데요,  삭제하는 방법에 대해 간단히 설명드립니다. 
만약 현재 만들어 놓은 템플릿이 없더라도, 추후에 삭제 과정이 필요하니 미리 봐 두면 도움 될 것입니다. 
 템플릿 삭제하는 내용은 아래 게시글에 별도로 올려놓았으니 참고해 보세요. 

▶ 템플릿 삭제하는 방법 :  https://rasino.tistory.com/352

 

⑤  Blynk Cloud (blynk.cc) 설정 & 웹 대시보드 만들기(Dash Board)

먼저, 아래 이미지처럼 좌측의 템플릿 탭을 클릭하고 이미지 우측 상단에 보이는 + New Template를 클릭하세요.

이어서 나타나는 아래 이미지처럼 각각의 항목을 선택하고, DESCRIPTION에는 간단한 설명을 입력하면 되는데요,  제목과 디스크립션에는 특수 문자나 기호는 입력하면 에러가 나고 다음으로 넘어가지 않으니 특수문자 및 기호는 입력하지 마세요. 

 

⑥  데이터 스트림(Data Stream) 핀을 GPIO Pin으로 설정하기 설명

이제, 데이터 스트림(DataStreams)과 웹 대시보드(Web Dashboard)만 설정해 주면 되는데요,   그전에 먼저, Digital 핀으로 로 사용 설정 시 선택해야 하는 핀 번호에 대해, 중요하니 짚고 넘어가 볼게요. 
아래 이미지에 보이는 Digital Pin과 Analog Pin의 경우는 아두이노 보드의 물리적인 핀을 그대로 연결 사용한다는 의미를 가지는 데요, 

직접 아두이노를 제어하듯 보드에 있는 핀 번호를 선택하면 블링크 서버(함수)를 통해 제어됩니다.
한 가지 주의해야 할 것은 DataStream의 Digital 핀 숫자는 보드 표면에 적힌 핀 번호가 아니라 GPIO 핀 번호와 일치되어 있습니다. 따라서 GPIO를 사용하는 nodeMCU와 같은 보드에서는 D0, D1, D2  등의 핀번호가 아니라, 입출력을 기준으로 매겨진 GPIO 핀 번호와 일치되어 있습니다. 
즉, D1핀에 연결된 LED 같은 것을 제어하려 한다면, DataStream에서 숫자 1을 선택하는 것이 아니라, GPIO 핀 번호인 숫자 5(GPIO5)를 선택해야 제어가 되니 주의하세요. 
( ※ 단, 우노와 나노 보드류는 GPIO 구분 없이  핀 번호 그대로 사용합니다 )

 

다음은 가상 핀(Virtual Pin)에 대한 설명입니다.

Virtual Pin의 경우 물리적 핀의 경우처럼 사용이 가능하지만, 주로 센서와 같은 값들을 WiFi를 통해 전달받아 앱 혹은 웹의 대시보드에서 쉽게 모니터링할 수 있도록 만든 가상 핀입니다. 
마치 아두이노 IDE의 시리얼 모니터에서 센서 값을 확인하는 것처럼, WiFi 무선을 통해 확인하기 편하도록 한 것입니다.
또한, 가상 핀을 최대 256개까지(V0~V255) 사용할 수 있도록 되어 있어 확장성이 좋습니다. 따라서, 이번 실습에서는 이 가상핀을 이용해 DHT11의 온도와 습도 데이터를 전달받아, 앱과 웹의 대시보드에서 확인할 수 있도록 실습을 진행합니다. 

【    Blynk Cloud (blynk.cc) 설정 & 웹 대시보드 만들기(Dash Board) 】

아래 이미지를 따라, 각각의 내용을 입력해 주세요.

ALIAS는 NAME을 영문으로만 입력하면 자동으로 입력됩니다.  한글과 혼용 입력 시는, 직접 영문으로 Temp라고 입력해주면 됩니다. 
가상 핀은 어떤 핀이든 사용하면 되고, Data type은 정수형(integer)을 선택하세요.
만약, DHT22와 같은 소수점 값 처리가 필요한 센서를 사용할 경우, Double을 선택하면 되고, 아두이노 코드에서는 Double 또는 float형을 사용하면 됩니다. 
단위는 섭씨온도일 경우 Celsius(℃) , 화씨는 Fahrenheit(℉)를 검색하세요. 
온도 값을 표시할 게이지의 전체 범위를 지정할 텐데요, 0℃ ~ 60℃의 범위로 지정해 볼게요. 

마지막으로  Create를 클릭하면 온도 값 처리를 위한 DataStream이 하나 만들어집니다.

그럼, 습도에 대한 DataStream을 생성하기 위해  +New Datastream을 클릭하세요.

아래 이미지를 참고하여 역시 동일한 방법으로 습도에 대해 입력해 주세요.

습도는 퍼센트(Percentage, %)로 표시하므로 Per...로 검색해 보세요. 
표시될 게이지의 범위는 0~100%로 합니다.

이렇게 해서 DataStream이 준비되었고, 아래처럼, 되어 있는지 보세요. 

 

  ⑧  웹 대시보드(Web Dashboard) 핀 설정하기 설명

그럼, 이제 웹 Dash Board를 만들어 볼게요. 
웹 Dashboard는 웹에서 컨트롤할 수 있는 제어 보드를 의미하고, 추가적으로 앱에서도 연동하여 제어할 수 있는 대시보드를 폰에서 만들 수 있습니다. 그럼, DHT11 센서의 온도와 습도를 표시해 줄 Gauge를 각각 만들어 볼게요. 
아래 이미지에서 1번, 2번, 3번 순서대로 클릭하여 진행합니다.

왼쪽 위젯 박스 메뉴에서 Guage를 끌어다 놓으세요. 

Guage의 제목은 ‘온도 Temp.’로 입력합니다.  그리고, Data Stream에서 설정해 놓았던 온도 Temp(V0) 항목을 선택하세요. 


그리고 같은 방법으로 Guage를 끌어다 놓고, 습도에 대한 Guage를 만들어 줍니다. 
 Guage의 제목은 ‘습도 Humi.’로 입력할게요.  그리고, Data Stream에서 설정해 놓았던 습도 Humi(V1) 항목을 선택하세요.

아래는 온도와 습도 게이지가 완성된 모습입니다.

 

그리고 위젯 박스에서 Label을 끌어다 놓고, 동일한 값을 Label로도 표시해 볼게요.

내용 입력과 선택은 Guage와 동일하게 해 볼게요(달라도 됨).

 

습도 Label도 아래처럼, 동일하게 만들어 주세요.

  아래처럼 되어 있으면 Dash board 설정은 끝났으며, 최종 Save 버튼을 클릭하면, 완료됩니다.


그리고 언제든 화면 우측 상단에 있는,  Edit를 눌러 Dash-Board나 Data-Stream을 다시 수정할 수 있습니다. 

【 ⑨  새 디바이스(New Device) 추가하기 설명 】 

 그럼, Search 탭을 눌러  +New Device를 추가해 볼게요.

화살표 순서에 따라 템플릿을 선택해 주세요.  이어서 나타나는 아래와 같은 창에서 위에서 만들어 놓은 'Nano33 ioT DHT11' 이름의 템플릿을 선택하고 Create를 클릭하세요. 

그럼, 아래처럼,  템플릿 ID와 Auth Token 값들이 생성됩니다 (클릭해서 복사하세요). 

 그리고 아두이노 코드의 이 부분에 붙여 넣기 하면 됩니다. 
코드의 이 세 가지 값이 blynk.cloud 값과 일치하지 않으면 에러가 나고 서버에 연결되지 않습니다. 
여기서 주의할 것은 BLYNK_TEMPLATE_ID는 BLYNK 2.0 Cloud 서비스를 위해 생긴 것으로 <Blynk...> 라이브러리보다 상위에 배치되어야 합니다. 

만약 그렇지 않을 경우 지금 보이는 것처럼 token 에러가 나며, Blynk2.0 서버로 접속되지 않아 제어할 수 없게 됩니다.

 이 에러 관련된 추가적인 해결 방법은 더보기에 있는 링크를 참고해 주세요~!

'Invalid auth token' 에러 해결 링크:  https://rasino.tistory.com350/ 

 

【 ⑩  실습을 위한 Nano33 & DHT11용 Blynk 예제 파일 만들기 】

이 아두이노 코드는 Blynk 라이브러리에서 제공하는 코드를 기본으로 하여 수정한 것인데요. 
코드의 위치는 ‘파일 》 예제 》 Blynk’ 메뉴에서 → ‘Boards_WiFi’ 항목으로 가서 Nano33 ioT의 경우 → ‘Arduino_MKR1010’ 예제를 열어 편집하여 사용하면 됩니다. 

편집한 코드는 아래와 같습니다.

//*** 라즈이노 IoT Blynk2.0 + Nano IoT33 실습 2 ,  DHT11 센서로 온도/습도 출력하기***
// 실습 : Blynk 2.0 시스템에 DHT11 센서 연결하여 온도와 습도 값 디스플레이 하기!

#define BLYNK_PRINT Serial

// Blynk.Cloud 사이트에서 Nano33 IoT + DHT11에 대한 템플릿을 만든 후 
// 나타나는 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPLMRt6yA8Z"
#define BLYNK_DEVICE_NAME "Nano33 ioT DHT11"
#define BLYNK_AUTH_TOKEN "ZM-i3ALE2fMFsUZ5V5kh2JZg_X4LDFVi"

#include <SPI.h>
#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것
#include <DHT.h>       // 라이브러리 매니저창에서 DHT로 검색 후 설치할 것(by Adafruit 버전)

char auth[] = BLYNK_AUTH_TOKEN;   
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

BlynkTimer timer;
#define DHTPIN 13            //  DHT11 센서가 연결 된 핀 번호
#define DHTTYPE DHT11        //  DHT11 센서 사용   (DHT22 센서는 DHT22로 수정)
DHT dht(DHTPIN, DHTTYPE);

void sendSensor() {
  int t = dht.readTemperature(); // 섭씨 온도, 화씨는 readTemperature(true), 만약 DHT22센서 사용시 float형으로 바꿀 것
  int h = dht.readHumidity();  

  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temp:");
  Serial.print(t);
  Serial.print("\t");
  Serial.print("Hum:");
  Serial.print(h);
  Serial.print("\n");
  delay(300);
  Blynk.virtualWrite(V0, t);  // 온도값 전달을 위한 V1 가상포트 지정
  Blynk.virtualWrite(V1, h);  // 습도값 전달을 위한 V2 가상포트 지정
}

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  dht.begin();
  // 일반적으로 Blynk에서 ESP32 보드(혹은 아두이노와 같은 보드)에게 매 1초마다 
  // 데이터를 요구하는 방식이지만, 아래와 같은 타이머(timer) 코드를 사용하면 
  // ESP32 보드에서 Blynk로 일방적으로 데이터를 보낼 수 있음.
  timer.setInterval(1000L, sendSensor);  
}

void loop()
{
  Blynk.run();
  sendSensor();
  timer.run();    
}


편집된 코드는 여기를 클릭하여 다운로드하세요. 

Nano33ioT_DHT11_ok.zip
0.00MB

 

링크해 드리는 코드에서, 여러분의 ID, NAME, Token값과, WiFi 정보만 교체하면 됩니다.

 

【 ⑪  Nano33 ioT 보드에 코드 업로드 하기 & 핫 스팟 연결하기 】

코드가 준비되면, Nano33 ioT가 연결된 포트를 확인하고 업로드하세요. 

아두이노 IDE에서 보드가 연결된 포트와 올바른 보드 종류가 선택되었는지? 확인하세요.

 그럼, 연결시킬 WiFi 핫스팟을 준비해 주세요. (주변 연결 가능한 WiFi 또는, 스마트폰 핫스팟 등등 가능)

핫스팟에 여러분의 Nano33 ioT 보드가 IP를 할당받고 연결 된 것을 볼 수 있으며, 만약 연결이 안 된다면,  리셋키를 한 두번 눌러주면, 이렇게 핫스팟에 연결되는 것을 볼 수 있습니다. 

 

【 ⑫  동작 확인하기 (Arduino IDE Value & Web Dashboard) 】

그리고 아래 이미지처럼 아두이노 IDE의 시리얼 모니터를 열어, 출력되는 데이터를 바로 확인할 수 있도록 하였습니다.

아래 이미지처럼, Blynk의 Search탭에 있는 Dash-Board에 가보면 동일한 데이터가 표시되는 것을 볼 수 있어요.

 

【 ⑬  Blynk IoT App에서 Dash Board(대시보드) 설정하기 】

그럼, Blynk ioT App에서도 Dash-Board를 만들어 볼게요. 
먼저 스마트폰에서 다운로드하고 설치한 Blynk ioT를 실행시키고 로그인합니다.
웹에서 Nano33 DHT11이라는 이름으로 대시보드를 이미 만들었기 때문에,  앱에서도 Nano33 DHT11라는 이름의 템플릿이 생성되어 있을 거예요( 내용은 비어 있으며, 위젯 배치는 폰에서 새로 만들어야 함)  그럼, 그 템플릿을 선택하세요.
아래 공구 모양의 이미지(개발 모드 전환)를 터치해서 위젯들을 배치해 볼게요. 

 

이어서 앱의 바닥 빈 곳을 터치하거나 화면 우측 상단에 있는 '+' 표시를 터치하면,
우측에 위젯 메뉴들이 나타나는데요,  Guage 위젯을 찾아 선택해 주세요.

 이번엔 습도용 게이지를 만들기 위해 Guange 위젯을 하나 더 선택하세요. 


먼저, 왼쪽 위젯을 선택해서 설정을 해 볼게요.   아래 이미지들을 참고하여,  온도와 습도에 대해 설정해 보세요.

그럼, 아래와 같은 형태가 되며,   아래 화살표를 터치하여 화면을 빠져나오면, 데이터가 연동되는 실행 모드가 됩니다.

 

현재,  Arduino IDE Serial Value = Web Cloud Value = App Value   값들이 모두 연동되어 일치되는 것을 볼 수 있습니다. 

그럼,  주변 온도 및 습도 변화에 제대로 반응하는지 빠르게 확인해 보기 위해,  아이스팩과 히터를 이용해 볼게요. 

 아이스팩을 센서 주변에 붙여보니, 온도가 상온보다 빠르게 떨어지고,  습도 또한 냉각으로 인하여 낮아지는 것을 볼 수 있습니다.

이번엔, 아래 이미지처럼, 미니 히터를 대어 보았는데요,  히터의 경우 온도가 빠르게 올라가며, 습도 또한 건조해져 떨어지는 것을 볼 수 있었습니다. 

네, 이렇게 아주 잘 작동하고 있습니다. 
오늘 이렇게 DHT11이라는 온습도 센서를 WiFi 기능이 기본 지원되는 나노ioT33 보드에 연결하고, Blynk 2.0(블링크) 서비스를 이용해서 웹과 앱에서 데이터를 실시간으로 확인(출력) 해보는 실습을 진행해 보았습니다. 
블링크 서비스의 장점은, 어렵고 복잡한 코딩 과정 없이 실생활에 바로 응용할 수 있는 ioT 작품들을 매우 쉽고 빠르게 구축해 주는 것이라 생각됩니다. 

그럼, 본 게시글이나 아래 링크해드리는 유튜브 영상을 함께 참고하여,  직접 여러 형태로 재미있게 활용해 보세요~  ^^&

위 동영상 이미지를 클릭하면 재생이 됩니다
반응형
반응형

블링크 2.0에서 기존 만들어 놓은 프로젝트(템플릿)나 혹은 잘못 만든 프로젝트를 삭제하는 방법입니다.

1. 먼저, blynk 2.0 클라우드로 로그인하세요.  (long-in  blynk cloud )   http://blynk.cloud


2.  Search 탭으로 가서  offline 옆의 ... 을 클릭 후 Delete 키 누르세요.

 

3. Templates 탭을 클릭 후 우측에 있는 Edit 편집을 클릭합니다.

4.  화면 우측 상단의 Cancel 버튼 옆에 있는 ... 을 클릭하면 나타나는 Delete를 클릭하세요.

5. 아래와 같은 창이 뜨면,  입력칸에 대문자로 정확하게 DELETE 라고 입력 후,  그 아래줄의 체크항목에 체크한 다음,
Delete 버튼을 클릭하면, 템플릿이 최종적으로 삭제되는 것을 볼 수 있습니다.

 

※  Search 탭에서 먼저 삭제하지 않아도  Templates 탭에서 삭제를 하면 모두 삭제 되니 참고하세요.

반응형
반응형

 Blynk2.0 은 WiFi 컨트롤 기능을 App뿐 아니라, Blynk Cloud라 하여 웹에서도 제어할 수 있는 기능을 제공하고 있습니다. 
또한,  복잡하고 어려운 코딩이나 함수 사용 없이 매우 쉽게 IoT 시스템을 구축해 주는 멋진 시스템입니다. 

이런 Blynk 2.0을 이용하여 휴대폰과 웹에서 Nano33 IoT 보드에 연결된 LED를 WiFi 무선으로 제어해 보는 실습을 준비했습니다.

여기서는 나노 33 IoT 보드를 사용하고 있지만, ESP8266 보드류 혹은 ESP32 보드 등으로도 바로 적용 가능합니다. 

이번 학습은 시리즈로 제작되며,  전체 학습 내용은 아래와 같습니다.
======================================================
시리즈 전체 실습 내용(예정)
1. Nano33 ioT & Blynk2.0 으로 LED On/Off 하기. (본 영상)
2. Nano33 ioT & Blynk2.0 으로 DHT11 센서 온도/습도 출력하기.
3. ESP01 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기.
4. ESP8266 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기.
5. ESP32 & Blynk2.0 으로 LED와 LAMP(220V) 제어하기.
======================================================

【 실습을 위한 사전 학습 자료 】
① Nano33 IoT 처음 사용설명서 1편
    - 유튜브 자료 : https://youtu.be/QwrgDjs4qBc
    - 블로그 자료 : https://rasino.tistory.com/301 
② Nano33 IoT 처음 사용설명서 2편
   -  유튜브 자료 : https://youtu.be/IODHpewucU4
    - 블로그 자료 : https://rasino.tistory.com/310

【  이 실습에 필요한  Download 및 학습 자료 】
 ( 연결 도면 및 아두이노 코드 등 제공,  Arduino IDE Code etc...  )
  - https://rasino.tistory.com/351

【 Blynk Cloud  Off Line & "Invalid auth token" error 에러 해결방법 】
  - https://rasino.tistory.com/350    

 【  블링크2.0에서 기존 프로젝트(템플릿) 삭제하는 방법 】
  - https://rasino.tistory.com/352   


【 이 실습에서의 주요 목차 】
▶ ①  Blynk 2.0 서비스 소개
 ②  회로 연결도면 및 실습 준비
  실습을 위한 아두이노 IDE 필수 라이브러리 설치
  실습을 위한 Nano33용 Blynk 예제 파일 열기
  Blynk Cloud (blynk.cc) 설정 & 웹 대시보드 만들기(Dash Board)
  아두이노 IDE에 Auth Token & TEMPLATE ID & WiFi정보 입력하기
 ⑦  Nano33 IoT WiFi 접속시키고 IP 할당 받음 확인하기
  Blynk IoT App에서 Dash Board(대시보드) 설정하기
  Blynk App & Cloud   , 앱과 클라우드에서 LED 컨트롤 하기!

 

【 ①  Blynk 2.0 서비스 소개 】

최근 Blynk 서비스가 2.0으로 바뀜에 따라, 현재 가입하려는 분들은 반드시 2.0 시스템으로 사용법을 익히셔야 합니다.
기존에 사용하던 Blynk앱 시스템은 이용자의 폭주와 웹 연동 서비스를 제공하기 위해 Blynk 2.0 시스템을 오픈하였습니다.

물론 기존 Blynk 시스템도 유료 서비스를 이용하던 사용자가 있기 때문에 서비스가 유지되고 있지만,  Blynk 신규 가입자는 반드시 Blynk2.0을 이용해야 합니다. 
다만, Blynk2.0의 경우 국내 자료가 아직 부족하고 사용법이 기존과 달라 접근하기가 쉽지 않습니다.
그래서, 기본 사용법을 익히실 수 있도록 본 게시글을 준비했으니 차근차근 따라 해 보시기 바랍니다.
현재 Nano33 ioT 보드로 기본 실습들을 구성했지만, esp8266 보드나 esp32 보드 들도 이 글을 참고하면, 동일하게 활용 가능합니다.

Blynk 앱을 검색해 보면, 기존(legacy) 앱과 Blynk2.0인 Blynk IoT앱 두 가지를 볼 수 있습니다. 
Blynk 2.0에서는 Blynk Cloud라 하여 웹에서도 아래처럼 컨트롤 버튼을 만들어 제어할 수 있고, 

Blynk의 가장 큰 장점은 어려운 앱 개발 코딩이 필요 없다는 것과 쉬운 클라우드 서버 툴을 제공하기 때문에 웹코딩이 필요 없으며, 센서 및 회로 제어에 필요한 복잡한 아두이노 함수들을 자체적으로 처리해 주기 때문에 매우 쉽고 빠르게 IoT 응용 작품들을 구축할 수 있습니다. 다만, 동시에 2개의 프로젝트(템플릿)까지만 무료로 제공되며, 추가적인 프로젝트나 고급 위젯 Box를 이용하고자 한다면, 일정 비용을 지불해야 합니다.              
단, 먼저 만들어진 프로젝트를 삭제하면 새 프로젝트를 계속 만들 수 있어요)   
물론, 월 이용료 등의 일정 비용을 지불하면 상업용으로도 손색없는 IoT 시스템을 구축할 수 있을 것으로 생각됩니다.


【 ②  회로 연결 도면 및 실습 준비 】

먼저, 화면과 같은 부품을 준비하여 회로를 연결해 주세요.

Nano33 ioT는 핀 배열이 Nano 보드와 거의 동일한데요, Nano 보드처럼 사용하기 쉽고 WiFi 모듈까지 내장되어 있어 활용하기 좋은 보드입니다.  Nano33 ioT 보드의 상세 설명과 사용법은 위에 링크해 드린, “처음 사용설명서 #1~#2”편을 참고해 보세요. 

  실습을 위한 아두이노 IDE 필수 라이브러리 설치 】

그럼, 아두이노 IDE에 필요한 필수 라이브러리 3가지를 설치해 주세요.
1. ‘보드 매니저’에서 SAMD 또는 NANO 33으로 검색해서 보드 인식을 위한 라이브러리를 설치합니다.
nano 33으로 검색할 때는 중간에 공백을 주어야 합니다. 
그리고, 라이브러리 매니저가 아니라 보드 매니저입니다. Nano 33 ioT는 SAMD21G18A 칩을 MCU로 사용하고 있는 보드입니다. 

SAMD 또는 NANO 33 으로 검색 후 설치

 

2. ‘라이브러리 매니저’에서 NINA 또는 WIFININA로 검색하여 WiFi 통신을 위한 라이브러리를 설치합니다.

WiFi 통신을 위한 NINA 라이브러리

 

3. ‘라이브러리 매니저’에서 blynk로 검색하여 BLYNK 라이브러리를 설치합니다.

BLYNK 함수 사용을 위한 라이브러리 설치

그럼, 이제 모든 준비 사항은 끝났으며, LED1과 2를 웹과 앱을 통해 직접 제어해 볼게요.

아래는 실제 연결된 회로 모습입니다.  점퍼선을 이용해도 좋지만,  이렇게 굵은 단선으로 길이에 맞추어 연결하면 훨씬 간결하고 튼튼하게 오랫동안 유지됩니다.

 

  실습을 위한 Nano33용 Blynk 예제 파일 열기 】

이제 ‘파일 》 예제 》 Blynk’ 메뉴에서 → ‘Boards_WiFi’항목으로 가서, Nano 33 ioT와 동일하게 사용할 수 있는 → ‘Arduino_MKR1010’ 예제를 열어 사용합니다.


ESP32 보드 및 ESP8266 보드들은 여기 예제들을 사용하면 됩니다.


 기본 내용에 있는 것을 그대로 두고, 주석문 등을 확인해 본 후 필요 없는 부분을 정리해 보세요.
그리고 적당한 이름으로 저장합니다. 
지금 아래 화살표 부분에 Blynk Cloud에서 템플릿 ID 등을 복붙복해올 예정입니다.  (뒤에 다시 자세히 내용이 나옵니다)

 

【 ⑤  Blynk Cloud (blynk.cc) 설정 & 웹 대시보드 만들기(Dash Board) 】

1. 그럼, Blynk.CC 사이트에서 메일 주소로 간단히 회원 가입을 하세요.



그리고, Blynk.cloud로 접속하면 영상과 같은 모습을 볼 수 있습니다.
작업 순서는 
 1. 템플릿 탭에서 먼저 탬플릿을 만들고. 
 2. 찾기(Search) 탭에서 만들어진 템플릿에 보드 장치를 추가해주는 식으로 진행됩니다.

그럼, 템플릿(Templates) 탭을 클릭한 후 +New Template를 클릭하세요.

 

NAME에는 특수문자를 제외한 적당한 템플릿 이름을 입력하세요. 
여기서는 Nano33 ioT LED로 이름을 적었습니다. 
HARDWARE 항목에는 Arduino를 선택하고, Connection Type에는 WiFi를 선택하세요.
마지막으로 Description에는 적당한  설명을 입력하고 Done을 클릭합니다. 

설명란에도 특수 문자가 입력되면 이렇게 에러가 나니, 특수 문자를 빼고 작성하세요.

그럼 아래처럼, 여러 가지 탭으로 나누어진 메뉴가 보입니다.

여기서 주로 사용하는 탭은 Info / Data Streams / Web Dashboard 정도입니다.

그럼, Data Streams 탭으로 가서 +New Data Streams을 클릭하세요. 
그리고, Digital 항목을 클릭합니다. 

 

 화면에 보이는 회로 연결을 참고하여 선택하세요.
마찬가지로 D5(GPIO 5)에 연결된 LED도 설정해 줍니다. 

이제 Web Dashboard에서 컨트롤 패널을 만들어 주면 됩니다.

 

 Display 항목에 있는 LED를 보드에 끌어다 놓고 크기를 정당히 조절해 줍니다.

기어 모양의 설정을 클릭하세요.


TITLE에  LED 1로 적고,  Data Stream에는 2번 Pin으로 지정된 LED 1(2)을 선택해 주세요

 

두 번째 LED에 대해서도 동일하게 진행하면 됩니다.
TITLE에  LED 2로 적고,  Data Stream에는 5번 Pin으로 지정된 LED 2(5)를 선택해 주세요.


그럼 이제, 컨트롤(Control) 항목에 있는 스위치(Switch)를 끌어다 놓으세요.

마찬가지로, 설정을 눌러 스위치 이름을 정하고,  스위치를 누를 때 작동(연결되는) 시킬 LED를 선택해 줍니다 → LED 1 (2번 Pin)

필요한 경우, 스위치가 작동될 때, ON / OFF 글자를 표시하게 할 수도 있습니다. 
Save를 눌러 저장하고, 2번째 스위치에 대해서도 동일하게 진행하면 되는데요, 이번에는 좀 더 간편하게, 이미 만들어진 스위치 위젯을 복사하여 사용해 볼게요.

 

Switch 2 이름과  DataStream을 → LED 2 (5번 Pin)로 바꾸어 주면 됩니다.

그리고 반드시 저장(Save)을 눌러 주세요!

추후에 연결이 잘못되거나 변경을 원할 경우,  다시 Edit 버튼을 눌러 변경해 주면 됩니다. 

이제 Search 탭으로 갑니다.  기존에 ESP32 보드를 추가해서 사용하던 장치가 보이는데요. 

지금은 Nano33 보드를 추가하기 위해 + New Device를 클릭하고, From Template를 클릭하세요.

TEMPLATE 항목에 Nano33 ioT LED가 보일 텐데요, 선택하고 Create를 클릭하세요.

 

그럼, 바로 이 프로젝트에 대한 템플릿 ID와 이름, Auth Token 값들이 생성됩니다.  클립보드로 복사하기를 눌러 주세요.


방금 복사된 내용을 아두이노 IDE 코드에 붙여 넣으면 대부분의 작업은 끝이 납니다. 

이제 코드에 수정해 주어야 할 부분들만 바꾸어주면 되는데요,  
char auth [ ] = BLYNK_ATTH_TOKEN으로 바꾸어 주세요.
접속 가능한 WiFi(핫스팟)의  char ssid [ ] = “-----” 와 비번(ssid [])을 바꾸어 주세요.

아두이노 코드입니다.

/* Nano33 IoT + Blynk 2.0 LED On/Off 실습 */

#define BLYNK_PRINT Serial
/* Blynk.Cloud 사이트에서 Nano33 IoT + LED에 대한 템플릿을 만든 후 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPL8FZBJtS4"
#define BLYNK_DEVICE_NAME "Nano33 ioT LED"
#define BLYNK_AUTH_TOKEN "3_no_kJo46jNhiMRzlpfPRlMELvHU-g4"

#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것
#include <DHT.h>       // 라이브러리 매니저창에서 DHT로 검색 후 설치할 것(by Adafruit 버전)

char auth[] = BLYNK_AUTH_TOKEN;
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}

[ 아두이노 코드 다운로드 ]

Nano33_Blynk_LED.zip
0.00MB

필요한 아두이노 코드는 이것이 전부입니다.  코드가 정말 간단하죠? 
네, 모든 작업은 끝났으며, 저장하고 코드를 아두이노에 업로드하면 됩니다.

만약, 컴파일(업로드) 과정에서 에러가 난다면, 툴 》 보드 》 Nano ioT 33 보드를 선택, 연결된 Com 포트를 제대로 선택했는지? 확인하세요.

이제 폰 핫스팟으로 WiFi 연결을 지원하고, Web Dashboard와 앱으로 제어가 되는지? 볼게요.

먼저, Nano33 보드의 리셋 버튼을 한 두 번 눌러 주세요.

 

그럼, 이 부분에 여러분의 Nano33 보드가 연결되는지? 확인할 수 있습니다.

 

터치해 보면, 핫스팟으로부터 할당받은 IP 주소도 확인할 수 있습니다.

이 상태에서는 이미 Web Dashboard에서는 Online 연결되어 있어 제어가 가능합니다.

그럼, 미리 설치하고 로그인되어 있는 Blynk ioT 앱을 실행시켜 볼게요.
아래처럼, Nano33 ioT 템플릿을 터치하면, 

앱에서는 아래처럼 대시보드를 만들지 않았기에 만들 수 있는 메뉴가 나옵니다.

그럼, 이미지를 보고 위젯을 배치하며 대시보드를 만들어 보세요.
아래 이미지에서  화살표로 가리키고 있는 줄 세 개의 포인트를 터치하면,  위젯이라고 하는 박스들이 나옵니다.

 

아래 UPGRADE라고 표시되어 있는 위젯들은 일정 비용을 지불해야 이용 가능합니다.

하지만, 무료 위젯 만으로도 기본적인 프로젝트들은 어느 정도 만들어 볼 수 있습니다.
아래쪽으로 내려서, LED 위젯이 보이면 선택하세요.

터치를 좀 길게 하면 위젯의 위치를 옮길 수 있습니다.


크기를 조절하고,  LED 위젯을 하나 더 불러오세요. 

첫 번째 LED 위젯을 터치하면, 설정 화면이 보이는데요,
제목 : LED 1    /   색 : 블루   /  DataStream : LED 1로 선택하세요.

뒤로 가기를 눌러 줍니다.

다음, 두 번째 LED 위젯을 터치하세요.
제목 :  LED 2    /   색 : 그린   /  DataStream : LED 2로 선택하세요.

LED 위젯은 LED의 On/Off 상태만 보여주기 때문에,  LED를 켜고 끄기 위해서는 버튼(스위치)과 같은 위젯이 필요합니다.

같은 방법으로 위젯 박스 중에서 스위치 위젯을 꺼내어 배치하고 설정으로 들어가세요. 

PUSH 버튼과 스위치의 차이는 PUSH 버튼은 누르고 있는 동안만 ON(1)이 되며, 떼면 OFF(0) 되는 방식입니다.
스위치는 한 번 터치할 때마다  ON(1)과 OFF(0)가 번갈아 바뀌는 방식입니다.   여기서는 SWITCH로 선택하세요.

버튼의 색상을 자유롭게 선택해 주세요.  여기서는 연결한 LED 색을 기준으로 동일하게 했습니다. 
LED1 은 파란색,   LED2는 녹색을 사용했어요.

두 번째 버튼에 대해서도 설정해 주세요.


이제 위젯 설정도 끝이 났으며, 여기서 한 번 더 뒤로 가기를 터치하면 실행 모드가 됩니다.
아래 이미지는 대시보드에 배치가 완료된 최종적으로 완료된 모습입니다. 

 

【 ⑨  Blynk App & Cloud   , 앱과 클라우드에서 LED 컨트롤 하기! 】

자 그럼, App에서 스위치를 작동시켜 볼게요.  
※ 참고 : 스위치 위에 있는 LED는 현재의 LED On/Off 상태를 알려주는 역할입니다.
이번에는,  웹의 Dash Board에서 스위치를 작동시켜 볼게요.  

네, 아주 잘 작동되는 것을 볼 수 있습니다.

또한,  웹 대시보드에 있는 버튼(스위치)도 마우스로 클릭해 보세요.  스마트폰과 실제 LED가 동일하게 연동되어 작동됩니다.

 

여기서 중요한 것은, 아래처럼, 분홍색 체크 부분이 Online으로 되어 있어야 합니다. 

 

아두이노 IDE 시리얼 모니터에서도 아래처럼, Ping 테스트 시간까지 표시되어야 합니다. 

 

만약, 대시보드에 표시가 Off line 이거나, 아래처럼 아두이노 시리얼 모니터에 “Invalid auth token”에러 메시지를 띄우며 실행되지 않는다면, 작동되지 않습니다. 

만약, 이런 에러가 난다면, 아래 링크 게시글을 참고하여 해결해 보세요.

게시글 링크 : 
【 Blynk Cloud  Off Line & "Invalid auth token" error 에러 해결방법 】
  - https://rasino.tistory.com/350    

 

자 이렇게 Blynk 2.0 시스템을 이용해서 Nano33 ioT 보드에 연결된 LED를 제어해 보았습니다.
Blynk 서비스가 한 번에 무료로 만들 수 있는 프로젝트는 2개 까지지만 기존 프로젝트를 삭제하면 계속해서 다시 만들 수 있기 때문에 ioT 테스트나 학습용으로 활용하기 아주 좋습니다.
또한 어렵고 복잡한 코딩 없이 매우 쉽게 IoT 시스템을 구축할 수 있는 장점이 큽니다. 

【영상으로  학습 하기】

 

그럼, 다음 영상에서 센서 혹은 릴레이를 사용하여 좀 더 실용적인 제어를 해 보도록 할게요. 

감사합니다.   
좋은 하루 보내세요~!

반응형
반응형

WiFi 기능을 기본 탑재하여 사용하기 쉽고 간편한 WiFi 전용 보드를 이용하여 블링크 클라우드(Blynk Cloud) 에 접속하여, 제어하려는 과정 중에서,  아두이노 IDE를 통해 코드를 전송하기 위해 코드를 컴파일했을 때 코드상 에러 없고, 라이브러리 문제도 없었으나,  "http:Blynk.Cloud" 클라우드 화면에서 자신의 WiFi 보드가 연결(Online) 되지 못하는 에러를 겪는 것에 대한 에러 해결 자료입니다.
(물론, 보드가 WiFi 네트워크에 잘 접속되어 있는 상태 임)

(WiFi 전용보드 : 주로 esp8266 칩셋을 이용한 D1, D1 mini, ESP8266, nodeMCU, 혹은 ESP32 , Nano33 ioT 보드 등)

 

 아래 온습도 프로젝트를 ESP32를 이용하여 만든, 블링크 클라우드(Blynk Cloud)의 화면을 보면 Off Line으로 나와 있는 것을 볼 수 있습니다.  물론 ESP32 보드는 스마트폰 핫 스팟이나 기타 WiFi 라우터 등에 잘 연결되어 있는 상태입니다. 

[ 에러 증상 ]

 또한, 아두이노 IDE의 시리얼 모니터 창을 열었을 때 Blynk Cloud와 잘 연결 되었다면 정상적인 연결 화면은 아래와 같습니다.  ( ESP32, ESP8266, Arduino Nano 33 IoT 등등 모두 동일 )

나의 WiFi보드가 Blynk Cloud 2.0에 정상적으로 접속되어 있는 모습


하지만 어떤 이유로 Blynk Cloud에 접속 되지 못하고 아래와 같은 "Invalid auth token" error 에러 메시지를 계속 표시하게 됩니다. 

나의 WiFi보드가 Blynk Cloud 2.0에 연결 되지 못하고 에러를 출력하는 모습

 

[ 에러 원인  #1 ]

이러한 에러가 나타나는 원인을 살펴보자면,  현재 Blynk 서비스의 경우 과거 Blynk 초기 시절에 제공하던 Blynk 서버의 포화로 인해 더 이상 신규 회원을 받아들일 수 없었고,  이와 함께 Web으로 접속하여 제어할 수 있는 클라우드 서버 서비스라는 새로운 기능까지 추가한다는 계획으로 인해, Blynk 2.0 이라는 새로운 서버 시스템을 구축하게 된 것입니다. 

그런데, 기존 Blynk 1.0 서비스 이용자들이 존재하고 있기 때문에, 기존 서비스도 유지하면서 새로운 Blynk 2.0 서비스를 함께 운영하는 상황에서 WiFi 보드 들이 Blynk 서버에 접속하려 할 때 ,   Blynk 1.0 과 Blynk 2.0 서버를 구분해서 연결시켜야 하는 이슈가 있었던 거죠.   

Blynk에서는 이를 해결하는 방법으로 BLYNK_TEMPLATE_ID (블링크 템플릿 ID) 라는 것을 착안하게 됩니다. 
즉, WiFi 보드에 입력되는 블링크 코드에서 Blynk 2.0 클라우드에 접속되는 대상들은 이 템플릿 ID를 부여하고, 이 ID가 확인이 되면 블링크 2.0 서버로 연결시키게 되며,  만약 이 템플릿 ID가 확인되지 않으면, 기존 Blynk 서버(legacy server)로 연결시키게 됩니다. 

그런데 만약 이 과정에서 ,  Blynk 코드에 이 템플릿 ID(BLYNK_TEMPLATE_ID) 가 코드상에서 Blynk Library (블링크 라이브러리) 보다 아래에 위치하게 되면, 템플릿 ID를 체크하지 못하게 되어 기존 blynk 서버로 연결시켜 버리게 되어, Blynk 2.0 클라우드로 접속되지 못하니 Off Line이 되어 버리는 것입니다. 

아래, 문제 없는 정상적인 코드 예시와,  문제가 발생한 코드 예시를 참조해 보세요. 

정상적인 템플릿 ID 위치

---------------------------------------------------------------------------------------------------------------------------------------------------------------

문제가 발생한 템플릿 ID 위치

[ 에러 해결 ]

따라서, 문제 해결을 위해서는,

반드시 Blynk 2.0 클라우드 서버 서비스에 제대로 접속(Online) 시키기 위해서는 템플릿 ID(BLYNK_TEMPLATE_ID)를 다른 코드(특히, Blynk 라이브러리) 보다 상위에 배치시키는 것을 잊지 말아야 합니다.

물론 기존 Blynk (legacy) 서비스에 이미 가입되어 있고 이를 사용 중인 상황이라면 이 템플릿 ID는 없는 상태로 코드 작성이 이루어 집니다.  

[ 에러 원인  #2 및 해결]

에러 원인 1에 대해 조치를 하여도, "Invalid auth token" error 에러를 표시하며, 해결이 안 되는 경우가 발생 할 수 있는데요, 
이럴 때는, 강제적으로 blynk.cloud 서버에 접속하도록 하면 해결 됩니다. 

아래가 지난 번 올린 Nano33 ioT에서의 동작을 위한 코드인데요, 
아래 코드 중에   
Blynk.begin(auth, ssid, pass);  이 부분을  
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);  로 변경해 보세요.

/* Nano33 IoT + Blynk 2.0 LED On/Off 실습 */

#define BLYNK_PRINT Serial
/* Blynk.Cloud 사이트에서 Nano33 IoT + LED에 대한 템플릿을 만든 후 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPL8FZBJtS4"
#define BLYNK_DEVICE_NAME "Nano33 ioT LED"
#define BLYNK_AUTH_TOKEN "3_no_kJo46jNhiMRzlpfPRlMELvHU-g4"

#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것
#include <DHT.h>       // 라이브러리 매니저창에서 DHT로 검색 후 설치할 것(by Adafruit 버전)

char auth[] = BLYNK_AUTH_TOKEN;
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}

 

아래 코드는 수정 된 코드입니다.

/* Nano33 IoT + Blynk 2.0 LED On/Off 실습 */

#define BLYNK_PRINT Serial
/* Blynk.Cloud 사이트에서 Nano33 IoT + LED에 대한 템플릿을 만든 후 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPL2f0fgFk5"
#define BLYNK_DEVICE_NAME "Nano 33 ioT"
#define BLYNK_AUTH_TOKEN "7nL0OYYxNqzAqnGno10d2RRuRgAz3oYi"

#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것

char auth[] = BLYNK_AUTH_TOKEN;
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

void setup()
{
  Serial.begin(9600);
//  Blynk.begin(auth, ssid, pass);    // Invalid auth token" error 에러가 날 경우 아래처럼 변경
  Blynk.begin(auth, ssid, pass, "blynk.cloud",80);
}

void loop()
{
  Blynk.run();
}

수정된 코드 다운로드 받기

Nano33_Blynk_LED.zip
0.00MB

[ 에러 원인  #3 ]

 세 번째의 경우는 그 두 번째 원인은 바로 회사나 특정 기관의 방화벽으로 인한 것으로 판단됩니다.  하지만 정확히 방화벽이 원인이라고 판단되는 명확한 근거는 없기 때문에, 방화벽을 포함한 연결 되는 곳의 WiFi네트웍 환경의 특정 원인으로 생각이 되는데요,  
이 또한, Blynk2.0 시스템인  Blynk.Cloud에 접속되지 못해 발생 되는 에러로 보입니다. 
 다시말해,  스마트폰 핫스폿으로 연결까지는 되지만, Blynk Cloud와는 연결이 되지 않아 "Invalid auth token" error 에러 메시지를 계속 표시하게 됩니다. 

↓아래는 코드의 변화 없는 동일한 코드를 방화벽 셋팅이 강화된 회사에서 업로드 하였을 때, "Invalid auth token" error 에러 메시지를 표시하며 연결이 안되는 모습입니다.

방화벽으로 인해 "Invalid auth token" error 에러 메시지를 계속 표시하는 모습

 

그리고  ↓아래는 일반 가정집에서 인터넷 환경에서 동일한 코드를 업로드 하였을 때, 바로 연결이 되는 모습입니다. 


현상을 정리하자면, 특정 영역의 방화벽 설정이 된 상태하에 있는 회사 PC에서 코드를 업로드한 보드 회로를 가지고,  특별한 방화벽 설정이 안 된 집에서 연결을 시도해 보아도 "Invalid auth token" error 에러 메시지를 표시하게 되는데요, 
만약, 집에서 코드가 업로드 되어 연결이 잘 되는 보드 회로를 회사에 가지고 가서 코드 재업로드 없이 그대로 WiFi 연결시키고 하였을 때는 Blynk Cloud 사이트와 연결이 잘 되는 것을 볼 수 있었습니다.  물론 잘 동작 되는 그 회로에 동일한 코드를 회사에서 재업로드 하면 역시나 "Invalid auth token" error 에러 메시지를 표시합니다.
  그리고 "Invalid auth token" error가 나는 상태에서는, Blynk cloud 사이트 자체는 웹브라우저에서 접속 잘 되지만 보드회로와 Blynk Cloud 서버와 사이에는 Off Line으로 표시 되고 연결 및 제어가 되지 않게 되죠 .)

 따라서, 코드 업로드 되는 네트웍 환경에 따라 Blynk.cloud에 접속되지 못해 발생 될 수도 있는 원인으로도 보입니다. 
하지만, 대부분의 경우,  1번과 2번의 해결 방법을 사용하면 해결 될 것으로 판단됩니다.

반응형
반응형

라즈베리Pi#22 초음파 센서(HC-SR04) 사용하기!  with (파이썬 코드)
RaspberryPi Ultra-Sonic Sensor with Python !


 라즈베리파이에서 초음파 센서인 HC-SR04 모듈을 사용하는 방법에 대해 다루어 보겠습니다. 
코드는 파이썬으로 하고, "거리 측정기"를 예시로 진행해 보겠습니다.

 그리고, 내용 초반에 라즈베리파이에 직접 모니터와 키보드, 마우스 등을 연결하지 않고 자신의 주 PC인 윈도 PC에서 원격 접속으로 접속하여 동작시키는 방법으로 진행이 되는데요, (물론 직접 연결하여 진행해도 됩니다)

만약 원격 접속 제어 방법이 궁금하다면,  라즈이노 ioT(게시글) 블로그와  유튜브 영상을 참고해 주세요.

【라즈베리Pi#19】 윈도 PC에서 라즈베리 Pi 원격 제어하기

[ 윈도 PC에서 라즈베리 Pi 원격 제어하기 - 유튜브 영상으로 보기 ]

  원격 접속을 하면,  모니터 및 키보드와 마우스를 추가로 연결할 필요 없고, 멀리 떨어진 임의의 장소에 설치되었더라도, 네트워크만 연결되어 있으면, 제어할 수 있어 활용도가 높은 장점이 있습니다. 

 

실습 준비물

 위 실습 준비물을 준비해주시는데요, GPIO 40핀 어댑터&케이블은 없어도 실습을 진행할 수 있으나, 
있다면  핀 네임을 보며 연결할 수 있기에 좀 더 안정적으로 편하게 연결할 수 있습니다.

 브레드보드 또한 크게 사이즈 상관이 없으며,  작은 사이즈를 타이트하게 사용하거나 두 개 이어 붙여 사용할 수 있습니다.

라즈베리Pi 초음파 센서 연결도 

 위 이미지는 라즈베리파이 초음파 거리측정 회로 연결 도면입니다.  연결 도면을 보고 부품들을 연결해 주세요.

※  주의 사항!
아래 주의사항들을 반드시 숙지하고서 작업해 주세요~!

[ 라즈베리파이의 출력 ]
라즈베리파이의 GPIO 핀의 출력 허용 전류는 핀당 최대 8mA로(모든 핀 총합 50mA)로 제한되어 있기에 LED 이상의 모터 등과 같은 모듈을 직접 출력 제어하는 것은 라즈베리파이를 손상시킬 수 있습니다. 

[ 라즈베리파이의 입력 ]
최대 3.3V까지 입력이 허용되며, 신호 레벨의 임계값은 1.8V입니다.   즉, 1.8V 보다 크면 논리 1(High),  작으면 논리 0(Low)으로 인식합니다. 
입력 가능 전류는 핀당 최대 5mA를 넘지 않도록 해야 합니다. 

라즈베리파이의 GPIO는 3.3V 레벨로 동작하기 때문에 반드시 3.3V 이상의 전원 또는 신호 레벨이 입력되지 않도록 주의하세요~!

 아두이노와 달리 컴퓨터 시스템과 같은 라즈베리파이는 포트에 출력으로 할애할 수 있는 여유가 크지 않기 때문에 LED 이상의 부품들은 포트 출력으로 작동시키지 말고 VCC 전원을 싱크(Synk)하여 처리하거나, 별도의 전원을 공급하여 처리하는 것이 좋습니다. 
 또한, 라즈베리파이는 입력받을 수 있는 전압 또는 신호 레벨이 3.3V 이하여서, 초음파 센서의 Echo핀으로 받는 5V의 High 신호 레벨을 3.3V로 낮추기 위해 1 : 2 비율의 저항을 연결하여 아래 그림처럼 3.3V로 낮추어 입력받게 됩니다.

입출력 핀은 어떤 GPIO 핀을 사용해도 상관없으며, 코드에서 핀 번호와 일치시켜주면 됩니다.

그럼, 초음파 센서를 통하여 거리 측정하는 원리를 간단히 설명해 보겠습니다.

초음파 센서 모듈을 살펴보면, 송신 모듈과 수신 모듈이 한 세트로 되어 있는 것을 볼 수 있습니다.

아두이노에서 초음파 센서의  Trigger Pin으로 10us의 펄스 신호를 입력해 주면,  초음파 센서의 송신 모듈에서 25us짜리 8개의 음파를 발사하게 되고, 이 음파가 물체에 부딪혀 수신 모듈로 되돌아올 때, 에코 핀에서는 그 시간 동안만 High 신호를 출력하게 됩니다.

이 High 신호의 간격(시간)을 이용해 아두이노에서 음파의 속도를 적용하여 물체와의 거리 값을 계산하게 됩니다
〔 음파의 속도 : 343m/s (34,300cm/s) 〕

Echo Pin의 High 펄스 시간은 펄스가  발사되고 물체에 반사되어 되돌아오기(왕복)까지의 시간이기 때문에, 나누기 2를 해주면 물체와의 거리 값을 구할 수 있습니다.

distance = (check_time x 34300) / 2

다음은, 회로를 동작시킬 파이썬 코드입니다.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

TRIG = 23
ECHO = 24
print("초음파 거리 측정기")

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

GPIO.output(TRIG, False)
print("초음파 출력 초기화")
time.sleep(2)

try:
    while True:
        GPIO.output(TRIG,True)
        time.sleep(0.00001)        # 10uS의 펄스 발생을 위한 딜레이
        GPIO.output(TRIG, False)
        
        while GPIO.input(ECHO)==0:
            start = time.time()     # Echo핀 상승 시간값 저장
            
        while GPIO.input(ECHO)==1:
            stop = time.time()      # Echo핀 하강 시간값 저장
            
        check_time = stop - start
        distance = check_time * 34300 / 2
        print("Distance : %.1f cm" % distance)
        time.sleep(0.4)
        
except KeyboardInterrupt:
    print("거리 측정 완료 ")
    GPIO.cleanup()

[ 위 코드 다운로드 ]

UltraSonic.zip
0.00MB

 

아래는 초음파 거리측정 회로를 연결한 실제 모습입니다.

이렇게 연결 커넥터(어댑터)를 이용하면 부품을 연결할 때 쉽고 간결하게 작업할 수 있습니다.

또한 핀 레이블이 적혀있어, 잘못 연결되는 실수를 줄일 수 있습니다.

그럼,  실습을 위해 라즈베리파이를 부팅시키세요.

 키보드와 마우스를 직접 연결하여 라즈베리파이에서 코드를 직접 실행시킬 수 있으며, 윈도 PC에서 “원격 데스크톱 연결” 기능을 사용하여 원격으로 실행할 수도 있습니다.
원격 데스크톱 기능을 사용하면 아래 사진처럼, 키보드나 마우스 연결이 필요 없어 Pi 주변이 깔끔해집니다.
물론 랜선 연결 대신, WiFi로 연결하면 더욱 깔끔해지겠죠.

그리고 이때,  네트워크 연결은 PC와 동일한 네트워크로 연결되어 있어야 합니다. 
일반적으로 라즈베리파이가 랜선 연결일 경우 원격 접속하는 PC도 랜선으로 동일한 내부 네트워크로 접속해야 하고, 
WiFi 연결할 경우 동일한 WiFi중계기에 접속된 PC나 노트북 등으로 원결 접속하면 됩니다.

그럼 윈도 PC에서 원격 데스크톱 접속(검색)을 실행시켜 주세요. (라즈베리파이에서 직접 실행시키는 분은 상관없습니다)


컴퓨터 항목에 라즈베리파이가 할당받은 IP주소를 입력하고 연결을 클릭하세요.

라즈베리파이가 할당 받은 IP주소는 사전에 한 번 라즈베리파이로 모니터를 연결하여 파악해 주세요.

ID와 패스워드를 화면처럼 소문자로 입력합니다.

일반적으로 User 이름과 패스워드를 특별히 다른 것으로 변경하지 않았다면, 아이디는  pi  ,  비번은  raspberry입니다.

부팅이 완료되면,   Raspberry Pi Configuration (환경설정) 메뉴로 들어갑니다. 

Interfaces 메뉴로 들어가서 (SSH)를 Enable로 체크해 주세요.

만약 설정이 바뀌었다면 재부팅을 하고 다시 원격으로 연결하세요.

그리고 원격에서 Pi 시작 메뉴의 종료(다시 시작) 메뉴가 작동하지 않는 경우: 원격에서 라즈베리파이를 종료시키는 명령어 (터미널 창 이용)를 사용해 보세요

$ sudo shutdown -h now

그럼 이제, 개발 메뉴에서 Thonny Python IDE를 실행합니다.

토니 파이썬에 코드를 입력하고 실행시켜 봅니다.

그럼, 초음파 센서의 정면으로 평평한 면적의  노트나 박스 같은 것을 준비해서 측정해 보세요.

아래는 실제 측정되는 모습입니다.

만약, 수치가 들쭉날쭉하다면,  초음파가 잘 반사될 수 있도록 센서의 각도와 반사판의 면적이 너무 작지 않은지? 등 확인해 보세요.

네, 이렇게 라즈베리파이에서 초음파 센서(sr-04)를 연결하고, 응용 예시로 거리측정까지 다루어 보았습니다.

 본 게시글의 내용을 따라 하기 쉽도록 영상으로도 만들었으니,  아래 유튜브 영상을 참고해 보세요. 
감사합니다. 

 

 

 

반응형
반응형

아두이노 Proj1시간! 2가지 스타일 시계 뚝딱 만들기! 
TM1637(시계 & 온도계)   //   LCD(시계 & 온도계 & 날짜 & 요일)


DS3231 Clock 모듈을 이용해서 디지털 시계 겸 온도계를 뚝딱! 만들어 보겠습니다.

아두이노를 이용하여 시계류를 만들 때 고려해야 할 사항은 몇 일이 지나도 시간이 정확해야 하며, 
작품의 전원이 차단 되더라도 흘러가는 시간이 기억되어 있어야 합니다.
이 두 가지 기능을 제공해주는 RTC 모듈이 바로 DS3231인데요, 
가격도 저렴하면서, 온도 센서가 있어 주변 온도 값도 출력해주는 멋진 모듈입니다.

그럼, 이 모듈을 가지고 영상에서처럼, 두 가지 버전으로 만들어 보겠습니다.
하나는 TM1637 숫자표시 모듈을 가지고 만들어 볼 텐데요,  평상시에는 시간을 표시하다가, 터치센서 또는 스위치를 누르면 온도값을 표시해주도록 하겠습니다. 


두 번째로 LCD 액정 디스플레이를 이용해서 시간 온도뿐 아니라 날짜와 요일까지 모두 표시할 수 있는 장치를 만들어 볼게요. 


물론, 이 모든 데이터는 DS3231 모듈에서 얻을 수 있기 때문에 어렵지 않게 제작할 수 있습니다. 

 《 TM1637 시계 & 온도계  만들기

① 연결도면

1번. TM1637 모듈과 터치 센서를 사용한 회로 연결은 아래와 같이 합니다.


여기서 한가지, 저렴한 복제 나노보드의 경우 CH340 통신칩을 이용하게 되는데요, 처음 사용되는 PC에는 관련 드라이버가 없기 때문에, 드라이버 설치가 필요할 수 있습니다. 
Window키 +‘X’키를 함께 눌러 장치관리자를 열어보세요. 
만약 이 부분 포트 영역에 드라이버가 잡히지 않거나, 경고 표시가 뜬다면 지금 보여드리는 것처럼 드라이버를 설치해 보세요. 
만약, 드라이버가 잘 잡혀 있거나, 아두이노 정품 보드를 사용하는 경우에는 이 과정을 건너뛰면 됩니다. 

그게 아니라면 아래처럼  "CH340"으로 구글 검색 후 아래 보이는 중국어 사이트를 여세요. 

운영체제 버전을 확인하고 파란색의 내려 받기 버튼을 클릭합니다.
위 다운로드 파일 직접 링크했으니 아래 파일을 받아도 됩니다. 
1. Windows 버전용( ↓ )

CH341SER.ZIP
0.28MB

 

2. Mac OS 버전용( ↓ )

CH341SER_MAC.ZIP
0.24MB

 

다운로드 받은 파일의 압축을 풀고 설치를 진행하세요. 


그런 다음, 장치관리자의 포트 부분을 확인해 보면 화면처럼 드라이버가 잘 잡혀 있는 것을 볼 수 있습니다.
아두이노 나노의 경우, 펌웨어를 개인적으로 업뎃 하지 않았다면, 프로세서는 “(Old Bootloader)”로 선택해주세요.

② 아두이노 코드

< 날짜&시간 설정 코드 > 
 :  1번 TM1637회로와  2번 LCD 회로에 공통적으로 사용되는 DS3231의 현재 시간 설정용 코드입니다.

/* [ DS3231 RTC 모듈에 시간 날짜 셋팅하기 코드 ] 
 * 아래 코드를 입력하고 시간 설정은 아두이노IDE의 시리얼모니터로 아래와 같이 입력함
 * 예시) T:설정명령, 22년 01월 07일 18시 55분 00초 금요일 이라면, => :T2201071855006  
 * 요일(1~7, 1:일 2:월 3:화 4:수 5:목 6:금 7:토)
 */

#include <Wire.h>
#define DS3231_I2C_ADDRESS 104
//만약 컴파일 에러시 아래 5줄의 주석 부분을 해제하세요.
//byte decToBcd(byte val);
//void watchConsole();
//void set3231Date();
//void get3231Date();
//float get3231Temp();
 
// DS3231의 데이터핀 연결은 아래처럼 하세요(우노/나노 동일)
// SCL - pin A5
// SDA - pin A4
 
byte seconds, minutes, hours, day, date, month, year;
char weekDay[4];
 
byte tMSB, tLSB;
float temp3231;
 
void setup()
{
  Wire.begin();
  Serial.begin(9600);
}
 
void loop()
{ 
  watchConsole();
  get3231Date();
  Serial.print(weekDay);
  Serial.print(", 20");
  Serial.print(year, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(date, DEC);
  Serial.print(" - ");
  Serial.print(hours, DEC); 
  Serial.print(":"); 
  Serial.print(minutes, DEC); 
  Serial.print(":"); 
  Serial.print(seconds, DEC);
  Serial.print(" - Temp: "); 
  Serial.println(get3231Temp());
  delay(1000);
}
 
// 10진수를 2진화 10진수인 BCD 로 변환 (Binary Coded Decimal)
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
 
void watchConsole()
{
  if (Serial.available()) {      // Look for char in serial queue and process if found
    if (Serial.read() == 84) {   //If command = "T" Set Date
      set3231Date();
      get3231Date();
      Serial.println(" ");
    }
  }
}
 
//시간설정
// T(설정명령) + 년(00~99) + 월(01~12) + 일(01~31) + 시(00~23) + 분(00~59) + 초(00~59) + 요일(1~7, 일1 월2 화3 수4 목5 금6 토7)
// 예: T1605091300002 (2016년 5월 9일 13시 00분 00초 월요일)
void set3231Date()
{
  year    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  month   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  date    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48));
  day     = (byte) (Serial.read() - 48);
 
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(seconds));
  Wire.write(decToBcd(minutes));
  Wire.write(decToBcd(hours));
  Wire.write(decToBcd(day));
  Wire.write(decToBcd(date));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}
 
 
void get3231Date()
{
  // send request to receive data starting at register 0
  Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
  Wire.write(0x00); // start at register 0
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes
 
  if(Wire.available()) {
    seconds = Wire.read(); // get seconds
    minutes = Wire.read(); // get minutes
    hours   = Wire.read();   // get hours
    day     = Wire.read();
    date    = Wire.read();
    month   = Wire.read(); //temp month
    year    = Wire.read();
       
    seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
    minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
    hours   = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
//  필요한 경우, 아래 24시간을 12시간 단위로 표시하는 코드 추가
    if (hours > 12 ) {
      hours = hours - 12;
    }
    day     = (day & B00000111); // 1-7
    date    = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
    month   = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
    year    = (((year & B11110000)>>4)*10 + (year & B00001111));
  }
  else {
    //oh noes, no data!
  }
 
  switch (day) {
    case 1:
      strcpy(weekDay, "Sun");
      break;
    case 2:
      strcpy(weekDay, "Mon");
      break;
    case 3:
      strcpy(weekDay, "Tue");
      break;
    case 4:
      strcpy(weekDay, "Wed");
      break;
    case 5:
      strcpy(weekDay, "Thu");
      break;
    case 6:
      strcpy(weekDay, "Fri");
      break;
    case 7:
      strcpy(weekDay, "Sat");
      break;
  }
}
 
float get3231Temp()
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
  if (Wire.available()) {
    tMSB = Wire.read(); 
    tLSB = Wire.read(); 
    temp3231 = (tMSB & B01111111); 
    temp3231 += ( (tLSB >> 6) * 0.25 ); //소수점 아래 단위의 온도값을 0.25단위씩 처리
  }
  else {
    // 에러일 경우 아무 데이터도 출력하지 아니함
  }
  return temp3231;
}

<  날짜&시간 설정 코드 다운로드 >

01_DS3231RTC_Setting.zip
0.00MB


< 1번 TM1637 시간&온도 표시 코드 >

/* 
 *  DS3231 & TM1637 & 터치(SW)센서로 시계/온도 번갈아 출력하는 코드.
 *  터치센서는 어떤 종류든 사용 가능하며, 기계적인 토글스위치, 슬라이드스위치 등도 가능.
 *  RTClib 라이브러리를 검색하여 설치하거나, 만약 설치한 라이브러리가 맞지 않다면, 삭제하고 아래 제공하는 라이브러리를 다운 받으세요.
 *  TM1637Display 라이브러리도 함께 제공합니다.(비슷한 라이브러리가 여러 개이기 때문에 반드시 제공하는 라이브러리로 설치하세요)
  */
#include <Wire.h>           // 아두이노 IDE 설치시 기본 제공됨
#include <RTClib.h>         // RTClib 라이브러리
#include <TM1637Display.h>  // TM1637Display 라이브러리
#define CLK 8            // TM1637 CLK 핀
#define DIO 9            // TM1637 DIO 핀
#define DS3231_I2C_ADDRESS 104
#define Touch 7
RTC_DS3231 rtc;         // RTC 모듈 객체 생성
TM1637Display display(CLK, DIO);
int Time, Minute;       // 시간, 분 변수 지정
char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};
float temp3231;
byte tMSB, tLSB;

void setup () {
  Wire.begin();
  display.setBrightness(7); // 0~7, 밝기 조절 : 0(가장 어두움)~ 7(가장 밝음)
  Serial.begin(9600);     // RTC 모듈 체크 루틴
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  pinMode(Touch, INPUT);
}
void loop () {
  get3231Temp();
  //  Serial.println(temp3231);
  int SW = digitalRead(Touch);
  //  Serial.println(SW);
  delay(100);
  DateTime now = rtc.now();
  int Time = now.hour();
//  필요한 경우, 아래 24시간을 12시간 단위로 표시하는 코드 추가
  if (Time>12) { Time=Time-12; }
  
  int Minute = now.minute();
  int digitoneT = Time / 10;
  int digittwoT = Time % 10;
  int digitoneM = Minute / 10;
  int digittwoM = Minute % 10;
  uint8_t data[] = { 0x0, 0x0, 0x0, 0x0};
  uint8_t segto;
  // 아래, 스위치 터치가 없으면 시간을 표시하고, 터치 시 온도를 표시함.
  if (SW == 0) {
    data[0] = display.encodeDigit(digitoneT);
    data[1] = display.encodeDigit(digittwoT);
    data[2] = display.encodeDigit(digitoneM);
    data[3] = display.encodeDigit(digittwoM);
    segto = 0x80 | display.encodeDigit(digittwoT);//시계도트 제어
    display.setSegments(&segto, 1, 1); //시계도트 제어
    delay(500);
    display.setSegments(data);  // 배열값에 있는 시계 데이터 출력
    delay(500);
  } else {
    //    Serial.println(tMSB);   // 온도 값 앞 두자리
    //    Serial.println("\t");
    //    Serial.println(((tLSB >> 6) * 0.25)*100);  // 온도 값 소수점 이하 두 자리(0.25 단위로 표시함)
    //    delay(100);

    int tempLSB = ((tLSB >> 6) * 0.25) * 100;
    int digitTemp1 = tMSB / 10;         // 십의 자리 온도 값
    int digitTemp2 = tMSB % 10;         // 일의 자리 온도 값
    int digitTemp3 = tempLSB / 10;    // 소수 첫 자리 온도 값
    int digitTemp4 = tempLSB % 10;    // 소수 둘째 자리 온도 값
    data[0] = display.encodeDigit(digitTemp1);
    data[1] = display.encodeDigit(digitTemp2);
    data[2] = display.encodeDigit(12);   // 온도 기호(C)표시 숫자 12를 엔코딩해서 세번째 FND에 출력함.
//    data[3] = display.encodeDigit(12); // 네번째 자리 비움
    display.setSegments(data);  // 배열값에 있는 데이터 출력
  }
}

float get3231Temp()
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
  if (Wire.available()) {
    tMSB = Wire.read(); 
    tLSB = Wire.read(); 
    temp3231 = (tMSB & B01111111); 
    temp3231 += ( (tLSB >> 6) * 0.25 ); //소수점 아래 단위의 온도값을 0.25단위씩 처리
  }
  else {
    // 에러일 경우 아무 데이터도 출력하지 아니함
  }
  return temp3231;
}

< 라이브러리 다운로드 >
1. RTClib

RTClib.zip
0.02MB

2. TM1637Display

TM1637-master.zip
1.36MB

3. LiquidCrystal_I2C (2번째 I2C LCD를 활용한 코드 실행을 위해 필요한 라이브러리 입니다)

Arduino-LiquidCrystal-I2C-library-master.zip
0.01MB

 

앞의 연결 도면을 보고,  가지고 있는 브레드보드를 이용해서 연결하면 됩니다.
터치 센서는 어떤 종류든 상관 없습니다, 지금은 터치를 하면 불빛이 들어오는 센서를 사용해 볼게요.
일반 On/Off 스위치와의 차이점은 터치시 Signal 단자로 전압이 출력됩니다. 
그럼, 그 전압을 아두이노 포트로 체크하여 처리해 주면 됩니다.

 

날짜 및 시간 값을 저장하고 제공해 주는 RTC 모듈은 몇가지가 있지만, 오차가 거의 없는 이 DS3231모듈을 추천합니다.

좌우 대칭으로 핀이 설계 되어 있어, 연결하기 편한 쪽을 사용하면 됩니다.
기존에 납땜되어 있는 핀은 브레드보드에 세우듯이 꽂아야 하기에 이 핀을 사용하지 않고, 브레드보드에 밀착될 수 있도록 새로 연결하면 좋습니다.
그리고 모든 핀을 사용할 필요 없고, SCL / SDA / VCC / GND 핀만 사용하면 됩니다.
물론 인두기가 없다면 그냥 점프선을 연결해서 사용하면 됩니다.

 

TM1637 디스플레이는 4개의 FND로 연결되어 있어 시간을 나타내기에 편리한 모듈입니다.

TM1637 또한 그냥 연결해도 되지만 기존 핀을 제거하고 보기 좋게 밀착시켜 볼게요.


브레드보드의 내부 연결 구조상 직접 꽂으려면 핀 작업을 해야 밀착시킬 수 있습니다.

그럼, 제공해 드리는 DS3231RTC_Setting 파일을 가지고 시간을 설정해 보세요.

코드가 업로드 된 상태에서 시리얼 모터를 열면 아래처럼 초기화된 시간을 볼 수 있습니다. 


현재시간으로 설정하는 방법은 코드 속에도 적혀 있는데요,
예를 들어, 먼저 시리얼 모니터 입력창에 T를 입력하고 22년 01월 07일 19시 23분 00초, 금요일 6 형태로 입력합니다. 
→  T2201071923006   엔터

입력 완료 후 엔터를 치면, 바뀐 시간으로 적용되는 것을 볼 수 있습니다.


Temp는 모듈 주변에 체크되는 온도 값을 보여주는데요, 초기 값이 실제 온도치보다 좀 더 높게 나타나는 경우가 있지만, 시간이 지나면서 실제 온도로 맞춰지게 됩니다.


이제, RTC 모듈에 현재 시간을 설정했으니, RTC모듈의 Data를 받아와서 TM1637에 표시해주는 "TM1637..." 코드를 나노에 업로드하면 됩니다. 

그리고 , 라이브러리 파일이 설치되어야 하는데요, 
라이브러리 관리창에서 검색 후 설치하거나, 링크해 드리는 파일을 설치하면 됩니다.
TM1637Display 라이브러리의 경우 이름이 같더라도 내용이 다른 라이브러리를 설치하게 되면, 컴파일 시 에러가 날 수 있는데요, 그럴 경우 위에서 제공해 드리는 라이브러리를 설치해 보세요.

 기본적으로 시간을 표시하고 있다가 스위치를 터치하면 온도 표시가 됩니다.
온도는 31℃로 정확하게 잘 표시되고 있습니다. (온풍기 옆에서 테스트 중)
간혹 온도가 비정상적으로 높게(7~10℃이상) 측정되는 경우가 있는데요, 측정 초기에만 그렇고 시간이 지나면 대부분은 정상적인 온도를 표시해 줍니다.

< 1번. TM1637 시계 회로 완성 및 동작 모습 >

스위치를 터치하면, 시계 표시에서 온도 표시로 바뀝니다. 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

그럼, 두 번째 LCD 시계를 조립해 볼게요.

 《 LCD 날짜 & 시계 & 온도계  만들기 

① 연결도면

2번. I2C LCD 모듈과 DS3231 모듈을 사용한 회로 연결은 아래와 같이 합니다.

나노 보드의 연결도 우노 보드의 핀과 거의 일치하기 때문에 쉽게 연결할 수 있습니다.  위 회로를 참고해서 나노보드를 조립해 보세요. 

I2C 타입의 LCD를 사용하면 매우 쉽게 연결할 수 있는데요, 
I2C 타입의 모듈을 2개 이상 여러개를 사용하더라도 모듈의 SDA(데이터)핀과 SCL(클럭신호)핀들을 각각 묶어주고 우노(나노)의 SDA, SCL에 연결해 주면 됩니다.
I2C 모듈에는 ‘고유주소’들이 매겨져 있기 때문에 아두이노에서 구분 처리할 수 있습니다.
LCD의 경우, 핀이‘ㄱ’자로 되어 있어 브레드보드에 꽂기 편하도록 공구를 이용해서 세워보세요.


준비되었으면, 제공해드리는 LCD용 시계 코드를 열고 업로드 하세요.
LCD를 사용할 때 장점은 데이터를 표시할 수 있는 영역이 훨씬 넓은 것인데요,
년, 월, 일, 시, 분, 초와 온도 등 DS3231에서 추출할 수 있는 모든 데이터를 출력해 볼 수 있습니다.


나노가 연결된 포트와 보드 선택을 확인하고 아래 제공해 드리는 코드를 업로드 합니다.

< 2번 LCD 날짜 & 시간 & 온도 표시 코드 >

/* 
 *  DS3231 RTC이용하여 LCD에 날자(요일)/ 시계 / 온도 값 출력하는 코드 
 *  LCD는 I2C 모듈이 있는 것을 사용하고 있음. 대부분의 I2C LCD의 I2C주소는 0x27임 
 */
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd (0x27, 16,2); 
 
#include <Wire.h>                  // 아두이노 IDE 설치시 기본 제공됨
#include <RTClib.h>                // RTClib 라이브러리
#define DS3231_I2C_ADDRESS 104     // DS3231의 I2C 주소
RTC_DS3231 rtc;        
int Time, Minute;       
char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};
float temp3231;
byte tMSB, tLSB;

void setup () {
  Wire.begin();
  Serial.begin(9600);    
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  lcd.begin();  
  lcd.clear();
}
void loop () {
  get3231Temp();
  delay(100);
  DateTime now = rtc.now();
  int HOUR=now.hour();
//  필요한 경우, 아래 3줄의 24시간을 12시간 단위로 표시하는 코드 추가, 필요 없다면 주석처리!
  int Time = now.hour();
  if (Time>12) { HOUR=now.hour()-12; 
  } else { HOUR=now.hour(); }

  lcd.setCursor(0,0); 
  lcd.print(now.year());
  lcd.print("/");
  lcd.print(now.month());
  lcd.setCursor(7,0); 
  lcd.print("/");
  lcd.print(now.day());    
  lcd.setCursor(10,0); 
  lcd.print(&daysOfTheWeek[now.dayOfTheWeek()][0]);
  lcd.print("day");
  lcd.setCursor(0,1); 
  lcd.print(HOUR);
  lcd.setCursor(2,1); 
  lcd.print(":");
  lcd.print(now.minute());
  lcd.setCursor(5,1); 
  lcd.print(":");
  lcd.print(now.second());
  //"0 " 0뒤에 공백이 있으며, 표시 단위가 변할 때 잔상을 제거하기 위함임.
  if (now.second()==0) { lcd.setCursor(6,1); lcd.print("0 "); }    
  if (now.minute()==0) { lcd.setCursor(3,1); lcd.print("0 "); }    
  if (HOUR==0) { lcd.setCursor(0,1); lcd.print("0 "); }    
  if (now.month()==0) { lcd.setCursor(5,0); lcd.print("0 "); }    
  if (now.day()==0) { lcd.setCursor(8,0); lcd.print("0 "); }    
  lcd.setCursor(9,1);
  lcd.print(temp3231);
  lcd.print(char(223)); // '˚' 표시용 특수문자 아스키 코드값
  lcd.print("C"); 
}

float get3231Temp()
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
  if (Wire.available()) {
    tMSB = Wire.read(); 
    tLSB = Wire.read(); 
    temp3231 = (tMSB & B01111111); 
    temp3231 += ( (tLSB >> 6) * 0.25 ); //소수점 아래 단위의 온도값을 0.25단위씩 처리
  }
  else {
    // 에러일 경우 아무 데이터도 출력하지 아니함
  }
  return temp3231;
}

< LCD 날짜 & 시계 & 온도 표시용 코드 다운로드 >

03_LCD_DS3231_Temp_Clock.zip
0.00MB


 시간뿐 아니라 달력 기능까지 표시할 수 있고, 온도까지 한 번에 출력할 수 있어 좋습니다.
만약, LCD에 불은 들어오지만 데이터 표시가 안 되는 경우가 있다면 지금처럼 LCD 뒷면에 있는 반고정저항 값을 좌 또는 우로 조금씩 조절해 보세요.


저항 값의 위치가 한 쪽으로 치우쳐져 있을 경우 지금처럼 데이터 표시가 되지 않거나 과하게 표시 될 수 있으니, 적절한 위치로 조절해 보세요.
참고로, LCD관련 코딩을 할 때는 잔상 효과를 고려해서 작성해 주어야 하는데요, 
예를 들어, 59초에서 0초로 넘어 갈때, 앞자리 5가 계속 남아 있게 됩니다.
 ( 59 → 0 → 1 → 2 → 3,   실제 : 59 → 50 → 51 → 52 → 53 )

이럴때는 숫자 데이터를 표시할 때 공백을 넣어 앞 숫자를 지워주는 방법으로 간단히 해결 할 수 있습니다.

코드에는 12시간제로 표시하거나 24시간제 표시로 변경할 수 있도록 하였습니다.
참고로, 저렴한 DS3231모듈의 경우 내장된 플래시 메모리가 불량인 경우가 간혹 있습니다 .
이럴 경우, 시간을 설정하여도 전원이 제거되고 다시 연결하면 시간이 리셋되기도 합니다 .
 혹은 DS3231에 있는 리튬배터리가 다된(방전) 경우가 있는데요,  이럴 때는 일반적으로 PC나  자동차 리모컨키에 많이 들어가는 CR2032로 교체해 주면 됩니다.

그럼, 드라이버 관련 다른 문제가 없다고 보고, 코드를 아두이노에 업로드합니다.

< 2번 LCD 날짜 & 시간 & 온도 표시 코드 >

/* 
 *  DS3231 RTC이용하여 LCD에 날자(요일)/ 시계 / 온도 값 출력하는 코드 
 *  LCD는 I2C 모듈이 있는 것을 사용하고 있음. 대부분의 I2C LCD의 I2C주소는 0x27임 
 */
 
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd (0x27, 16,2); 
 
#include <Wire.h>                  // 아두이노 IDE 설치시 기본 제공됨
#include <RTClib.h>                // RTClib 라이브러리
#define DS3231_I2C_ADDRESS 104     // DS3231의 I2C 주소
RTC_DS3231 rtc;        
int Time, Minute;       
char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};
float temp3231;
byte tMSB, tLSB;

void setup () {
  Wire.begin();
  Serial.begin(9600);    
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  lcd.begin();  
  lcd.clear();
}
void loop () {
  get3231Temp();
  delay(100);
  DateTime now = rtc.now();
  int HOUR=now.hour();
//  필요한 경우, 아래 3줄의 24시간을 12시간 단위로 표시하는 코드 추가, 필요 없다면 주석처리!
  int Time = now.hour();
  if (Time>12) { HOUR=now.hour()-12; 
  } else { HOUR=now.hour(); }

  lcd.setCursor(0,0); 
  lcd.print(now.year());
  lcd.print("/");
  lcd.print(now.month());
  lcd.setCursor(7,0); 
  lcd.print("/");
  lcd.print(now.day());    
  lcd.setCursor(10,0); 
  lcd.print(&daysOfTheWeek[now.dayOfTheWeek()][0]);
  lcd.print("day");
  lcd.setCursor(0,1); 
  lcd.print(HOUR);
  lcd.setCursor(2,1); 
  lcd.print(":");
  lcd.print(now.minute());
  lcd.setCursor(5,1); 
  lcd.print(":");
  lcd.print(now.second());
  //"0 " 0뒤에 공백이 있으며, 표시 단위가 변할 때 잔상을 제거하기 위함임.
  if (now.second()==0) { lcd.setCursor(6,1); lcd.print("0 "); }    
  if (now.minute()==0) { lcd.setCursor(3,1); lcd.print("0 "); }    
  if (HOUR==0) { lcd.setCursor(0,1); lcd.print("0 "); }    
  if (now.month()==0) { lcd.setCursor(5,0); lcd.print("0 "); }    
  if (now.day()==0) { lcd.setCursor(8,0); lcd.print("0 "); }    
  lcd.setCursor(9,1);
  lcd.print(temp3231);
  lcd.print(char(223)); // '˚' 표시용 특수문자 아스키 코드값
  lcd.print("C"); 
}

float get3231Temp()
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
  if (Wire.available()) {
    tMSB = Wire.read(); 
    tLSB = Wire.read(); 
    temp3231 = (tMSB & B01111111); 
    temp3231 += ( (tLSB >> 6) * 0.25 ); //소수점 아래 단위의 온도값을 0.25단위씩 처리
  }
  else {
    // 에러일 경우 아무 데이터도 출력하지 아니함
  }
  return temp3231;
}

< 2번 LCD용 시계 코드 다운로드 >

03_LCD_DS3231_Temp_Clock.zip
0.00MB

코드 업로드 하면, 아래처럼 동작이 됩니다.

 

네, 이렇게 DS3231 모듈을 이용해서 두 가지 버전의 시계겸 온도계를 만들어 보았습니다.

감사합니다.

 《 디지털 시계 뚝딱! 만들기 동영상 설명 참고하세요

 

반응형
반응형

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 시스템을 재미있게 만들어 보세요 ~  *^^*

감사합니다.

반응형
반응형

▶ 아래가 아두이노 메가 보드의 핀맵 또는 핀 아웃입니다.(이미지를 클릭하면 확대 됩니다)

이미지 :&nbsp; Arduino.cc
이미지 : Arduino.cc
아두이노 메가의 디지털 핀맵
아두이노 메가 기타 핀
이미지 : www.theengineeringprojects.com

▶ 아래는 아두이노 메가의 데이터 시트입니다. 

이미지 :&nbsp; Arduino.cc

 

▶ 아두이노 메가에서 여러개의 하드웨어 시리얼 통신핀 사용하기
 아두이노 메가에서는 여러개의 하드웨어 시리얼 통신핀을 제공하고 있는데요, 이를 사용하는 방법에 대해 설명드립니다.

메가 핀 옆에 글자로 14번 15번은 TX3, RX3 , 16번 17번은 TX2, RX2,  18번 19번은 TX1, RX1 로 표시되어 있는데요,
0번 1번은 그냥 RX, TX로 생각하면 되는데요, 
 일반적으로 아두이노 우노에서는 하나뿐인 하드웨어 시리얼 핀을 선언할 때는 Serial.begin 로 선언하고,  사용할 때는 Serial.print("  ") 와 같이 사용하게 되는데요,  Mega보드의 경우,

Setup ( )  {    }에서,  
Tx1 , Rx1은  Serial1.begin 과 같이 선언해주고,  
Tx2 , Rx2는  Serial2.begin 과 같이 선언해주고,  
Tx3 , Rx3는  Serial3.begin 과 같이 선언해주고,  

main ( )  {   } 에서 사용할 때는, 
Tx1 , Rx1은  Serial1.print 와 같이 사용하면 되고,  
Tx2 , Rx2는  Serial2.print 와 같이 사용하면 되고,  
Tx3 , Rx3는  Serial3.print 와 같이 사용하면 됩니다.

 

참고로 아두이노 우노에서는 모든핀을 소프트웨어 통신핀으로 사용할 수 있지만,  메가 보드에서는 소프트웨어 통신 핀으로 사용 가능한 핀이 정해져 있습니다. 
   - 아두이노 메가의 경우10, 11, 12, 13, 14, 15, 50, 51, 52, 53, 62, 63, 64번 핀이 사용 가능하고 
   - 아두이노 레오나르도의 경우 8, 9, 10, 11, 14, 15, 16번 핀을 소프트웨어 통신 핀으로 사용 할 수 있어요.

반응형