注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!

Bluetooth メッセージボックス

このプロジェクトは、メッセージを受信し、LCDスクリーンに表示します。

家族用のメッセージボードとして使用し、まだ出かけていない家族に鍵を持って行くことを思い出させることができます。

必要なコンポーネント

このプロジェクトには以下のコンポーネントが必要です。

全体のキットを購入すると便利です。こちらがリンクです:

名称

このキットのアイテム数

リンク

Elite Explorer Kit

300+

Elite Explorer Kit

以下のリンクから別々に購入することもできます。

コンポーネント紹介

購入リンク

Arduino Uno R4 WiFi

-

ブレッドボード

購入

ジャンパーワイヤー

購入

I2C LCD1602

購入

配線図

../_images/07_lightblue_lcd_bb.png

回路図

../_images/07_lightblue_lcd_schematic.png

UUIDの生成

BLE通信において、UUIDはデバイスのユニーク性を保証し、データ交換の正確性を確保するために重要な役割を果たします。特定のアプリケーション要件に合わせて、独自のBLEサービスや特性を作成するために、UUIDをカスタマイズする必要があります。(ここでは、テキスト入力をサポートする特性を作成する必要があります。)

  1. オンラインUUIDジェネレーターツール を使用して、UUIDの競合を避けるためにあなただけのユニークなUUIDを生成します。

  2. バージョン4のUUIDを2つ生成します。

    ../_images/07_uuid_1.png

  3. それらをコピーし、コードの2つのUUIDを置き換えます。

    #define SERVICE_UUID "uuid1"
    #define CHARACTERISTIC_UUID "uuid2"
    

ライブラリのインストール

ArduinoBLE.h:Bluetooth Low Energy(BLE)通信を扱うために使用されます。 LiquidCrystal_I2C.h:I2Cインターフェースを持つ16x2文字LCDスクリーンを制御するために使用されます。

コードの実行

注釈

  • ファイル 07_lightblue_lcd.inoelite-explorer-kit-main\iot_project\07_lightblue_lcd のパスから直接開くことができます。

  • または、このコードをArduino IDEにコピーしてください。

注釈

ライブラリをインストールするには、Arduinoライブラリマネージャーを使用して、 「ArduinoBLE」「LiquidCrystal I2C」 を検索し、インストールします。

07_lightblue_lcd.ino
 1/*
 2  The code implements a Bluetooth Low Energy (BLE) peripheral using an Arduino Uno R4 WiFi 
 3  board. It advertises a BLE service with a custom UUID and a characteristic that can be read 
 4  and written to. A Liquid Crystal Display (LCD) with an I2C interface is used to display the 
 5  message when the BLE central device writes to the characteristic. 
 6
 7  Board: Arduino Uno R4 WiFI
 8  Component: Liquid Crystal Display 1602 with I2C Interface
 9  Library: https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/ (LiquidCrystal I2C by Frank de Brabander)
10           https://www.arduino.cc/reference/en/libraries/arduinoble/ (ArduinoBLE by Arduino)
11*/
12
13#include <Wire.h>
14#include <LiquidCrystal_I2C.h>
15#include <ArduinoBLE.h>
16
17#define SERVICE_UUID "19B10002-E8AA-548E-4F6C-D104768A1214"
18#define CHARACTERISTIC_UUID "19B10003-E8AA-548E-4F6C-D104768A1214"
19
20// Define a BLE service with a UUID
21BLEService boxService(SERVICE_UUID);
22
23// Define a BLE characteristic with a UUID and properties
24char *stringValue = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
25BLECharacteristic boxCharacteristic(CHARACTERISTIC_UUID, BLERead | BLEWrite, stringValue);
26
27// Initialize a 16x2 LCD using I2C
28LiquidCrystal_I2C lcd(0x27, 16, 2);
29
30void setup() {
31  Serial.begin(9600);
32  while (!Serial)
33    ;
34  if (!BLE.begin()) {
35    Serial.println("starting Bluetooth® Low Energy module failed!");
36    while (1)
37      ;
38  }
39
40  // Set advertised local name and service UUID:
41  BLE.setLocalName("UNO R4 BLE");
42  BLE.setAdvertisedService(boxService);
43  // Add characteristics to the service
44  boxService.addCharacteristic(boxCharacteristic);
45
46  // Add service
47  BLE.addService(boxService);
48
49  // Start advertising
50  BLE.advertise();
51  Serial.println("BLE Peripheral");
52
53  // Initialize the LCD
54  lcd.init();
55  lcd.backlight();
56  lcd.clear();
57  lcd.setCursor(0, 0);
58  lcd.print("Bluetooth LCD");
59}
60
61void loop() {
62  BLEDevice central = BLE.central();
63  if (central) {  // If a central device is connected
64    Serial.print("Connected to central: ");
65    Serial.println(central.address());
66
67    while (central.connected()) {                      // While the central device is connected
68      if (boxCharacteristic.written()) {               // Check if the characteristic has been written
69        int length = boxCharacteristic.valueLength();  // Get the length of the written value
70        byte buffer[length + 1];                       // Create a buffer to store the value
71        boxCharacteristic.readValue(buffer, length);   // Read the value into the buffer
72        buffer[length] = '\0';                         // Null-terminate the buffer to treat it as a string
73        Serial.print("Characteristic event, written: ");
74        Serial.print((char *)buffer);
75
76        // Print the received message to the LCD
77        lcd.clear();
78        lcd.setCursor(0, 0);
79        lcd.print("Message:       ");
80        lcd.setCursor(0, 1);
81        lcd.print((char *)buffer);
82      }
83    }
84    Serial.print("Disconnected from central: ");
85    Serial.println(central.address());
86  }
87}

