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

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

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

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

Q&A

1回答

1761閲覧

2台のesp8266それぞれにLEDを付けてスマホ1台でLチカさせたい!

退会済みユーザー

退会済みユーザー

総合スコア0

Arduino

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

0グッド

0クリップ

投稿2021/12/18 08:00

編集2021/12/19 03:07

前提・実現したいこと

お世話になります!
スマホ1台で、WiFiを使用し直接2台のesp8266それぞれのLEDを点灯と消灯をさせてみたいです。
具体的には、
esp82661台をAP(Webサーバー)、1台をSTAとして、APのhtml上に2つのボタンを用意し、
スマホでそのボタンを押すことでLEDそれぞれを制御したいです。
現状AのLED(親機)は制御できているのですがBのLED(子機)ができておりません。
シリアルを出力したところ親機側にて子機との通信ができておりません。。
アドバイスをいただきたいです!

### 該当のソースコード(追記) 以下ソース /*親機*/ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> const char *ssid = "LED"; const char *password = "123456789"; //子機 const IPAddress ip(192, 168, 4, 3); //子機 const IPAddress subnet(255, 255, 255, 0); boolean ALED = false; boolean BLED = false; ESP8266WebServer server(80); WiFiClient client; String form ="<html>" "<head><meta name=viewport content=width=100></head>" "<form action=A_LED><input type=submit value=A></form>" "<form action=B_LED><input type=submit value=B></form>" "</html>"; void Atika(); void A_LED(); void Btika(); void B_LED(); void setup() { delay(1000); Serial.begin(115200); Serial.println(); Serial.print("Configuring access point..."); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); WiFi.begin("BLED","123456789"); server.begin(); server.on("/", handleRoot); server.on("/A_LED",Atika); server.on("/B_LED",Btika); Serial.println("HTTP server started"); pinMode(4, OUTPUT); } void loop() { server.handleClient(); } void handleRoot(){ server.send(200, "text/html", form); } void Atika(){ A_LED(); server.send(200, "text/html", form); } void A_LED(){ ALED = !ALED; digitalWrite(4, ALED); } void Btika(){ B_LED(); server.send(200, "text/html", form); } void B_LED(){ if(client.connect(ip,80))Serial.println("success"); if(client.connected())Serial.println("success"); BLED = !BLED; client.write(BLED); delay(1000); } /*子機*/ #include <ESP8266WiFi.h> const char* ssid = "BLED"; const char* password = "123456789"; const IPAddress ip(192,168,4,3); const IPAddress subnet(255,255,255,0); WiFiServer server(80); boolean BLED=false; void B_tika(); void setup() { delay(1000); Serial.begin(115200); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_AP); delay(100); WiFi.softAP(ssid,password); WiFi.softAPConfig(ip,ip,subnet); IPAddress myIP = WiFi.softAPIP(); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(myIP); pinMode(4, OUTPUT); digitalWrite(4, LOW); server.begin(); } void loop() { B_tika(); } void B_tika(){ WiFiClient client = server.available(); client.connected(); BLED=client.read(); digitalWrite(4,BLED); }

詳細

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

Arduino 1.8.16

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

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

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

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

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

y_waiwai

2021/12/18 08:10

子機のシリアルの出力はどうなってるんでしょうか
退会済みユーザー

退会済みユーザー

2021/12/18 08:16

コメントありがとうございます! 子機は主に受信のみを想定しておりました・・・ もしかして何か送信すべきなのでしょうか?
y_waiwai

2021/12/18 08:29

コードを見ると動作確認用にシリアルの出力してるようですが、それは見てないんでしょうか。
退会済みユーザー

退会済みユーザー

2021/12/18 08:31

すみません、誤解しておりました。 ....... WiFi connected IP address: 192.168.4.3 success 上記のとおり出力されております。
guest

回答1

0

WiFiとしてAPかSTNかと、Webサーバとして動くかクライアントとして動くかは関係のない話ですが、それはともかく。

「親機」と「子機」の関係において、どちらもクライアントになっているように思いますが違いますか?
親機はサーバーを立ててクライアントであるスマホの入力を受け取る。
子機もサーバーを立ててクライアントである親機からの信号を受け取る
(つまり親機はサーバーのインスタンスを一つとクライアントのインスタンスを一つ、両方持つ)
という構成になるんじゃないかと思いますがどうでしょう。

子機もクライアントにする、という手もありますが、そうすると繋がれた親機のサーバーが2つの接続を適切に処理できなきゃいけなくなって、マルチスレッド当然なESP32ならともかくESP8266では結構面倒なことになりそう。

投稿2021/12/18 08:26

thkana

総合スコア7703

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

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

退会済みユーザー

退会済みユーザー

2021/12/18 08:45 編集

回答ありがとうございます! ご指摘の通りesp同士、クライアントになっているように見えます・・・ 子機でも WiFiServer server(80)を用意して 親機でも client.connect(子機のip,80)を実行する ということでしょうか? 勉強します・・・!
退会済みユーザー

退会済みユーザー

2021/12/18 11:58

すみません、 >>(つまり親機はサーバーのインスタンスを一つとクライアントのインスタンスを一つ、両方持つ) について、親機はクライアントとして子機に通信するとき親機のWiFiの接続は一度切断して子機につなぎ直す必要ありますでしょうか?
thkana

2021/12/18 12:25

WiFiは通信経路の話。サーバだのクライアントだのはその上で行われる通信の話。 誰かと電話で話していて、話題が変わる度に電話を一旦切って掛け直したりはしないでしょう?
退会済みユーザー

退会済みユーザー

2021/12/19 03:08 編集

お世話になっております! 親機から子機への通信がうまくいきません。 親機のB_LED内で子機へconnectしようとしているのですが、 BLEDとの通信が確立できていなくて、何かアドバイスを頂戴できればと思います。 *質問欄のソースに追記
thkana

2021/12/19 02:53

質問の事項で新しい展開があったということなら、質問に追記してください。 ここはあくまで「回答についてのコメント」欄です。
退会済みユーザー

退会済みユーザー

2021/12/19 03:03

失礼しました。 追記いたします!
thkana

2021/12/19 04:46

追記っていう言葉を知らなかったかな。追加して書くこと。ばっさり書き換えちゃうと質問とこれまでの回答がちぐはぐになっちゃうでしょ、なので前の質問はそのまま(必要に応じて編集してもいいけれど)残して、「追加になった情報を追加して書く」ということなんだけれど。
thkana

2021/12/19 05:20

とりあえず12/19版のソース内容について言えば、回答の一番最初と回答コメントの12/18 21:25を読んでみてください。 APとAPの間でWiFiは繋がりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問