質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

692閲覧

aruduinoでプログラム whileのループが抜けられない

mimitabukuro

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/15 07:35

ESP32のbluetoothで1と0でセンサー出力をON/OFFするプログラムを作りたい

普段はvb.net を触っているぐらいなのですが、Aruduino最近触りはじめたところです。

作業環境はwin10Pro ,使用言語はC++?(Aruduino IDE)、ESP32のBluetoothモジュール、
通信はteratermを使用してます。

やりたいことESP32に照度センサーを接続して、ESP32とPCをBluetoothでペアリング。
PCからteratermで1+エンターキーで通信開始、ESP32からBluetoothで照度センサーの出力を送信、PCで受信し続ける。

PCのteratermで0を送信すると通信が止まる

以上の動作を実現したい。

現在の状況
PCのteratermで1+⏎キーで通信が始まりますが、0+⏎キーをしても通信が止まらない

以下にコードを記載します。


#include <BluetoothSerial.h>

BluetoothSerial SerialBT;

void setup() {
pinMode(35, INPUT); // 35番ピンを入力用にする
SerialBT.begin("ESP32LED"); // Bluetoothシリアルに「ESP32LED」という名前で初期化
Serial.begin(115200); // シリアルモニタの初期化

}

void loop() {
int dac ; // int型の変数dacを宣言する。
dac = analogRead(35); // 電圧を読み取って変数dacに代入する。

if(SerialBT.available()){
char ch = SerialBT.read();
Serial.println(ch);
while(ch =='1'){

Serial.println(dac); // 変数dacの値をシリアルモニタに出力する delay(500); // 0.5秒待つ SerialBT.println(dac); delay(500);

// if(ch =='0'){
// SerialBT.println('stop');
// break;
// }

}

}

}


0を受け付けてない?

そもそも、Whileを使わない方が良いのか?勉強不足でよくわかっていません。
アドバイスお願いいたします。

それとvb.netなどを使用しているとデバッグのステップオーバー機能とかがあるのでどう動作しているのかが確認しやすいのですが、AruduinoIDEは触り始めたばかりなのでよくわかりません。visual studio でもaruduino IDE があるみたいですが、評価があまり良くないのと有償なのでまだ導入していません。おすすめのAruduinoの開発環境がありましたら教えてください。

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

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

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

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

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

y_waiwai

2022/02/15 08:04

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

ベストアンサー

char ch = SerialBT.read();の後、whileに入った場合chが書き換わる機会がないので、whileから抜けることはありません。

おそらく似たようなミスをdacでもやらかしてます。これもwhile内で書き換わる機会がありません


whileを使わないほうがいいのか

私だったら、送信状態であるかどうかを示すグローバル変数を用意して

arduino

1void loop(){ 2 if(シリアルに受信可能な文字列があったら){ 3 受信文字に応じて送信状態を保持する変数を切り替える 4 } 5 6 if(送信状態である){ 7 送信処理 8 } 9}

投稿2022/02/15 07:47

編集2022/02/15 07:54
ozwk

総合スコア13553

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

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

mimitabukuro

2022/02/15 08:11

ozwk様 アドバイスありがとうございます。whileの中にあると書き換えれないでしたか...。 参考にしてやってみます。
ozwk

2022/02/15 08:14

whileの中にあると書き換えられないのではなく、単にあなたが書き換えるようなプログラムにしてないだけです。
ozwk

2022/02/15 08:15

極端な話、今回の質問は int a = 1; int b = a; a = 2; でbが2にならない!って言っているのに近いです。
mimitabukuro

2022/03/02 08:06

グローバル変数のアドバイスありがとうございました。 無事動作するプログラムが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問