조도센서로 값을 잘 받아온다.


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같이 다른 프레임웍을 사용해도 상관은 없다.


웹쪽은 아는게 너무 없어서 적당히 기본만 구현해뒀는데 

아직 바꿔야 할 곳이 너무 많아서 소스는 못 올리겠다.


이렇게까지 구현하는데 파이썬 라이브러리에서 다 해줘서 내가 한 건 별로 없다.

물론 회의실이 여러개가 되고, 모듈의 개수를 늘리고, 

앞으로 해야할 것과 고려할 것은 훨씬 많이 남아있다.



..








+ Recent posts