작은 실습을 하나의 작품으로 묶기
지금까지 배운 내용은 따로 보면 작은 부품입니다. LED 켜기, 센서 읽기, Flask 웹 페이지 만들기, MQTT 메시지 보내기, systemd 자동 실행은 각각 짧은 실습이었습니다. 하지만 이 부품들을 목적에 맞게 연결하면 하나의 쓸모 있는 장치가 됩니다.
종합 프로젝트의 핵심은 더 어려운 명령어를 외우는 것이 아닙니다. 문제를 정하고, 필요한 부품을 고르고, 프로그램을 나누고, 실패했을 때 확인할 지점을 미리 정하는 것입니다. 이 과정을 거치면 라즈베리 파이는 단순한 학습 보드가 아니라 직접 만든 작은 시스템이 됩니다.
이 장에서는 두 가지 완성 프로젝트를 설계합니다.
온습도 측정, 웹 대시보드, MQTT 알림, 자동 실행을 결합한 스마트 환경 모니터
카메라, 움직임 감지, 원격 알림을 결합한 간단한 보안 관찰 시스템
완성 기준은 단순합니다. 전원을 켜면 자동으로 실행되고, 다른 컴퓨터나 휴대폰에서 상태를 확인할 수 있으며, 문제가 생겼을 때 로그로 원인을 찾을 수 있으면 됩니다.
AI 생성 이미지
종합 프로젝트 1: 스마트 환경 모니터
스마트 환경 모니터는 방 안의 온도와 습도를 주기적으로 측정하고, 웹 화면에 기록을 보여 주며, 기준값을 넘으면 MQTT로 알림 메시지를 보내는 장치입니다. 지금까지 만든 센서 실습, SQLite 데이터 기록, Flask 대시보드, MQTT, systemd 서비스를 하나로 묶는 프로젝트입니다.
준비물
Raspberry Pi 4 또는 5
Raspberry Pi OS가 설치된 microSD 카드 또는 SSD
DHT22 온습도 센서
점퍼선, 브레드보드
필요 시 10kΩ 저항
선택 부품: 상태 표시용 LED, 330Ω 저항
같은 네트워크에 연결된 PC 또는 스마트폰
주의: GPIO는 3.3V 기준으로 동작합니다. 센서의 데이터 핀에 5V 신호를 직접 넣지 마세요. LED에는 반드시 저항을 연결하고, 회로를 바꾸기 전에는 전원을 끈 상태에서 배선을 확인하세요.
기본 연결
DHT22를 예로 들면 다음처럼 연결합니다.
DHT22 VCC → 라즈베리 파이 3.3V
DHT22 GND → 라즈베리 파이 GND
DHT22 DATA → GPIO4
센서 모듈이 아닌 단품 DHT22를 사용할 때는 DATA와 VCC 사이에 10kΩ 풀업 저항이 필요할 수 있습니다.
상태 표시 LED를 추가한다면 다음처럼 연결합니다.
GPIO17 → 330Ω 저항 → LED 긴 다리
LED 짧은 다리 → GND
전원을 켜기 전에는 점퍼선이 5V 핀과 GPIO 핀 사이에 잘못 꽂혀 있지 않은지 한 번 더 확인합니다.
프로젝트 폴더 만들기
먼저 전용 폴더와 가상환경을 만듭니다.
mkdir -p ~/projects/env-monitor/templates
cd ~/projects/env-monitor
python -m venv .venv
source .venv/bin/activate
pip install flask paho-mqtt gpiozerosqlite3 명령이나 MQTT 구독 명령을 사용할 예정이라면 시스템 패키지도 확인합니다.
sudo apt update
sudo apt install -y sqlite3 mosquitto-clients센서 라이브러리는 사용하는 센서와 운영체제 버전에 따라 달라질 수 있습니다. DHT22를 실제로 읽을 때는 Adafruit DHT 계열 라이브러리처럼 별도 설치가 필요한 경우가 많습니다. 처음에는 실제 센서 대신 임의의 값을 생성해 전체 구조가 동작하는지 확인하고, 마지막에 read_sensor() 함수만 실제 센서 코드로 바꾸면 실수를 줄일 수 있습니다.
추천 파일 구조는 다음과 같습니다.
env-monitor/
├── app.py # Flask 웹 대시보드
├── collector.py # 센서 측정과 DB 저장
├── mqtt_alert.py # MQTT 알림 발행
├── sensor_reader.py # 실제 센서 읽기 함수
├── config.py # 기준 온도, MQTT 주제 등 설정
├── readings.db # SQLite 데이터베이스
└── templates/
└── index.html역할을 나누면 수정이 쉬워집니다. 센서가 바뀌면 sensor_reader.py만 고치고, 웹 화면 디자인을 바꾸려면 templates/index.html만 수정합니다. 설정값은 코드 곳곳에 직접 쓰기보다 config.py에 모아 두는 편이 좋습니다.
동작 흐름 설계
프로그램은 다음 순서로 움직이면 됩니다.
collector.py가 60초마다 온도와 습도를 읽습니다.측정값을
readings.db에 저장합니다.온도가 기준값을 넘으면
mqtt_alert.py를 통해home/studyroom/alert주제로 메시지를 보냅니다.app.py는 최근 측정값을 읽어 웹 대시보드에 표시합니다.systemd 서비스가
collector.py와app.py를 부팅 시 자동 실행합니다.
이 구조는 간단하지만 실제 IoT 장치의 기본 형태와 같습니다. 센서가 있고, 데이터 저장소가 있고, 사용자 화면이 있고, 알림 통로가 있습니다.
여기서 한 가지를 더 생각해 두면 좋습니다. 센서 읽기에 실패했을 때 프로그램이 바로 멈추면 장기 운영이 어렵습니다. 한두 번 실패한 값은 건너뛰고, 오류 메시지를 로그에 남긴 뒤 다음 측정을 계속 시도하도록 만드는 편이 안전합니다.
실행 확인
먼저 수동으로 실행합니다.
cd ~/projects/env-monitor
source .venv/bin/activate
python collector.py다른 터미널에서 데이터가 저장되는지 확인합니다.
sqlite3 readings.db 'select * from readings order by id desc limit 5;'웹 서버를 실행합니다.
python app.py브라우저에서 다음 주소로 접속합니다.
http://라즈베리파이_IP주소:5000MQTT 알림은 구독 명령으로 확인합니다.
mosquitto_sub -t 'home/studyroom/#' -v기준 온도를 일부러 낮게 설정했을 때 알림 메시지가 보이면 정상입니다. 알림이 보이지 않는다면 먼저 MQTT 브로커 주소, 포트, 주제 이름이 발행 쪽과 구독 쪽에서 같은지 확인합니다.
자동 실행 테스트
수동 실행이 안정적으로 동작하면 systemd 서비스로 등록합니다. 서비스 등록 후에는 다음 명령으로 상태를 확인합니다.
sudo systemctl status env-collector
sudo systemctl status env-dashboard
journalctl -u env-collector -f서비스 상태가 failed로 표시되면 ExecStart 경로, 가상환경의 파이썬 경로, 작업 디렉터리, 파일 권한을 차례로 확인합니다. 수동 실행은 되는데 서비스에서만 실패하는 경우에는 대부분 경로 문제이거나 환경변수 문제입니다.
마지막 테스트는 재부팅입니다.
sudo reboot재부팅 후 직접 프로그램을 실행하지 않아도 데이터가 쌓이고 웹 대시보드가 열리면 프로젝트의 기본 완성 조건을 통과한 것입니다.
종합 프로젝트 2: 간단한 보안 관찰 시스템
두 번째 프로젝트는 카메라로 특정 공간을 관찰하다가 움직임이 감지되면 사진을 저장하고 MQTT 또는 Node-RED로 알림을 보내는 시스템입니다. 현관 안쪽, 작업실, 반려동물 공간처럼 개인이 관리하는 장소에서 테스트하기 좋습니다.
주의: 카메라 프로젝트는 사생활과 직접 연결됩니다. 다른 사람이 있는 공간을 촬영할 때는 반드시 동의를 받아야 합니다. 외부 인터넷에 카메라 화면을 그대로 공개하지 마세요.
준비물
라즈베리 파이 카메라 모듈 또는 USB 카메라
충분한 저장 공간
안정적인 전원 어댑터
MQTT 브로커 또는 Node-RED 대시보드
선택 부품: 움직임 감지 상태를 표시할 LED
카메라 모듈은 먼저 다음 명령으로 테스트합니다.
rpicam-hello -t 5000운영체제 버전이나 설치 상태에 따라 예전 이름인 libcamera-hello가 사용되는 경우도 있습니다. 명령을 찾을 수 없다고 나오면 카메라 패키지와 Raspberry Pi OS 버전을 먼저 확인하세요.
USB 카메라는 장치 인식부터 확인합니다.
lsusb
ls /dev/video*카메라가 보이지 않는다면 코드보다 연결 방향, 리본 케이블, USB 전원, 카메라 활성화 설정을 먼저 확인합니다.
동작 흐름 설계
보안 관찰 시스템은 다음 순서로 움직입니다.
카메라에서 일정 간격으로 프레임을 읽습니다.
이전 화면과 현재 화면의 차이를 비교합니다.
변화량이 기준값보다 크면 움직임으로 판단합니다.
사진을
captures/폴더에 시간 이름으로 저장합니다.MQTT로
home/entrance/motion주제에 알림을 보냅니다.너무 많은 알림을 막기 위해 30초 정도 대기 시간을 둡니다.
프로젝트 폴더는 다음처럼 구성할 수 있습니다.
motion-watch/
├── motion_detector.py
├── notifier.py
├── config.py
├── captures/
└── logs/처음부터 완벽한 감지를 목표로 하지 마세요. 햇빛 변화, 그림자, 카메라 흔들림도 움직임으로 감지될 수 있습니다. 그래서 감지 기준값, 최소 면적, 알림 대기 시간을 조절하는 과정이 필요합니다. 야간처럼 조명이 갑자기 바뀌는 환경에서는 오탐지가 늘어날 수 있으므로, 테스트 시간대를 나누어 확인하는 것이 좋습니다.
확인 방법
실행 중 저장되는 파일을 확인합니다.
watch -n 2 'ls -lh ~/projects/motion-watch/captures | tail'MQTT 알림은 다음처럼 확인합니다.
mosquitto_sub -t 'home/entrance/#' -v서비스로 등록했다면 로그를 봅니다.
journalctl -u motion-watch -f보안 관찰 시스템의 완성 기준은 다음과 같습니다.
카메라가 재부팅 후에도 정상 인식된다.
움직임이 있을 때만 사진이 저장된다.
알림이 너무 자주 반복되지 않는다.
저장 공간이 가득 차지 않도록 오래된 파일 삭제 규칙이 있다.
촬영 파일과 알림 경로가 외부에 무단 공개되지 않는다.
저장 공간 관리는 꼭 넣어 두세요. 예를 들어 captures/ 폴더에서 7일이 지난 파일을 지우거나, 전체 용량이 일정 크기를 넘으면 오래된 파일부터 삭제하도록 만들 수 있습니다. 카메라 프로젝트는 며칠만 방치해도 예상보다 빠르게 저장 공간을 사용할 수 있습니다.
프로젝트 기획서 작성하기
좋은 프로젝트는 코드보다 기획서에서 먼저 정리됩니다. 기획서는 길 필요가 없습니다. 한 장이면 충분합니다. 대신 다음 항목은 꼭 들어가야 합니다.
# 프로젝트 이름
## 1. 해결하려는 문제
무엇을 불편하게 느꼈고, 어떤 상태가 되면 해결이라고 볼 것인가?
## 2. 성공 기준
- 전원을 켜면 자동 실행된다.
- 웹 화면에서 최근 값을 확인할 수 있다.
- 오류가 나면 로그로 원인을 찾을 수 있다.
## 3. 부품 목록
- 라즈베리 파이 모델:
- 센서:
- 액추에이터:
- 전원:
- 케이블과 저항:
## 4. 핀 연결표
| 부품 | 라즈베리 파이 핀 | 주의 |
|---|---|---|
| DHT22 DATA | GPIO4 | 3.3V 기준 |
| LED + | GPIO17 | 330Ω 저항 필요 |
## 5. 프로그램 구조
- 센서 읽기:
- 데이터 저장:
- 웹 화면:
- 알림:
- 자동 실행 서비스:
## 6. 테스트 항목
- 센서값이 정상 범위인가?
- DB에 기록되는가?
- 웹에서 보이는가?
- MQTT 알림이 오는가?
- 재부팅 후 자동 실행되는가?
## 7. 장애 대응
- 전원이 부족할 때:
- 네트워크가 끊겼을 때:
- 센서가 값을 못 읽을 때:
- 저장 공간이 부족할 때:이 문서를 먼저 작성하면 작업 순서가 선명해집니다. 특히 핀 연결표는 중요합니다. 나중에 회로를 다시 만들 때 사진보다 더 정확한 기준이 됩니다. 코드 작성 중에 연결을 바꾸었다면 기획서의 핀 연결표도 바로 고쳐 두세요. 실제 회로와 문서가 달라지면 나중에 디버깅이 훨씬 어려워집니다.
문서화와 Git 저장소 관리
프로젝트는 한 번 성공했다고 끝이 아닙니다. 다음 달에 다시 만들 수 있어야 진짜 내 기술이 됩니다. 그래서 코드, 설치 방법, 회로 연결, 서비스 파일을 함께 정리해야 합니다.
먼저 Git을 설치하고 기본 설정을 합니다.
sudo apt update
sudo apt install -y git
git config --global user.name your-name
git config --global user.email [email protected]프로젝트 폴더에서 저장소를 만듭니다.
cd ~/projects/env-monitor
git init
git status
git add README.md config.example.py app.py collector.py sensor_reader.py
git commit -m 'Initial environment monitor project'비밀번호, API 토큰, Wi-Fi 정보, SSH 개인키, 촬영 이미지, 데이터베이스 파일은 Git에 올리지 않는 것이 원칙입니다. .gitignore 파일을 만들어 제외합니다.
.venv/
__pycache__/
*.db
.env
captures/
logs/실제 설정 파일에 비밀번호나 주소가 들어간다면 config.py 대신 config.example.py만 저장소에 올리는 방식도 좋습니다. 예제 파일에는 값의 형식만 남기고, 실제 값은 각 장치에서 따로 작성합니다.
README.md에는 다음 내용을 적습니다.
프로젝트 목적
완성 사진 또는 구성 그림
부품 목록
GPIO 핀 연결표
설치 명령어
실행 방법
systemd 서비스 등록 방법
자주 발생한 오류와 해결 방법
다음에 개선할 점
문서화는 남에게 보여 주기 위한 작업만은 아닙니다. 미래의 내가 같은 실수를 반복하지 않게 만드는 안전장치입니다.
다음 학습 로드맵
라즈베리 파이를 한 권의 책으로 끝낼 수는 없습니다. 대신 이제 어디로 나아갈지 선택할 수 있는 기준이 생겼습니다.
1. 리눅스 서버 운영
웹 대시보드와 자동 실행에 흥미를 느꼈다면 서버 운영을 더 배워 보세요. 다음 주제들이 이어집니다.
Nginx를 이용한 웹 서버 구성
HTTPS 인증서 적용
로그 회전과 모니터링
Docker로 서비스 분리
정기 백업 자동화
목표 프로젝트는 집 안에서 쓰는 개인 대시보드, 파일 서버, 메모 서버가 좋습니다.
2. 임베디드 시스템
GPIO, 센서, 모터 제어가 재미있었다면 임베디드 시스템으로 확장할 수 있습니다. Raspberry Pi Pico, Arduino, ESP32 같은 보드는 운영체제 없이 더 직접적으로 하드웨어를 제어합니다.
배울 내용은 C/C++, MicroPython, I2C, SPI, UART 같은 통신 방식입니다. 라즈베리 파이는 상위 서버로 두고, 작은 보드들이 센서를 담당하게 만들면 더 안정적인 구조를 만들 수 있습니다.
3. 로봇과 자동화 장치
서보 모터, 초음파 센서, 카메라를 결합하면 로봇 프로젝트로 이어집니다. 처음에는 바퀴 달린 작은 차를 만들고, 이후에는 거리 유지, 라인 추적, 장애물 회피를 추가합니다.
이 분야에서는 전원 설계가 매우 중요합니다. 모터 전원을 라즈베리 파이 5V 핀에서 무리하게 끌어오지 말고, 별도 배터리와 모터 드라이버를 사용해야 합니다.
4. 머신러닝과 컴퓨터 비전
카메라 프로젝트가 흥미로웠다면 OpenCV와 머신러닝을 배워 보세요. 단순 움직임 감지를 넘어 사람 감지, 물체 분류, 색상 추적, 숫자판 인식 같은 프로젝트를 만들 수 있습니다.
라즈베리 파이는 작은 모델을 실행하기에 좋지만 무거운 학습 작업에는 한계가 있습니다. 학습은 PC나 클라우드에서 하고, 라즈베리 파이에서는 가벼운 추론만 실행하는 구조가 현실적입니다.
5. 클라우드 IoT
MQTT와 스마트홈 자동화가 재미있었다면 클라우드 IoT로 확장할 수 있습니다. 여러 장소의 라즈베리 파이가 데이터를 보내고, 클라우드에서 대시보드와 알림을 관리하는 구조입니다.
이때는 TLS 인증서, 장치별 권한, API 키 관리, 비용 제한을 반드시 함께 배워야 합니다. 외부 접속이 편해질수록 보안 책임도 커집니다.
마지막 점검표
책을 마치기 전에 다음 항목을 스스로 확인해 보세요.
Raspberry Pi OS를 직접 설치하고 부팅할 수 있다.
터미널에서 파일을 만들고 이동하고 삭제할 수 있다.
apt,systemctl,journalctl을 사용할 수 있다.파이썬으로 반복 실행, 조건 판단, 파일 저장을 할 수 있다.
GPIO에 LED, 버튼, 센서를 안전하게 연결할 수 있다.
웹 대시보드로 데이터를 보여 줄 수 있다.
MQTT로 장치끼리 메시지를 주고받게 할 수 있다.
systemd로 프로그램을 자동 실행할 수 있다.
로그와 백업을 통해 문제를 추적할 수 있다.
프로젝트를 문서화하고 Git으로 관리할 수 있다.
모든 항목을 완벽하게 할 필요는 없습니다. 중요한 것은 막혔을 때 어디를 확인해야 하는지 아는 것입니다. 전원인지, 회로인지, 코드인지, 네트워크인지, 권한인지 구분할 수 있다면 이미 초보자의 가장 큰 벽을 넘은 것입니다.
라즈베리 파이 학습은 작은 성공을 쌓는 과정입니다. LED 하나를 켠 경험이 센서 장치가 되고, 센서 장치가 웹 서버가 되고, 웹 서버가 스마트홈 시스템이 됩니다. 이제부터는 예제를 따라 하는 사람이 아니라, 필요한 장치를 설계하고 고쳐 가는 사람이 되는 단계입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.