라즈베리파이는 소형 컴퓨터 이다.
게다가 리눅스 기반 컴퓨터라 사용자가 마음껏 용도를 바꿀수도 있다.
이번 포스팅에서는 구글의 모바일 및 웹 애플리케이션 개발 플랫폼 'Firebase' 에서 클라우드와
파이의 카메라, GPIO에 모션감지센서를 연결 할 것이다.
방에 침입자가 들어오면 모션센서가 이를 인식한 후 카메라로 찍어서 클라우드에 사진을 전송하는 기능을 구현해 보자.
Firebase 설정
1. Firabase홈페이지에 들어가서 구글계정으로 가입
2. 시작하기 -> 프로젝트 추가(Raspberry Pi) -> 왼쪽메뉴 Storage -> 파일 추가(Images)
3. 생성된 링크의 주소를 잘 기억해둔다.(raspberry-pi-da9d6)
4. 왼쪽메뉴 톱니바퀴 -> 프로젝트 설정 -> 서비스 설정 -> python선택 -> 새 비공개 키 생성
5. 다운받아진 파일(키값)을 라즈베리파이의 pi 디렉토리로 옮긴 후 파일명을 "serviceAccountKey.json" 으로 바꿔준다.
라즈베리파이 설정
1. Firebase와 라즈베리파이간의 파이썬 모듈을 설치해야 한다.
firebase_admin : 파이어베이스와 연동하기 위해 설치
uuid : UID를 생성하기 위해 설치
PiCamera : 파이카메라를 이용하기 위해 설치
~$ pip3 install firebase_admin
~$ pip3 install uuid
~$ pip3 install PiCamera
2. 깃허브에서 파이썬 코드 갖고오기.('reasley-com'오픈소스 참고)
GitHub - reasley-com/BP_Computing-RaspberryPi
~$ git clone https://github.com/reasley-com/BP_Computing-RaspberryPi/tree/main/Series3_Camera(FireStorage)
3. 파이썬코드 확인 및 수정
pi디렉토리에 Storage_camera.py파일이 다운받아졌는지 확인.
PROJECT_ID = " "부분에 본인의 파이어베이스 코드를 작성 후 저장
~$ nano Storage_camera.py
4. pi디렉토리에 Images 디렉토리 생성
~$ mkdir Images
결과확인1
파이썬 파일을 실행하면 파이어베이스 스토리지에 자동으로 업로드 되는것을 확인해보자.
~$ python3 Storage_camera.py
응용(GPIO)
라즈베리파이의 GPIO를 이용하여 모션감지센서를 연결한 후 모션을 감지하면 카메라 촬영을 하도록 만들어보자.
1. GPIO연결
GND | GND |
VCC | 5V |
OUT | 17번핀 |
2. 파이썬코드 수정
PROJECT_ID = " "파이어베이스 링크
chk라는 체크변수를 만들어서 2초이상 모션이 감지되면 촬영을 한다.
~$ nano HC-SR501+Storage_camera.py
from picamera import PiCamera
from time import sleep
import datetime
import sys, os
import requests
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
from uuid import uuid4
import RPi.GPIO as GPIO
import time
PROJECT_ID = "raspberry-pi-da9d6"
cred = credentials.Certificate("./serviceAccountKey.json")
default_app = firebase_admin.initialize_app(cred, {
'storageBucket': f"{PROJECT_ID}.appspot.com"
})
camera = PiCamera()
def fileUpload(file):
bucket = storage.bucket()
blob = bucket.blob('Images/'+file)
new_token = uuid4()
metadata = {"firebaseStorageDownloadTokens": new_token}
blob.metadata = metadata
blob.upload_from_filename(filename='./Images/'+file, content_type='image/jpeg')
print(blob.public_url)
def execute_camera():
subtitle = "Ras"
suffix = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + '.jpg'
filename = "_".join([subtitle, suffix])
camera.capture('/home/pi/Images/' + filename)
fileUpload(filename)
pin = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.IN)
time.sleep(2)
print('Ready')
chk = 0
try:
while True:
if(GPIO.input(pin)==1):
print('motion')
chk += 1
if chk >= 2:
execute_camera()
chk = 0
else:
print('noting')
time.sleep(1)
except KeyboardInterrupt:
pass
print('Exit with ^C. Goodbye!')
GPIO.cleanup()
exit()
결과확인2
'라즈베리파이' 카테고리의 다른 글
[라즈베리파이] TensorFlow Lite, Open CV를 이용한 사물인식 (13) | 2021.07.31 |
---|---|
[라즈베리파이] (유선->무선)프린터 만들기(삼성ML-2160) (0) | 2021.07.28 |
[라즈베리파이] 인트로 (0) | 2021.07.24 |