LoginSignup
0
0

More than 5 years have passed since last update.

スマホアプリとGenuino 101のBluetoothを使ったLチカで、点灯状態をsakura.ioでも受信する

Last updated at Posted at 2017-06-19

Genuino 101のBluetoothと連携させたサンプルスケッチのCurieBLEにあるLチカとsakura.ioを組み合わせました。

ここではGenuino 101 × sakura.io ArduinoシールドのLEDをスマホアプリでON/OFFさせ、LEDのステートをsakura.ioで送っています。

前回の投稿「sakura.ioをGenuino 101ではじめた(Lチカ~sakura.io接続テスト)」の環境が構築されていることを前提に行っていきましょう。

参考にしたページ

手順

Bluetoothを使ったLチカのテンプレートを開く

File→Examples→CurieBLE→Peripheral→LED を開く。

open-curie-led.png

必要なライブラリの追加

Sketch→Include Library→Wire と Sketch→Include Library→SakuraIO でライブラリ追加して、SakuraIO_I2Cをsakuraioとして読み込む。

#include <Wire.h>
#include <SakuraIO.h>
SakuraIO_I2C sakuraio;

open-library.png

sakura.io I2C接続と接続の待受け処理を追加

void setup() {
  Serial.begin(9600);

  Wire.begin(); //<1>

  Serial.print("Waiting to come online"); //<2>
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}

  // set LED pin to output mode
  pinMode(ledPin, OUTPUT);

  // begin initialization
  BLE.begin();

<1> Serial.begin()関数でシリアル通信を開始した後、Wire.begin()関数でI2C通信を開始
<2> さくらの通信モジュールの接続ステータスが接続になるまで待受け

LEDステート値の送信

loop()関数の手前に追加

uint8_t   SAKURAIO_CH_LED_STATE = 0; //<1>
uint32_t  LED_STATE_OFF = 0; //<2>
uint32_t  LED_STATE_ON  = 1; //<3>

void loop() {

<1> LED状態を確認するためのチャンネルとしてsakura.ioのChannel 0を定数に登録
<2> LEDの状態がOFFの場合
<3> LEDの状態がONの場合

if (switchCharacteristic.written()) {
    if (switchCharacteristic.value()) {   // any value other than 0
      Serial.println("LED on");
      digitalWrite(ledPin, HIGH);         // will turn the LED on
      sakuraio.enqueueTx(SAKURAIO_CH_LED_STATE, LED_STATE_ON); //<1>
    } else {                              // a 0 value
      Serial.println(F("LED off"));
      digitalWrite(ledPin, LOW);          // will turn the LED off
      sakuraio.enqueueTx(SAKURAIO_CH_LED_STATE, LED_STATE_OFF); //<1>
    }
    sakuraio.send(); //<2>
}

<1> LEDの状態が変化したとき、さくらの通信モジュールの送信キューにステートの値を溜める
<2> sakura.ioプラットフォームにデータを送信

プログラム完成

Arduino IDEで書き込みましょう。

led_sakuraio.ino
/*
 * Copyright (c) 2016 Intel Corporation.  All rights reserved.
 * See the bottom of this file for the license terms.
 */

/*
 * Sketch: led.ino
 *
 * Description:
 *   This is a Peripheral sketch that works with a connected Central.
 *   It allows the Central to write a value and set/reset the led
 *   accordingly.
 */

#include <Wire.h>
#include <SakuraIO.h>
SakuraIO_I2C sakuraio;

#include <CurieBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = 13; // pin to use for the LED

void setup() {
  Serial.begin(9600);

  Wire.begin();

  Serial.print("Waiting to come online");
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}

  // set LED pin to output mode
  pinMode(ledPin, OUTPUT);

  // begin initialization
  BLE.begin();

  // set advertised local name and service UUID:
  BLE.setLocalName("LED");
  BLE.setAdvertisedService(ledService);

  // add the characteristic to the service
  ledService.addCharacteristic(switchCharacteristic);

  // add service
  BLE.addService(ledService);

  // set the initial value for the characeristic:
  switchCharacteristic.setValue(0);

  // start advertising
  BLE.advertise();

  Serial.println("BLE LED Peripheral");
}

uint8_t   SAKURAIO_CH_LED_STATE = 0;
uint32_t  LED_STATE_OFF = 0;
uint32_t  LED_STATE_ON  = 1;

void loop() {
  // listen for BLE peripherals to connect:
  BLEDevice central = BLE.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());

    // while the central is still connected to peripheral:
    while (central.connected()) {
      // if the remote device wrote to the characteristic,
      // use the value to control the LED:
      if (switchCharacteristic.written()) {
        if (switchCharacteristic.value()) {   // any value other than 0
          Serial.println("LED on");
          digitalWrite(ledPin, HIGH);         // will turn the LED on
          sakuraio.enqueueTx(SAKURAIO_CH_LED_STATE, LED_STATE_ON);
        } else {                              // a 0 value
          Serial.println(F("LED off"));
          digitalWrite(ledPin, LOW);          // will turn the LED off
          sakuraio.enqueueTx(SAKURAIO_CH_LED_STATE, LED_STATE_OFF);
        }
        sakuraio.send();
      }
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}

/*
   Copyright (c) 2016 Intel Corporation.  All rights reserved.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

スマホと接続してLEDをON/OFF、sakura.ioプラットフォームでLEDのステートを確認

あとはArduino/Genuino 101 CurieBLE LEDを参考に、スマホアプリのnRF ConnectでLEDと表示されたデバイスに接続し、ON/OFFを送信してLEDを点灯消灯させると、sakura.ioプラットフォーム側にLEDのステートの値が送られます。

blink.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0