M5StackBASICからWiFiのUDP通信でPCにデータを送る

M5StackからPCに"test"とか任意の数字を送ります。
前半はこの記事のパクリです。まんまです。
[WiFiを使ってM5Stack→PCにデータ送信](https://shizenkarasuzon.hatenablog.com/entry/2020/06/09/020243)
# "test"を送ってみる
### M5Stack側のプログラム
Arduino IDEで下のコードを書き込みます。
まずは
1.M5Stackボードに書き込めるようにする
2.ライブラリのインストール
が必要ですが簡単なのでここで書かなくても大丈夫だよね!
```c++
#include <WiFi.h>
#include <WiFiUDP.h>
#include <M5Stack.h>

// arp -aでIPアドレスをすべて取得
// ipconfigで自身のIPアドレスを取得

const char ssid[] = "hogehoge"; //WiFIのSSIDを入力
const char pass[] = "012345678"; // WiFiのパスワードを入力

WiFiUDP wifiUdp; 
const char *pc_addr = "123.234.345.456";(変えてね)送信先のPCのコマンドプロンプトに"ipconfig \all"と打ち込んでIPd4の欄を参照してね
const int pc_port = 50007; //(変えなくていいよ)送信先のポート
const int my_port = 50008;  //(変えなくていいよ)自身のポート


void setup() {
  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(2);

  WiFi.begin(ssid, pass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500); 
    M5.Lcd.print("."); 
  }  
  M5.Lcd.println("WiFi connected");
  M5.Lcd.print("IP address = ");
  M5.Lcd.println(WiFi.localIP());
  
  wifiUdp.begin(my_port);
}

void loop(){
  for(int i=0;i<100;i++){
  // データ送信
  wifiUdp.beginPacket(pc_addr, pc_port);
  wifiUdp.write('t');
  wifiUdp.write('e');
  wifiUdp.write('s');
  wifiUdp.write('t');
  wifiUdp.endPacket();
  M5.Lcd.print(".");


  delay(2000); //2秒待つ
  }

  //終了コマンド送信
  wifiUdp.beginPacket(pc_addr, pc_port);
  wifiUdp.write('&');
  wifiUdp.endPacket();
  delay(2000);
}
```
### PC側のプログラム
僕はVscodeにて下のコードをpythonで書いてパソコンのどっかに保存→コマンドプロンプトでそのプログラムの保存した場所までいって"python ファイルの名前.py"と打ち込んで実行しています。
最初は実行の仕方がわからんかった
```python
# -*-coding:utf-8-*-

import sys
from socket import *
import time

print("start network")
addr = ("", 50007) 

print("network setup started")
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.settimeout(0.0001)
print("Connected !!")
print("Network info -->" + str(addr))
UDPSock.bind(addr) 

print("setup finished")

while True:
    try:
        (data, addr) = UDPSock.recvfrom(1024)
    except timeout:
        continue

    if addr !=0:
        str_data = data.decode('utf-8')
        print(f"get message from {addr} --> {str_data}")

print("end!")
```
実行したあとどうなるかは上のリンク先を見てね!

# 任意の数字を送ってみる
上のプログラムでは固定の文字列しか送れませんでしたがここでは任意の負でない数を送ってみます。
知識不足で無理やりな方法になっていますが動くのでまあよし。
wifiUdp.write(65);とかで65と送れたらよいのですが実際は文字コードが65である'A'と送っていることになってしまいます。
[ASCIIコード表](http://www3.nit.ac.jp/~tamura/ex2/ascii.html)
こういった文字コードの関係で
'6'と送りたければwifiUdp.write(54);
'5'と送りたければwifiUdp.write(53);
というように+48する必要があります。
この方法では一桁ずつしか送れないので、それぞれの位の数を抜き出し、各々に48を足してwifiUdp.write()で送っています。

下のコードをM5Stackに書き込むと0000から9999まで送る事ができます。受信(PC)側は変えなくて大丈夫です
```c++
#include <WiFi.h>
#include <WiFiUDP.h>
#include <M5Stack.h>

const char ssid[] = "hogehoge"; //WiFIのSSIDを入力
const char pass[] = "01234567"; // WiFiのパスワードを入力

WiFiUDP wifiUdp; 
const char *pc_addr = "000.111.222.333";  //"192.168.0.6";
const int pc_port = 50007; //送信先のポート
const int my_port = 50008;  //自身のポート

int myVariable = 0000; // 送信したい変数

void setup() {
  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(2);

  WiFi.begin(ssid, pass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500); 
    M5.Lcd.print("."); 
  }  
  M5.Lcd.println("WiFi connected");
  M5.Lcd.print("IP address = ");
  M5.Lcd.println(WiFi.localIP());
  
  wifiUdp.begin(my_port);
}

void loop(){
  for(int i=0;i<10000;i++){

  wifiUdp.beginPacket(pc_addr, pc_port);

  wifiUdp.write(myVariable/1000+48);
  wifiUdp.write((myVariable/100)%10+48);
  wifiUdp.write((myVariable/10)%10+48);
  wifiUdp.write(myVariable%10+48);

  wifiUdp.endPacket();
  M5.Lcd.print(".");
  myVariable ++;

  delay(20); //0.02秒待つ
  }

  //終了コマンド送信
  wifiUdp.beginPacket(pc_addr, pc_port);
  wifiUdp.write('&');
  wifiUdp.endPacket();
  delay(2000);
}
```


実行したあとのコマンドプロンプトとかはこんな感じ↓になってるはず。(赤いとこにはIPアドレスが入ります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758601/e483a234-5add-cbc2-b4d5-ea1ef3a138ef.png)

絶対にもっといい方法有るんやけどな・・・正解教えてくれ