조도센서로 값을 잘 받아온다.
https://github.com/pimylifeup/Light_Sensor에서 받아온 코드를 기반으로
내가 필요한 기능들을 추가한다.
참고로 redis에 대한 설정은 구글링하면 금방 찾아볼 수 있다.
서버는 내가 사용하는 노트북이다.
우선 redis key로 사용할 ID가 필요해서 라즈베리파이 cpu의 시리얼 정보를 사용했고,
매일 누적하다보니 년, 월에 대한 정보까지 포함시켰다.
그리고 redis-collections의 List를 이용해서
redis에 저장되는 정보를 마치 List처럼 사용하였다.
써보니 엄청 편하다.
라즈베리파이에서 구동할 파이썬 코드의 설명이다.
1초 sleep을 주고 계속 루프를 돌면서 체크한다.
동작방식은 0.1초간 라즈베리파이에 전원이 인가되고
이 전원이 LDR(조도센서)를 지나가는데
이때의 조도센서는 어두울수록 저항값이 커지기때문에
GPIO.HIGH가 되기까지 더 오래걸려서 측정 값이 커진다.
라즈베리파이3에서 python2로 구동되는 코드
#!/usr/local/bin/python
from __future__ import print_function
from redislite import StrictRedis
from redis_collections import List
import RPi.GPIO as GPIO
import os
import time
from datetime import datetime
__author__ = 'Byungwoo Jeon'
__license__ = "GPL"
__maintainer__ = "byngwoo"
GPIO.setmode(GPIO.BOARD)
# define the pin that goes to the circuit
pin_to_circuit = 7
def get_rp_serial():
try:
f = open('/proc/cpuinfo', 'r')
for line in f:
if line[0:6] == 'Serial':
cpu_serial = line[10:26]
f.close()
except:
cpu_serial = None
return cpu_serial
def rc_time(pin_to_circuit):
count = 0
# Output on the pin for
GPIO.setup(pin_to_circuit, GPIO.OUT)
GPIO.output(pin_to_circuit, GPIO.LOW)
time.sleep(0.1) # sec
# Change the pin back to input
GPIO.setup(pin_to_circuit, GPIO.IN)
# Light-dependent resistor
# When light hits the LDR, its resistance is very low,
# but when it's in the dark its resistance is very high.
# -> Count until the pin goes high
while (GPIO.input(pin_to_circuit) == GPIO.LOW):
count += 1
return count
def redis_init():
serial_number = get_rp_serial() # get cpu serial number
if serial_number is None:
serial_number = '00000001' # temp number
ip = os.environ.get('RS_HOST') # RS: raspberry pi
port = os.environ.get('RS_PORT')
pw = os.environ.get('RS_PASSWORD')
now = datetime.now()
time_str = '%4d%02d%02d' % (now.year, now.month, now.day)
redis_connection = StrictRedis(host=ip, port=port, db=0, password=pw)
r = List(redis=redis_connection, key='rp3:'+serial_number+time_str)
return r
# Catch when script is interupted, cleanup correctly
try:
r = redis_init()
# Main loop
while True:
current_light = rc_time(pin_to_circuit)
try:
r.append(current_light)
print(current_light)
except Exception as e:
print("error: ", e)
pass
time.sleep(1) # sec
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
이 자체만으로 제대로 측정하려면 라즈베리파이에서 딱 이 스크립트만 돌려야한다.
만약 라즈베리파이에서 웹브라우저 실행과 같이 라즈베리파이의 자원을 많이 필요로 하는 작업을 하면
위의 측정 값은 신뢰할 수 없게 된다.
서버에서 수집한 정보를 조회하는 코드
라즈베리파이가 DB에 List형태로 저장하므로 이를 받아와서
그래프로 보여주기에 매우 수월하다.
서버는 python3를 사용
#!/usr/local/bin/python3
from redis import StrictRedis
from redis_collections import List
import matplotlib.pyplot as plt
import os
def redis_init():
ip = os.environ.get('RS_HOST') # RS: raspberry pi
port = os.environ.get('RS_PORT')
pw = os.environ.get('RS_PASSWORD')
redis_connection = StrictRedis(host=ip, port=port, db=0, password=pw)
# TODO: support multi keys
r = List(redis=redis_connection, key='rp3:00000000448f542820170421')
return r
def main():
r = redis_init()
plt.xlabel('Run time(sec)')
plt.ylabel('LDR resister')
plt.plot(r)
plt.show()
if __name__ == '__main__':
main()
수행한 결과 화면
아직 제대로 조건을 못 찾았지만
아래처럼 조건을 정해서 그래프에 표시할 수도 있다.
def main():
r = redis_init()
plt.xlabel('Run time(sec)')
plt.ylabel('LDR resister')
for i in range(1, len(r)):
if r[i-1] - r[i] > 1000 and r[i] < 1000:
plt.annotate('turn on', xy=(i, 600), xytext=(i, 1200),
arrowprops=dict(facecolor='black', shrink=0.05),)
plt.plot(r)
plt.show()
아래처럼 형광등이 켜졌다고 판단하는 시점을
아래처럼 알아서 표시해줄수도 있는데
아직 저 값에 대해서는 시험이 좀 더 필요하다.
이것에 대해 최종적으로는
Django를 이용해서 웹에서 보여준다. (개인적으로 Django 공부중)
물론 flask, bottle같이 다른 프레임웍을 사용해도 상관은 없다.
웹쪽은 아는게 너무 없어서 적당히 기본만 구현해뒀는데
아직 바꿔야 할 곳이 너무 많아서 소스는 못 올리겠다.
이렇게까지 구현하는데 파이썬 라이브러리에서 다 해줘서 내가 한 건 별로 없다.
물론 회의실이 여러개가 되고, 모듈의 개수를 늘리고,
앞으로 해야할 것과 고려할 것은 훨씬 많이 남아있다.
..
'Language > PYTHON' 카테고리의 다른 글
Python3로 naver 카페에 글쓰기 (18) | 2017.12.27 |
---|---|
Naver open api 카페 한글 깨짐 현상 (Python3) (15) | 2017.09.05 |
[Redis] redis-cli로 ip, port, password 입력하여 접속하기 (9) | 2017.04.06 |
대한민국 인구수에 따른 분포도 그리기 (numpy, pandas, matplotlib) (8) | 2017.04.06 |
[라즈베리파이3] 블루투스 키보드 자동 연결하기 (8) | 2017.04.05 |