🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

5667閲覧

ESP32同士でbluetoothシリアル通信させて複数のLEDを点灯させたい

Cytokine

総合スコア1

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/03/17 09:03

編集2021/03/17 09:08

### ESP32同士でのbluetoothシリアル通信を使ったLED点灯

ESP32を2つ使って片方をスイッチ、もう片方をLEDに接続してスイッチを押すとLEDが点灯するようなプログラムを作っています。
一つのボタンと一つのLEDを使ったプログラムは、このURL「https://www.remma.net/?p=367」を参考にしてできました。しかし、スイッチを2つ、LED2つを使った場合、片方のLEDが点灯しません。送信側にスイッチのプログラム、受信側にLEDを点灯させるプログラムをelse ifを使って記入しました。

発生している問題

else ifを使っているほうのLEDが点灯しない

該当のソースコード

Arduino

1//プログラムは上記URLを参考にしているので、以下のプログラムは自分で変更した部分のみです 2//受信側プログラム 3void loop() { 4 if (SerialBT.available()) { 5 Serial.println(SerialBT.available()); 6 if (SerialBT.read() == 'A') {    //スイッチを押すとLEDは点灯する 7 digitalWrite(LED_PIN1, HIGH); 8 } 9 else if (SerialBT.read() == 'D') {  //スイッチを押しても点灯しない 10 digitalWrite(LED_PIN2, HIGH); 11 } 12 } 13 14//送信側プログラム 15void loop() { 16 if (digitalRead(14) == LOW) { 17 Serial.println("LED is ON."); 18 SerialBT.write('A'); 19 } 20 else if (digitalRead(4) == LOW) { 21 SerialBT.write('D') 22 }

試したこと

・送信する文字の変更
・出力ピンの変更
・LEDの変更

補足情報(FW/ツールのバージョンなど)

Arduino IDEでボード変更することによりESP32に書き込んでいます。
Arduino 1.8.13 (Windows Store 1.8.42.0)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

シリアルの情報は、入力がある度にバッファに蓄えられて、readされる毎にバッファから取り出されます(バッファには残りません)

if (SerialBT.available()) { Serial.println(SerialBT.available()); if (SerialBT.read() == 'A') {    //スイッチを押すとLEDは点灯する digitalWrite(LED_PIN1, HIGH); } else if (SerialBT.read() == 'D') {  //スイッチを押しても点灯しない digitalWrite(LED_PIN2, HIGH); } }

では、'D'を一文字受信して上記に到達すると'D'がバッファに入っているのでSerialBT.available()が1になり、
if (SerialBT.read() == 'A') {    //スイッチを押すとLEDは点灯する
のSerialBT.read()
によって'D'が取り出されてバッファは空になり、取り出されたのは'D'だったので'A'とは異なり
else if (SerialBT.read()
に進んでSerialBT.read()に到達したときには既にバッファは空になっているのでデータの取り出しには失敗します。つまり、'D'を拾うことはできません。

送られた文字がなんだったかを判別するためには、read()を繰り返すのではなく、read()で読みだした文字を変数に保持して、その変数と比較対象を順次比較するようにします。

if (SerialBT.available()) { Serial.println(SerialBT.available()); char c=SerialBT.read(); //読みだした文字を変数に保存する if (c == 'A') { digitalWrite(LED_PIN1, HIGH); } else if (c == 'D') { digitalWrite(LED_PIN2, HIGH); } }

投稿2021/03/28 14:30

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

'D'を受信したとして

arduino

1if (SerialBT.read() == 'A') {

ここで受信バッファから1文字取り出して'A'と比較しているから
次のif文で受信バッファが空なのでは?

投稿2021/03/17 09:51

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cytokine

2021/03/22 07:57

受信バッファを空にしないような方法ってありますか? 個人的にもいろいろ調べたのですが、わかりませんでした。すいません
YAmaGNZ

2021/03/22 08:05

一旦変数で受けて、それを判断するのでいいのではないですか?
Cytokine

2021/03/28 13:25

送信側でint A ==1; int D == 2; としてみましたが、依然として結果が変わりませんでした
YAmaGNZ

2021/03/28 13:43

char data = SerialBT.read(); と変数に代入して、dataを判断に使うってことです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問