옥토포드: 홈/산업용 스마트 IoT 자동화 솔루션
부품 및 소모품
| 부품명 | 수량 | 비고 |
| 아두이노 우노 | 1 | |
| 아두이노 MKR WiFi 1010 (또는 ESP8266/ESP32 보드) | 1 | 국내 미출시로 NodeMCU ESP8266으로 대체 |
| Maxim MAX32630FTHR (또는 MAX32620FTHR, 아두이노 1010, ESP8266 보드) | 1 | 외부 WiFi 모듈/ESP8266 칩 별도 필요 |
| 라즈베리파이 제로 W (라즈베리파이 2/3도 가능) | 1 | |
| DHT11 온습도 센서 (4핀) | 1 | |
| 시드 그로브 가스 센서 MQ2 | 1 | |
| 스파크펀 토양 수분 센서 (스크류 터미널) | 1 | |
| PIR 모션 센서 (일반) | 1 | 선택 사항 |
| RFID 리더 (일반) | 1 | |
| 릴레이 (일반, 2채널 권장) | 1 | |
| RGB 디퓨즈드 공통 캐소드 LED | 1 | |
| 라즈베리파이 카메라 모듈 | 1 | |
| 서보 (타워프로 MG996R) | 1 | |
| 부저 | 2 | |
| HC-05 블루투스 모듈 | 1 | 선택 사항 |
| LED (일반) | 4 | |
| 벽면 어댑터/파워뱅크 | 2 | |
| 메모리 카드 (4GB 이상, 클래스 10 권장) | 1 | 라즈베리파이 OS용 |
필요한 도구 및 기계
- 글루건 (일반)
- 3D 프린터 (일반, 선택 사항)
- 공구류: 니퍼, 가위, 커터 등
앱 및 온라인 서비스
- Blynk (스마트폰 앱)
- OpenCV (컴퓨터 비전 라이브러리)
프로젝트 소개
많은 IoT 자동화 프로젝트가 있지만, 옥토포드만큼 종합적인 건 없습니다! 옥토포드는 NodeMCU(또는 MAX32620FTHR, 아두이노 MKR 1010), 아두이노 우노, 라즈베리파이 3로 구성됩니다. 집을 스마트하게 만들어줍니다.
주요 기능
- 실내 온도, 습도, 가스 농도 데이터 전송
- 모션 감지 시 알림 전송
- 토양 수분 부족 시 물 주기 알림
- 스마트폰 Blynk 앱으로 가전제품 제어
- 무드 라이팅 (RGB LED)
- 카메라 실시간 영상 스트리밍
- OpenCV 기반 사람 감지 시 사진 이메일 전송
- RFID 도어락 시스템
전체 동작 원리
- NodeMCU: 각종 센서, 릴레이 모듈, RGB LED 연결. WiFi로 Blynk 앱과 통신해 데이터 전송 및 제어 수신.
- 라즈베리파이: WiFi 연결로 Pi Camera 실시간 피드 제공. OpenCV로 사람 감지 시 이미지 이메일 발송.
- 스마트 도어 유닛: RFID 모듈로 허용된 카드 접근 시 서보 구동해 문 개방.
STEP 1: 메인 옥토포드 코딩 (NodeMCU)
거의 모든 줄에 주석을 달아 복사만 하는 게 아니라 이해하도록 했습니다. 핵심 흐름:
라이브러리 포함
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
Blynk 인증 및 WiFi 설정
char auth[] = "Your Blynk Auth Key";
char ssid[] = "Your WiFi SSID";
char pass[] = "Your WiFi Password";
핀 정의 및 변수
#define DHTPIN 2
#define soilPin 4
#define gasPin A0
#define pirPin 12
int pirValue, soilValue;
int PIRpinValue, SOILpinValue;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
Blynk 앱에서 제어 핀 수신 (V0: 모션 감지 on/off, V1: 토양 수분 on/off)
BLYNK_WRITE(V0) { PIRpinValue = param.asInt(); }
BLYNK_WRITE(V1) { SOILpinValue = param.asInt(); }
센서 데이터 전송 함수 (1초마다 실행)
void sendSensor() {
int h = dht.readHumidity();
int t = dht.readTemperature();
if (isnan(h) || isnan(t)) { Serial.println("DHT 읽기 실패"); return; }
Blynk.virtualWrite(V5, h); // 습도 → V5
Blynk.virtualWrite(V6, t); // 온도 → V6
}
모션/토양 수분 감지 및 알림
void getPirValue() {
pirValue = digitalRead(pirPin);
if (pirValue) { Serial.println("Motion detected"); Blynk.notify("Motion detected"); }
}
void getSoilValue() {
soilValue = digitalRead(soilPin);
if (soilValue == HIGH) { Serial.println("Water Plants"); Blynk.notify("Water Plants"); }
}
Setup & Loop
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
Blynk.tweet("OCTOPOD IS ONLINE!");
pinMode(pirPin, INPUT);
pinMode(soilPin, INPUT);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run(); timer.run();
if (PIRpinValue == HIGH) getPirValue();
if (SOILpinValue == HIGH) getSoilValue();
}
STEP 2: RFID 스마트 도어락 코딩 (아두이노 우노)
MFRC522 라이브러리 필요. 덤프인포 스케치로 카드 UID 확인 후 코드에 등록.
두 버전: 블루투스 시리얼 출력 버전 / 일반 시리얼 출력 버전. 블루투스 없는 버전 권장.
핵심 로직: 등록된 UID 일치 시 → 서보 180도 회전(문 열림), 녹색 LED + 부저 500Hz → 5초 후 서보 0도(문 닫힘). 불일치 시 → 빨간 LED + 부저 300Hz.
STEP 3: 라즈베리파이 사람 감지 AI 설정
스마트 보안 카메라 구축: 사람 감지 시 이메일 발송, 동일 WiFi 네트워크에서 IP:5000으로 실시간 스트리밍 접속 가능.
요구사항
- OpenCV (Open Source Computer Vision Library)
- 라즈베리파이 3B
- 라즈베리파이 카메라 V2
전제 조건
- 라즈비안 스트레치 설치된 라즈베리파이 3 (제시 업그레이드 비추천, 클린 설치 권장)
- 물리적 접근 또는 SSH/VNC로 터미널 접근 가능
상세 설치 과정
- 카메라 연결 및 활성화: 정전기 주의, 케이블 연결(HDMI 포트 쪽 은색 면 향함),
sudo raspi-config로 카메라 활성화 후 리부트
- 파일시스템 확장:
sudo raspi-config → Advanced Options → Expand Filesystem. 8GB 카드면 LibreOffice, Wolfram 엔진 제거로 ~1GB 확보
- 의존성 설치: 빌드 도구, 이미지/비디오 I/O 라이브러리, GTK, 최적화 라이브러리, Python 헤더 등 설치
- OpenCV 소스 다운로드: 3.3.0 버전 + opencv_contrib 동일 버전
- Python 가상환경 설정: pip, virtualenv, virtualenvwrapper 설치,
mkvirtualenv cv -p python3로 cv 환경 생성
- NumPy 설치:
pip install numpy
- OpenCV 컴파일 및 설치 (약 4시간 소요):
cd ~/opencv-3.3.0/
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
-D BUILD_EXAMPLES=ON ..
스왑 사이즈 1024MB로 늘린 후 make -j4 (4코어 활용). 실패 시 make clean && make로 단일 코어 재시도.
sudo make install && sudo ldconfig
- 가상환경에 심볼릭 링크: Python 3용
cv2.cpython-35m-arm-linux-gnueabihf.so → cv2.so로 rename 후 링크
- 테스트:
python -c "import cv2; print(cv2.__version__)" → 3.3.0 출력 확인
- 스왑 사이즈 100MB로 복구 (SD 카드 수명 보호)
파이썬 프로그램 설정
- 카메라 테스트:
raspistill -o image.jpg
- Google Drive에서 파이썬 파일 및 모델 다운로드
- 가상환경 활성화(
source ~/.profile && workon cv) 후 pip install -r requirements.txt
mail.py에서 Gmail SMTP 설정 (발신/수신 이메일, 앱 비밀번호)
main.py에서 이메일 간격(기본 600초), 카메라 플립, 분류기 모델(fullbody/upperbody/facial) 설정
- 실행:
python main.py
- 브라우저에서
https://<라즈베리파이 IP>:5000으로 실시간 스트림 확인
- 외부 네트워크에서 접속하려면 ngrok 사용:
./ngrok http 5000
- 자동 시작:
/etc/rc.local에 등록
- Gmail '보안 수준 낮은 앱 허용' 설정 필요
STEP 4: Blynk 앱 인터페이스 설정
직관적이고 재미있는 단계입니다.
- Blynk 앱 설치(앱스토어/플레이스토어), 회원가입/로그인
- New Project → 디바이스: NodeMCU, 연결: WiFi → Auth Key 이메일로 수신, 코드에 입력
- 위젯 추가 (에너지 필요할 수 있음)
- 게이지 3개: 온도(V6, 0-50°C), 습도(V5), 가스(V?)
- zeRGBa: R→GP15, G→GP3, B→GP1 (RGB LED 제어)
- 버튼 4개: 모션 감지 on/off(V0), 토양 수분 on/off(V1), 릴레이 1, 릴레이 2
- SuperChart: 온도/습도/가스 데이터 스트림 추가
- 탭 추가: Twitter, Notifications(하드웨어 오프라인 알림), Email, Eventor(트리거 설정)
- Play 버튼으로 인터페이스 사용 시작
STEP 5: 옥토포드 구조물 만들기
경고: 가장 시간 많이 소요되는 과정! 3D 프린팅 가능한 인클로저 파일 제공하니 원하면 건너뛰세요.
종이박스로도 가능하지만, 독특한 디자인이 프로젝트 가치를 높입니다. 팔각형 입체 도형(3D 옥타곤) 디자인으로 수학 숙제하다 영감 얻음.
제작 과정
- 골판지에 9cm × 9.5cm 직사각형 4개(또는 8개) 연이어 그리기
- 사이 부분 칼집(접힘선) 내고 긴 조각으로 자르기, 4개 만들기
- 135° 각도 16개 잘라내기
- 글루건으로 각도 조각을 직사각형 사이 접합부에 붙이기
- 열린 구조 2개씩 붙여 닫힌 팔각형 2개 만들기
- 두 팔각형을 수직으로 붙여 3D 형태 완성
- 빈 공간에 9×9.5cm 조각 4개 추가
- 남은 8개 삼각형 구멍에 아크릴 버터페이퍼 삼각형 잘라 끼우기 (나중 수리용으로 1-2개는 열어둠)
도색
환기 잘 되는 곳에서 마스크/장갑 착용 후 스프레이 3회 도장 (4-5시간 간격). 유튜브 참고해 깔끔하게.
STEP 6: 도어락 인클로저 만들기
신발 박스에 스프레이 2-3회 도장, 덕트 테이프로 체크무늬 포인트.
STEP 7: 옥토포드 조립
회로도 참조해 연결:
- NodeMCU를 대형 브레드보드에 장착, 브레드보드 파워 서플라이로 전원 공급
- 센서 연결: DHT11→D4/GP2, MQ2→A0/ADC0, 토양 수분→D2/GP4, PIR→D6/GP1, RGB R→D8/GP15, G→RX/GP3, B→TX/GP1, 릴레이1→D0/GP16, 릴레이2→D5/GP14
- 파워뱅크/벽면 어댑터로 전원 공급
- 라즈베리파이+카메라: 골판지 벽에 작은 구멍 내 카메라 고정
- 전자부품 모두 내부 삽입, 아크릴 삼각형으로 마감 (토양 수분 센서 핀은 밖으로)
전원 켜고 식탁이나 손님용 테이블에 올리면 끝! 라즈베리파이 IP로 브라우저에서 실시간 피드 확인.
STEP 8: 도어락 조립
아두이노에 코드 업로드 후 회로도대로 연결. 신발 박스에 LED 구멍 2개, 서보 노출 구멍 뚫기. 서보 대신 기계식 잠금장치도 시중 판매 중이나 서보로도 충분. RFID 리더, 브레드보드, 아두이노 박스에 고정. 파워뱅크/어댑터로 전원 공급.
결론
정말 재미있는 프로젝트였습니다! 조명 효과가 예쁘게 나와 사이드 램프로도 손색없습니다. Blynk와 OpenCV 라이브러리 제작자들께 감사드립니다. 질문 있으면 댓글로 남겨주세요. 투표 부탁드립니다!
- Saksham
업데이트
아마존 알렉사 연동 작업 중, 2-3일 내 코드 업로드 예정!
코드
octopod.ino (아두이노) - 메인 NodeMCU 코드
아두이노 MKR 1010용. MAX32620FTHR 사용 시 해당 라이브러리 설치 후 보드 설정 변경, 핀 매핑 참고(ESP↔MAX 핀 매핑표 코드 내 포함).
octopod_door.ino (아두이노) - 자동 도어락 제어 (블루투스 없음)
MFRC522 라이브러리 필요. 허용 UID를 content.substring(1) == "XX XX XX XX" 부분에 입력.
octopod_door_bluetooth.ino (아두이노) - 자동 도어락 제어 (블루투스 버전)
SoftwareSerial로 블루투스 통신, 허용 UID 2개 등록 예시 포함.
커스텀 파트 및 인클로저
- 골판지/목재용 기본 설계:
octopod_v2_ukTmIJ0uMl.f3d
- 3D 프린팅용 정식 인클로저:
octo_2_v3_sii4tuCF7d.f3d
회로도
핀 구성은 아두이노 MKR 1010과 다를 수 있음. 블루투스 버전: HC-05 Rx→아두이노 Tx, HC-05 Tx→아두이노 Rx, 5V↔5V, GND↔GND. ESP↔MAX 핀 매핑표 포함.