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

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

ただいまの
回答率

90.48%

  • Arduino

    552questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 765

CyPris

score 3

 前提・実現したいこと

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

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

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

 該当のソースコード

/*server側*/
#include<WiFi.h>
const char *ssid="ESP32-WiFi"; //SSID
const char *pass="esp32wifi"; //パスワード
const IPAddress ip(192,168,0,9);  //サーバーのIPアドレス
const IPAddress subnet(255,255,255,0);  //サブネットマスク
WiFiServer server(80);
void setup()
{
  Serial.begin(9600);

  WiFi.softAP(ssid,pass);  //SSIDとパスの設定
  delay(100); //接続失敗防止
  WiFi.softAPConfig(ip,ip,subnet);  //IPアドレス、ゲートウェイ、サブネットマスクの設定
  IPAddress myIP = WiFi.softAPIP(); //WiFi.softAPIP()でWiFi起動
  server.begin(); //サーバーを起動(htmlを表示させるため)
  Serial.println();
  /*各種情報を表示*/
  Serial.println("WiFi connected");
  Serial.print("SSID:");
  Serial.println(ssid);
  Serial.print("AP IP address:");
  Serial.println(myIP);
  Serial.println("Server start!");
}

uint8_t value;

void loop()
{
  //接続したクライアントの情報を得る。
  WiFiClient client = server.available();
  if(client){
    Serial.println("new client");
    while(client.connected()){
      if(client.available()){

        value=client.read();
        Serial.println(value,sizeof(int));
        delay(1000);
      }
    }

  }

}
-------------------------------------------------------------------------
/*クライアント側*/
#include<WiFi.h>
const char *ssid="ESP32-WiFi"; //サーバーのSSID
const char *pass="esp32wifi"; //サーバーのパスワード
static WiFiClient client; //WiFiClient型でclientと宣言

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid,pass);  //サーバーに接続
  Serial.printf("\n");
  while(WiFi.status()!=WL_CONNECTED)
  {
    Serial.print(".");
    delay(1000);
  }
  Serial.printf("\n");
  Serial.println("WiFi Connected");
  IPAddress ip(192,168,0,9);  //サーバーのIPアドレス
  client.connect(ip,80);  //IPアドレスとポート番号を指定して接続
}
//試しに4バイトの値を送信
int value=35454;
void loop() {



  delay(1000);
  if(client.connected()==true)
  {
    client.write((uint8_t*)&value,sizeof(int));
  }
}

 試したこと

いきなり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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/05/10 00:06

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

    キャンセル

  • CyPris

    2018/05/11 14:30

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

    キャンセル

回答 2

checkベストアンサー

+1

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

#Wifiの件は別にして

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/11 14:42

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

    キャンセル

  • 2018/05/12 20:05 編集

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

    キャンセル

  • 2018/05/12 20:42

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

    キャンセル

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • Arduino

    552questions

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