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

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

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

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

Q&A

解決済

2回答

16524閲覧

2つのESP32でwifiを用いてデータのやり取り

CyPris

総合スコア11

Arduino

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

0グッド

1クリップ

投稿2018/05/09 14:57

編集2018/05/11 13:18

前提・実現したいこと

二つのesp32を用意して、片方をAPモードでサーバーとし、片方をクライアントとしてデータのやり取りを
したいと思っています。
クライアント側で適当なピンをAD変換しそのデータをサーバー側に送ろうと思います。
適当なピンをanalogReadでデジタル値として読み取ります。
analogReadのデフォルトの分解能は12bitなので0~4095の整数値を得ます。
このデータをサーバーに送信するにあたり、client.read()は1バイトごとにしか読み取ることが
出来ないので、analogReadで読み取った値をuint8_t型として送信しています。
試しにmap()関数を用いて12bitの値を8bitに変換してuint8_t型と比較したのですが、値が変わって
しまう理由が分かりません。
また、データの送受信にはどちらが最適なのでしょうか?

発生している問題・エラーメッセージ

エラーメッセージはありません。

該当のソースコード

arduino

1/*server側*/ 2#include<WiFi.h> 3const char *ssid="ESP32-WiFi"; //SSID 4const char *pass="esp32wifi"; //パスワード 5const IPAddress ip(192,168,0,9); //サーバーのIPアドレス 6const IPAddress subnet(255,255,255,0); //サブネットマスク 7WiFiServer server(80); 8void setup() 9{ 10 Serial.begin(9600); 11 12 WiFi.softAP(ssid,pass); //SSIDとパスの設定 13 delay(100); //接続失敗防止 14 WiFi.softAPConfig(ip,ip,subnet); //IPアドレス、ゲートウェイ、サブネットマスクの設定 15 IPAddress myIP = WiFi.softAPIP(); //WiFi.softAPIP()でWiFi起動 16 server.begin(); //サーバーを起動(htmlを表示させるため) 17 Serial.println(); 18 /*各種情報を表示*/ 19 Serial.println("WiFi connected"); 20 Serial.print("SSID:"); 21 Serial.println(ssid); 22 Serial.print("AP IP address:"); 23 Serial.println(myIP); 24 Serial.println("Server start!"); 25} 26 27uint8_t value; 28 29void loop() 30{ 31 //接続したクライアントの情報を得る。 32 WiFiClient client = server.available(); 33 if(client){ 34 Serial.println("new client"); 35 while(client.connected()){ 36 if(client.available()){ 37 38 value=client.read(); 39 Serial.println(value,sizeof(int)); 40 delay(1000); 41 } 42 } 43 44 } 45 46} 47------------------------------------------------------------------------- 48/*クライアント側*/ 49#include<WiFi.h> 50const char *ssid="ESP32-WiFi"; //サーバーのSSID 51const char *pass="esp32wifi"; //サーバーのパスワード 52static WiFiClient client; //WiFiClient型でclientと宣言 53 54void setup() { 55 Serial.begin(9600); 56 WiFi.begin(ssid,pass); //サーバーに接続 57 Serial.printf("\n"); 58 while(WiFi.status()!=WL_CONNECTED) 59 { 60 Serial.print("."); 61 delay(1000); 62 } 63 Serial.printf("\n"); 64 Serial.println("WiFi Connected"); 65 IPAddress ip(192,168,0,9); //サーバーのIPアドレス 66 client.connect(ip,80); //IPアドレスとポート番号を指定して接続 67} 68//試しに4バイトの値を送信 69int value=35454; 70void loop() { 71 72 73 74 delay(1000); 75 if(client.connected()==true) 76 { 77 client.write((uint8_t*)&value,sizeof(int)); 78 } 79}

試したこと

いきなりAD変換の値を送信せずにまず4バイトの整数を送信してみました。

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

4バイトの整数を送信してみた結果を追加しました。
/シリアルモニタの出力/
WiFi connected
SSID:ESP32-WiFi
AP IP address:192.168.0.9
Server start!
new client
1332
2022
0
0
1332
2022
0
0
1332
2022
0
0

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

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

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

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

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

y_waiwai

2018/05/09 15:06

Wifiのサーバとクライアントの通信はできているんでしょうか?
CyPris

2018/05/11 05:30

はい。適当な文字(Hello)などを送ることはできています。
guest

回答2

0

ベストアンサー

uint8_t にキャストあるいは代入するということは、下位8ビットに切り捨てる、ということになるので、そりゃ元データと合うわけがありません
上位の4ビットをどうしましょうか

#Wifiの件は別にして

投稿2018/05/09 16:08

y_waiwai

総合スコア87719

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

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

CyPris

2018/05/11 05:42

下位8ビットと上位4ビットに分けて上位ビットを8ビットシフトし、下位ビットと上位ビットを足し合わせることで表現できると思いますがどうでしょう?
y_waiwai

2018/05/12 11:08 編集

はっきり言ってそれじゃ無理です まだ上位8ビットだけ送るほうが現実的です(精度が1/256になりますが) ちゃんと2バイト送りましょうよ
y_waiwai

2018/05/12 11:42

ああ、コメントの意味を取り違えてました 上位4ビットのバイト(余った4ビットは0で埋めましょう)と、下位8ビットのバイトを、続けて送り、最初のバイトを8ビットシフトしたものと、次のバイトを足し合わせると、12ビット分が再構成できますね それでいいです
guest

0

リファレンス を見る限り、テキストに変換して送られそうですが?

なお、実際に送った値と受け取った値を質問に追記されるとわかりやすいと思われます。

1332は4進数と考えると、0x7E
2022は同様に、0x8A
となります。
送られている、35454 は 16進数で 0x8A7E であるため、送信自体は問題なく、
確認用の表示に問題があると考えられます。

ArduinoのPrint系のフォーマットをリファレンス等で再確認されたほうがよいと思われます。

投稿2018/05/11 06:06

編集2018/05/14 01:00
mituha

総合スコア385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問