센서의 아날로그 출력을 A/D 변환하여 알림을 채팅 앱으로 날리기

업무로 Raspberry Pi에 센서를 연결하고,
임계값을 넘으면 경고를 날리는 구조를 만들었으므로 메모해 둔다.

일단 Line과 Chatwork의 두 가지 앱에 경고를 날려 보았다.
Slack는 사용자 계층이 적합하지 않기 때문에 통과한다.

개요



포토 레지스터 (광 의존 저항)를 사용하여,
공장의 램프에 설치하고 램프가 붙으면 감지하여 경고를 날리도록 한다.

사용 부품


  • Raspberry Pi 3 Model B

  • Raspberry Pi용 센서
  • 포토 레지스터
  • A/D 컨버터 (ADC0832)


  • 회로







    포토레지스터의 저항값을 측정하여 빛이 인가되었는지 여부를 결정하는 회로.
    또한, 포토 레지스터의 출력을 ADC0832로 A/D 변환한다.

    단, 에 들어 있는 포토레지스터는, 아래 그림과 같이 되어 있어, 위 그림과 같이 저항을 끼우는 것이 아니라, Signal 핀으로부터 직접 청색선을 늘리면 된다.



    또한, ADC0832는 이하와 같은 핀 배치로 되어 있다.


    위 그림과 같이 CS를 GPIO11, CLK를 GPIO12, DI와 DO를 GPIO13에 연결했다.

    라이브러리 준비



    여기 에서 ADC0832.py20_photoRes.py 를 다운로드하여 Raspberry Pi의 동일한 디렉토리에 넣습니다.

    핀 번호가 아니라 GPIO 번호로 지정하는 것이 선호하므로 ADC0832.py의 GPIO 지정 모드를 변경했다.

    여기에 지정된 번호가 이전에 연결된 회로와 일치합니다.

    ADC0832.py
    def setup(cs=11, clk=12, dio=13):
        global ADC_CS, ADC_CLK, ADC_DIO
        ADC_CS = cs
        ADC_CLK = clk
        ADC_DIO = dio
        GPIO.setwarnings(False)
    -    GPIO.setmode(GPIO.BOARD)           # Number GPIOs by its physical location
    +    GPIO.setmode(GPIO.BCM)
        GPIO.setup(ADC_CS, GPIO.OUT)        # Set pins' mode is output
        GPIO.setup(ADC_CLK, GPIO.OUT)       # Set pins' mode is output
    

    Line에 경보를 날리기



    LINE Developers Trial에 등록하기



    (PUSH_MESSAGE를 사용할 수있는 계획이라면 뭐든지 좋다)
    등록 방법은 여러가지 기사가 공개되어 있으므로 설명을 생략한다.

    line-bot-sdk 설치



    파이썬 용 SDK이 공개되어 있으므로 README대로 설치.
    $ pip install line-bot-sdk
    

    메시지 PUSH


    20_photoRes.py 를 기반으로 PUSH 메시지를 지연하도록 다시 씁니다.

    photo_regsiter.py
    #!/usr/bin/env python
    # coding: UTF-8
    
    import ADC0832
    import sys
    import time
    from datetime import datetime
    from linebot import (
        LineBotApi
    )
    from linebot.exceptions import (
        InvalidSignatureError
    )
    from linebot.models import (
        MessageEvent, TextMessage, TextSendMessage,
    )
    
    line_bot_api = LineBotApi('Access Token')
    
    
    def init():
        ADC0832.setup()
    
    
    def loop():
        error = False
        while True:
            res = ADC0832.getResult()
            if res <= 10:
                if not error:
                    line_bot_api.push_message("Your user ID", TextSendMessage(text='エラーランプが点灯しました。'))
                error = True
            else:
                error = False
            time.sleep(0.4)
    
    if __name__ == '__main__':
        init()
        try:
            loop()
        except KeyboardInterrupt:
            ADC0832.destroy()
            print 'The end !'
    
    
    Access TokenYour user ID 는 Line Developers 콘솔에서 확인한다.
    특히 Your user ID 는 일반 유저가 사용한다 @hogehoge 같은 녀석이 아니기 때문에 주의한다.

    이것을 Raspberry Pi에서 실행하면, 포토 레지스터의 저항이 현저하게 내려갔을 경우(=빛이 비춰진) 경우에 라인의 메시지가 날아가게 된다.
    적당한 계정으로 친구가 되어 있으면 메시지를 확인할 수 있다.

    Chatwork에 알림 건너뛰기



    이쪽도 API가 공개되어 있으므로, 사양없이 사용한다.
    개인 계정을 가지고 있으면, 「API 설정」으로부터 간단하게 API 토큰을 취득할 수 있다.

    파이썬에서 API를 사용하기 위해 requests 패키지 설치.
    $ pip install requests
    

    메시지 PUSH



    photo_register_chatwork.py
    #!/usr/bin/env python
    # coding: UTF-8
    
    import ADC0832
    import sys
    import time
    from datetime import datetime
    import requests
    
    
    APIKEY = 'API KEY'
    ENDPOINT = 'https://api.chatwork.com/v2'
    ROOMID = 'ROOM ID'
    
    post_message_url = '{}/rooms/{}/messages'.format(ENDPOINT, ROOMID)
    headers = {'X-ChatWorkToken': APIKEY}
    params = {'body': 'エラーランプが点灯しました。'}
    
    
    def init():
        ADC0832.setup()
    
    
    def loop():
        error = False
        while True:
            res = ADC0832.getResult()
            if res <= 10:
                if not error:
                    resp = requests.post(post_message_url,
                                         headers=headers,
                                         params=params)
                error = True
            else:
                error = False
            time.sleep(0.4)
    
    
    if __name__ == '__main__':
        init()
        try:
            loop()
        except KeyboardInterrupt:
            ADC0832.destroy()
            print 'The end !'
    
    API KEY 는 이전에 취득한 API 토큰의 값을,ROOM ID는 메시지를 PUSH하려는 대화방의 ID를 지정합니다.
    ROOM ID 는 채팅방 주소의 rid 이후의 숫자이다.

    요약


  • Raspberry PI는 센서의 아날로그 값을 디지털 값으로 변환하여 얻을 수 있습니다.
  • 센서 값에 따라 Line 및 Chatwork와 같은 채팅 앱에서 알릴 수 있습니다.
  • 좋은 웹페이지 즐겨찾기