操作方法

このスケッチで作成されたサービスと特性を操作するには、LightBlue(iOSおよびAndroid用)やnRF Connect(Android用)などの汎用的なBluetooth® Low Energy中央アプリを使用する必要があります。

例として、ArduinoのLEDをBluetooth経由で制御する方法をLightBlueを使用して説明します。

  1. App Store(iOS用)またはGoogle Play(Android用)からLightBlueアプリをダウンロードします。

    ../_images/07_lightblue.png
  2. ArduinoをBluetooth経由でスマートフォンに接続

    Bluetooth設定に移動し、「UNO R4 BLE」という名前のデバイスを探します。接続します。

    ../_images/07_iot_ble_01.jpg

  3. LightBlueを使用してArduinoとBluetooth経由でのインタラクション

    LightBlueを起動し、インターフェースの下部にある Bonded タブをタップします。ここには、スマートフォンが以前にペアリングしたBLEデバイスのリストが表示されます。 UNO R4 BLE を探して CONNECT をタップします。

    ../_images/07_iot_ble_02.jpg

    接続すると、Bluetoothデバイスに関する詳細情報にアクセスできます。サービスUUIDとキャラクタリスティックUUIDを見つけるために下にスクロールします。

    キャラクタリスティックをタップします。このキャラクタリスティックは読み取り可能で書き込み可能であり、読み取りと書き込みの両方が可能です。

    「Data format」セクションにスクロールしてUTF-8文字列に変更します。 テキストボックスにテキストを入力して書き込みをクリックします。入力したメッセージがLCDに表示されます。

    ../_images/07_iot_ble_03.jpg

どのように動作するのか?

こちらがコードの主要部分とそれぞれの機能の説明です:

  1. 必要なライブラリをインクルード:

    • ArduinoBLE.h:BLE通信を処理するために使用されます。

    • Wire.h:I2C通信のために使用されます。

    • LiquidCrystal_I2C.h:I2Cインターフェースを持つ16x2文字のLCDスクリーンを制御するために使用されます。

  2. BLEサービスとBLE特性を定義:

    • BLEService クラスを使用してBLEサービスを定義し、一意のUUIDを割り当てます。

    • BLECharacteristic クラスを使用してBLE特性を定義し、一意のUUIDを割り当て、読み取り( BLERead )と書き込み( BLEWrite )の権限を与えます。

    • 特性の初期値として文字配列 stringValue を作成します。

  3. 16x2文字LCDスクリーン(LCD)を初期化:

    • LiquidCrystal_I2C クラスを使用してLCDを初期化し、I2Cアドレス(0x27)と行と列の数(16x2)を指定します。

    • LCDのバックライトを点灯し、画面をクリアし、カーソルを最初の行の始めに移動し、「Bluetooth LCD」と表示します。

  4. setup() 関数で初期化を行う:

    • シリアル通信を初期化します。

    • BLEモジュールを初期化し、初期化に失敗した場合は無限ループに入ります。

    • BLE周辺機器のローカル名とサービスUUIDを設定します。

    • BLE特性をBLEサービスに追加します。

    • 中央デバイスが発見して接続できるようにBLEサービスをアドバタイズします。

    • LCDを初期化します。

  5. loop() 関数:

    • BLE.central() を呼び出して、BLE周辺機器に中央デバイスが接続されているかどうかを確認します。中央デバイスが接続されている場合は、接続処理のロジックに入ります。

    • 接続状態で、 boxCharacteristic.written() を確認して、BLE特性にデータが書き込まれたかどうかをチェックします。

    • データが書き込まれていた場合、 boxCharacteristic.valueLength() を使用して書き込まれたデータの長さを取得し、書き込まれたデータを格納するためのバイト配列 buffer を作成します。

    • boxCharacteristic.readValue() を使用して、BLE特性から buffer にデータを読み込みます。

    • buffer の最後にヌル文字 「\0」 を追加して文字列に変換します。

    • 受信したメッセージをシリアルモニタに表示し、LCDに表示します。

    • 中央デバイスが切断された後、次の中央デバイスが接続するのを待ち続けます。