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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

538閲覧

【ESP32同士】Bluetooth通信を使って、スイッチを押すたびに異なる文字列を送受信したい

Uka

総合スコア28

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/01/05 12:01

前提

2台のESP32間をBluetooth通信を使って、スイッチをクリックするたびに異なる信号を送受信したいと考えています。下記のプログラムをそれぞれのESPに実装したところ、スイッチを何回押しても1番目の分岐に入ってしまい、他の分岐に入りません。間違いがあればアドバイスいただけますとありがたいです。よろしくお願いします。

マスタ側:ディスプレイを接続
スレーブ側:スイッチを2個接続

該当のソースコード(マスタ側)

C

1while (1) { // 2 if (SerialBT.available()) { 3 char a = SerialBT.read(); 4 if (a == '1') { 5 //ディスプレイ表示("1表示") 6 } 7 if (a == '2') { 8 //ディスプレイ表示("2表示") 9 } 10 if (a == '3') { 11 //ディスプレイ表示("3表示") 12 } 13 if (a == '4') { 14 //ディスプレイ表示("4表示") 15 SerialBT.write('z'); 16 goto loopout; 17 } 18 } 19 } 20loopout:;

該当のソースコード(スレーブ側)

C

1if (digitalRead(39) == HIGH) { // 2 SerialBT.write('w'); //マスタ側で受信確認済 3 delay(20); 4 Serial.println("w_recieved"); 5 6 while (1) {// 7 if (SerialBT.available()) { 8 Serial.println(SerialBT.available()); 9 x = SerialBT.read(); 10 11 if (x == 'x') { 12 Serial.println("x_recieved"); //シリアル表示確認済 13 while (1) { 14 uint8_t zenkai, konkai, zenkai_, konkai_; 15 konkai = digitalRead(39); 16 konkai_ = digitalRead(36); 17 if ( zenkai == 0 && konkai == 1 ) { 18 gmty++; //初期値は0 19 if (gmty = 1) { //スイッチ(39)の押し回数1回目 20 SerialBT.write('1'); // 21 delay(100); 22 Serial.println("gmty1"); 23 } 24 else if (gmty == 2) { //スイッチ(39)の押し回数2回目 25 SerialBT.write('2'); 26 delay(100); 27 Serial.println("gmty2"); 28 } 29 else if (gmty == 3) { //スイッチ(39)の押し回数3回目 30 SerialBT.write('3'); // 31 delay(100); 32 Serial.println("gmty3"); 33 } 34 if (gmty > 3) { 35 gmty = 0; 36 } 37 38 } 39 zenkai = konkai; 40 if ( zenkai_ == 0 && konkai_ == 1 ) { 41 SerialBT.write('4); //スイッチ(36)の押し回数1回目 42 delay(100); 43 Serial.println("gmty4"); 44 goto loopout; 45 } 46 } 47 } 48 } 49 } 50loopout:;

現状の問題点

上記プログラムを動かしたところ、スレーブ側のESP32のシリアルモニタにはスイッチ(39)を押すたびに"gmty1"が表示される。マスタ側のディスプレイにはスレーブ側の状態を反映して常に"1表示"が表示される。
なお、下記のESP単体で動かしたときのプログラムでは、スイッチを押すたびに異なる分岐に入り、シリアルモニタに"1,2,3..."と順番に表示されることを確認しています。

ESP単体で動かしたときのプログラム(動作確認済)

C

1int gmty = 0; 2void loop() { 3 4 // 前回と今回のスイッチ状態を記録する変数 5 uint8_t zenkai, konkai; 6 7 // 今回のスイッチ状態を調べて、変数「konkai」に代入する 8 konkai = digitalRead(39); 9 10 if( zenkai == 0 && konkai == 1 ) { 11 if (gmty == 1){ //スイッチ(39)の押し回数1回目 12 Serial.println("1"); 13 delay(300); 14 } 15 else if (gmty == 2){ //スイッチ(39)の押し回数2回目 16 Serial.println("2"); 17 delay(300); 18 } 19 else if (gmty == 3){ //スイッチ(39)の押し回数3回目 20 Serial.println("3"); 21 delay(300); 22 } 23 if (gmty > 3){ 24 gmty = 0; 25 } 26gmty++; 27 } 28 29 // 今回のスイッチ状態を、次回用に前回のスイッチ状態に保存しておく 30 zenkai = konkai; 31}

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

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

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

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

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

guest

回答1

0

ベストアンサー

if (gmty = 1) { //スイッチ(39)の押し回数1回目

代入になってますよ

投稿2023/01/05 12:04

y_waiwai

総合スコア87830

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

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

Uka

2023/01/05 13:38

本当ですね💦ありがとうございます、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問