Edited at

姿勢監視チェッカー作ってみた by JINS MEME

More than 3 years have passed since last update.

by JINS MEME × Philips Hue

姿勢監視チェッカー作ってみた


JinsMEME × PhilipsHue

JinsMEMEの加速度センサーをインプットとして使って、アウトプット先をPhilipsHueのLEDライトにして、猫背になったら赤く点滅し、正しい姿勢になるとアラートなしの通常のライトに戻るというのを作ってみました。


デスクワーカーのために

ホワイトカラー、デスクワーカーのために。

PCでの長時間の仕事をするとなるとどうしても、背中が曲がってきがちです。

猫背になると赤く点滅させるという物理的な現象を発生させ、まわりの人の迷惑にならないように、自分にとっても気が散らないようにするためにも便利なものです。

猫背にも前傾猫背や後傾猫背などがありますが、今回は前傾になった際に加速度センサーx軸のある一定の敷居値を超えたらという判定でアラートしています。

日常的に姿勢を観察し、正しい姿勢を維持することによって、腰痛の予防や、日々の姿勢を見直すきっかけになればなと思い作ってみました。


仕組み

JINS MEME→iOS→Philips Hue

JINS MEMEからiOSにBluetoothでデータを送信、

iOS側データを取得、iOSからwifi経由でPhilips Hueを操作

言語はSwiftで書き、Hueを操作するためのSDKを利用しています。

The hue Apple SDK by Philips

https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX


必要なもの、環境


実装 

作成したAppCilentIDとClientSecretを以下の****の場所にセットします。


AppDelegate.swift

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

MEMELib.setAppClientId("*********************", clientSecret: "*********************")
return true
}



  • SwiftからObjective-Cのクラスを利用するためにBridging-Header.hを作成
    HueSDK_iOSとSDKWizardの中のPHLoadingViewController,PHBridgeSelectionViewController,PHBridgePushLinkViewController
    プラス
    Meme用にMEMELibを記述


Bridging-Header.h


#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "PHLoadingViewController.h"
#import "PHBridgeSelectionViewController.h"
#import "PHBridgePushLinkViewController.h"
#import <HueSDK_iOS/HueSDK.h>

#import <MEMELib/MEMELib.h>

#endif /* Bridging_Header_h */



Hue bridgeとの接続

詳細に関してはこちらをご覧ください。

http://www.developers.meethue.com/documentation/apple-api-guide


猫背になったら、アラート

MEMEからのリアルタイムデータ取得の部分と、Hueのライト変更箇所を抜粋


MMDataViewController.swift


var memeRealTimeData:MEMERealTimeData?

func memeRealTimeModeDataReceived(data: MEMERealTimeData!) {

self.memeRealTimeData = data
if let d = self.memeRealTimeData as MEMERealTimeData?{

// 猫背判定
let accX = d.accX
if (Int(accX) <= -3){

// red
self.updateLight(0, isAlert: true, isRandom: false)
}
}
}

func updateLight(hueValue:Int, isAlert:Bool, isRandom:Bool){

let cache = PHBridgeResourcesReader.readBridgeResourcesCache()
let bridgeSendAPI = PHBridgeSendAPI()

for light in cache!.lights!.values {
// don't update state of non-reachable lights
if light.lightState!.reachable == 0 {
continue
}

let lightState = PHLightState()
if light.type == DIM_LIGHT {
// Lux bulbs just get a random brightness
lightState.brightness = Int(arc4random()) % 254
} else {

// アラートの場合
if isAlert {
// 点滅中
if lightState.alert == ALERT_SELECT {
break
}
lightState.alert = ALERT_SELECT
}

// ランダム点灯
if isRandom {
lightState.hue = Int(arc4random()) % 65535
}else{
lightState.hue = hueValue
}

lightState.brightness = 254
lightState.saturation = 254
}

// Send lightstate to light
bridgeSendAPI.updateLightStateForId(light.identifier, withLightState: lightState, completionHandler: { (errors: [AnyObject]!) -> () in

if errors != nil {
let message = String(format: NSLocalizedString("Errors %@", comment: ""), errors)
print("Response: \(message)")
}
})
}
}



ビルド実行

初期ロード時にHueとの接続、Scanして、MEMEと接続。

MEMEをかけた状態で、前傾姿勢になってみてください。


今後の展開

今回もJINS MEMEで遊んでみました。JINS MEME × Something(Thing to Thing)というのはいくらでもあります。

今回はローカルでのアラート点灯ですが、インターネット越しにリモートのデバイスを動かすようなことも可能で実装済みですので、公開していきたいと考えています。

AWS IoTでデバイス間の状態を検知して、M2M(Machine to Machine)の世界を実現できるのではないかと、わくわくしています。