SensorTag에서 측정한 온도, 습도 등을 Raspberry Pi3를 통해 Ambient로 보내 그래프화

TI사의 SensorTag 에서 측정한 온도, 습도, 기압, 조도, 배터리 레벨을 Bluetooth Low Energy(BLE)로 Raspberry Pi3(RPi3)로 보내고, RPi3에서 IoT 데이터 시각화 서비스 "Ambient"로 보내 데이터를 그래프화했습니다.

2017/6/1 추가. "SensorTag는 광고 상태에서 2분간 방치해두면 슬립 모드로 들어가 통신할 수 없게 되므로 장기간 측정하는 단말로는 사용하기 어렵다"고 썼습니다만, 접속한 채로 하면 슬립 모드에는 들어가지 않는다 그래서 장기간 측정하는 단말기로서도 문제없이 사용할 수 있는 것을 알았습니다. 자세한 내용은 "SensorTag에서 온도, 습도 등을 측정하고 Raspberry Pi3 경유로 Ambient에 보내 그래프화한다"을 참조하십시오.



SensorTag



SensorTag에는 통신 모듈이 다른 세 가지 유형의 장치가 있습니다. 이번에 사용한 것은 「멀티 스탠다드 SensorTag」라고 하는 것으로, BLE로 통신합니다. 센서로는 주변 및 표면 온도 센서, 습도 센서, 기압 센서, 주변 광 센서, 가속도 센서, 자이로스코프, 나침반, 자기 센서가 탑재되어 있습니다.

SensorTag는 3분 동안 놓으면 슬립 모드로 들어갑니다. 전력 절약 설계입니다만, 다시 전원 버튼을 누르지 않으면 통신할 수 없게 되므로, 어딘가에 설치해 장기간 기온 등을 측정하는 단말로서는 사용하기 어려운 사양입니다.

이번에는 이 사용하기 어려운 사양에는 눈을 감고, SensorTag에서 RPi3를 경유해 Ambient에 데이터를 보내는 테스트를 실시했습니다.

Raspberry Pi3 (RPi3)의 Python으로 Ambient로 중계



"멀티 스탠다드 SensorTag"는 BLE로 통신합니다. 거기서 게이트웨이로서 Raspberry Pi3(RPi3)를 사용해, RPi3로부터 BLE로 SensorTag의 데이터를 취득해, Ambient에 보냈습니다.
프로그램은 파이썬으로 작성되었습니다. 라이브러리로 블루피을 사용했습니다. 먼저 bluepy를 RPi에 설치합니다.
pi$ sudo apt-get install python-pip libglib2.0-dev
pi$ git clone https://github.com/IanHarvey/bluepy.git
pi$ cd bluepy
pi$ python3 setup.py build
pi$ sudo python3 setup.py install

그런 다음 Ambient의 Python 라이브러리도 설치합니다.
pi$ sudo pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git

SensorTag에서 데이터를 검색하는 Python 프로그램은 대략 다음과 같은 흐름입니다.
  • BLE 장치 스캔
  • 스캔한 장치에서 SensorTag 찾기
    (SensorTag는 로컬 이름이 'CC2650 SensorTag'입니다)
  • SensorTag에 연결
    (SensorTag 클래스의 인스턴스를 만들면 연결됩니다.)
  • 온도, 습도, 기압, 조도, 배터리 센서 활성화
  • 온도, 습도, 기압, 조도, 배터리 값 읽기
  • 센서 비활성화
  • 읽은 값을 Ambient에 보냅니다
  • 5 초마다 위의 동작을 반복합니다

  • 이 프로그램을 실행하면 SensorTag 데이터가 Ambient로 전송되어 그래프로 표시되는 것을 확인할 수 있었습니다.
    pi$ sudo python3 st2ambient.py
    scanning tag
    found SensorTag, addr = 24:71:89:bc:63:84
    {'d4': 81, 'd5': 336.32, 'd2': 45.806884765625, 'd1': 25.1875, 'd3': 1016.45}
    200
    

    Ambient 화면에서 다음과 같이 표시됩니다.


    프로그램을 마지막으로 게시합니다. 이번에는 SensorTag에서 RPi3을 통해 Ambient로 데이터를 보내는 테스트로 SensorTag가 절전 모드로 들어가면 수동으로 전원 버튼을 눌러 다시 시작해야하며 Python 프로그램에는 여러 SensorTag가 있습니다. 경우를 고려하지 않습니다. 이것들은 다음 과제입니다.
    # -*- coding: utf-8 -*-
    # while True:
    #     SensorTagをスキャンし、見つけたデバイスに接続し、
    #     温度、湿度、気圧、照度、バッテリーレベルを取得し、Ambientに送信
    #
    import bluepy
    import time
    import sys
    import argparse
    import ambient
    
    def main():
        channelId = チャネルID
        writeKey = 'ライトキー'
    
        parser = argparse.ArgumentParser()
        parser.add_argument('-i',action='store',type=float, default=120.0, help='scan interval')
        parser.add_argument('-t',action='store',type=float, default=5.0, help='scan time out')
    
        arg = parser.parse_args(sys.argv[1:])
    
        scanner = bluepy.btle.Scanner(0)
        am = ambient.Ambient(channelId, writeKey)
    
        while True:
            dev = None
            print('scanning tag...')
            devices = scanner.scan(arg.t)  # BLEをスキャンする
            for d in devices:
                for (sdid, desc, val) in d.getScanData():
                    if sdid == 9 and val == 'CC2650 SensorTag': # ローカルネームが'CC2650 SensorTag'のものを探す
                        dev = d
                        print('found SensorTag, addr = %s' % dev.addr)
            sys.stdout.flush()
    
            if dev is not None:
                tag = bluepy.sensortag.SensorTag(dev.addr) # 見つけたデバイスに接続する
    
                tag.IRtemperature.enable()
                tag.humidity.enable()
                tag.barometer.enable()
                tag.battery.enable()
                tag.lightmeter.enable()
    
                # Some sensors (e.g., temperature, accelerometer) need some time for initialization.
                # Not waiting here after enabling a sensor, the first read value might be empty or incorrect.
                time.sleep(1.0)
    
                data = {}
                data['d1'] = tag.IRtemperature.read()[0]  # set ambient temperature to d1
                data['d2'] = tag.humidity.read()[1]  # set humidity to d2
                data['d3'] = tag.barometer.read()[1]  # set barometer to d3
                data['d5'] = tag.lightmeter.read()  # set light to d5
                data['d4'] = tag.battery.read()  # set battery level to d4
    
                tag.IRtemperature.disable()
                tag.humidity.disable()
                tag.barometer.disable()
                tag.battery.disable()
                tag.lightmeter.disable()
    
                print(data)
                r = am.send(data)
                print(r.status_code)
                sys.stdout.flush()
    
                time.sleep(arg.i)
                # tag.waitForNotifications(arg.t)
    
                tag.disconnect()
                del tag
    
    if __name__ == "__main__":
        main()
    

    좋은 웹페이지 즐겨찾기