ArduinoIDEでM5StackのATOMS3Liteを使う

### ATOMS3 Lite【M5STACK-C124】
Wifiを使ってTCPとUDPで通信したい
### IDEの設定
```
バージョン：2.3.2
日付：2024-02-20T10:04:35.814Z
CLIバージョン：0.35.3
```
ボードマネージャ
[ツール][ボード][ボードマネージャ]=[M5Stack]
ボード
[ツール][ボード][M5Stack][M5AtomS3]
ライブラリマネージャ
[ファイル][基本設定][追加のボードマネージャ]=以下のURL
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
参考
https://qiita.com/penguinprogrammer/items/774d4b719464e41cdcf3
ライブラリ
[スケッチ][ライブラリをインクルード]=[M5Stack]
以下をビルドするとエラーになるので
```
#include <M5Stack.h>
static int l_cnt = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("%d\n",l_cnt);
  l_cnt++;
  delay(1000);
}
```
```
In file included from c:\Users\masumi\Documents\Arduino\libraries\M5Stack\src/M5Display.h:8,
                 from c:\Users\masumi\Documents\Arduino\libraries\M5Stack\src/M5Stack.h:111,
                 from C:\Users\masumi\Documents\Arduino\sketch_mar19a\sketch_mar19a.ino:1:
c:\Users\masumi\Documents\Arduino\libraries\M5Stack\src/utility/In_eSPI.h:633:20: error: 'VSPI' was not declared in this scope
     uint8_t port = VSPI;
                    ^~~~
c:\Users\masumi\Documents\Arduino\libraries\M5Stack\src/utility/In_eSPI.h:633:20: note: suggested alternative: 'SPI'
     uint8_t port = VSPI;
                    ^~~~
                    SPI
「SD.h」に対して複数のライブラリが見つかりました
  使用済：C:\Users\masumi\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\2.1.1\libraries\SD
  未使用：C:\Users\masumi\AppData\Local\Arduino15\libraries\SD
exit status 1

Compilation error: exit status 1
```
### M5CoreS3に変更
「there is a separate library for M5CoreS3」なので
https://github.com/m5stack/M5Stack/issues/316
以下のリポジトリの別ライブラリ「M5CoreS3」を使う
https://github.com/m5stack/M5CoreS3
[スケッチ][ライブラリをインクルード]=[M5CoreS3]
### PlatformIOと共通化のためにM5Unifiedに変更
[スケッチ][ライブラリをインクルード]=[提供されたライブラリ/M5Unified]
### LEDの点灯
[スケッチ][ライブラリをインクルード]=[提供されたライブラリ/FastLED]
参考
https://winchans.com/archives/603
https://fastled.io/docs/class_c_fast_l_e_d.html
### UDP送受信
本家
https://www.arduino.cc/reference/en/libraries/wifi/
参考
https://note.com/khe00716/n/n65a479049078
### 実装例
```
#include <M5Unified.h>
#include <WiFi.h>
#include <FastLED.h>

//#define Serial USBSerial

#if 1
static const char *ssid = "RPiAP";
static const char *password = "1234567890123456";
#endif
#if 0
static const char *ssid = "aterm-0356f5-g";
static const char *password = "0eb31244d6e34";
#endif
static WiFiUDP c_udp;
static const int l_txport = 55556;
static const int l_rxport = 55555;

enum {
  NUM_LEDS = 1,
  LED_DATA_PIN = 35,
};
static CRGB leds[NUM_LEDS];

void setup() {
  // put your setup code here, to run once:
#if 1
  M5.begin();
  M5.Power.begin();
#else
  auto cfg = M5.config();
  M5.begin(cfg);
#endif
  Serial.begin(9600);
  Serial.println("hello world");
  FastLED.addLeds<WS2811, LED_DATA_PIN, GRB>(leds, NUM_LEDS);
  leds[0] = CRGB::Green;
  FastLED.setBrightness(0);
  FastLED.show();
  WiFi.disconnect();
  if (true) {
    int n = WiFi.scanNetworks();
    if (n == 0) {
      Serial.println("no networks found");
    } else {
      int i;
      for (i = 0; i < n; i++) {
        Serial.printf("%d:", i + 1);
        Serial.print(WiFi.SSID(i));
        Serial.printf("(%d)", WiFi.RSSI(i));
        Serial.println(WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? " " : "*");
      }
    }
  }
  if (true) {
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    delay(1000);
    while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      FastLED.setBrightness(32);
      FastLED.show();
      delay(500);
      FastLED.setBrightness(0);
      FastLED.show();
      delay(500);
    }
    FastLED.setBrightness(32);
    FastLED.show();
    Serial.println("connected");
    Serial.print("IP address:");
    Serial.println(WiFi.localIP());
    c_udp.begin(l_rxport);
  }
  c_udp.begin(l_rxport);
}

void loop() {
  // put your main code here, to run repeatedly:
  const int len = c_udp.parsePacket();
  if (0 < len) {
    char recvbuf[80];
    IPAddress addr = c_udp.remoteIP();
    const uint16_t port = c_udp.remotePort();
    const int rd = c_udp.read((uint8_t *)recvbuf, sizeof(recvbuf));
    if (0 < rd) {
      recvbuf[rd] = '\0';
      char *ptr;
      if ((ptr = strchr(recvbuf, '\r')) != NULL) { *ptr = '\0'; }
      if ((ptr = strchr(recvbuf, '\n')) != NULL) { *ptr = '\0'; }
      Serial.print("udprecv ");
      Serial.print(addr);
      Serial.printf(":%d %d [%s]\r\n", port, rd, recvbuf);
      static int l_cnt = 0;
      char sendbuf[80];
      sprintf(sendbuf, "%d\r\n", l_cnt++);
      const int len = strlen(sendbuf);
      const int bgn = c_udp.beginPacket(addr, l_txport);
      const size_t wr = c_udp.write((const uint8_t *)sendbuf, len);
      const int end = c_udp.endPacket();
      if ((ptr = strchr(sendbuf, '\r')) != NULL) { *ptr = '\0'; }
      if ((ptr = strchr(sendbuf, '\n')) != NULL) { *ptr = '\0'; }
      Serial.print("udpsend ");
      Serial.print(addr);
      Serial.printf(":%d %d [%s]\r\n", l_txport, len, sendbuf);
    }
  }
  static bool l_pressed = false;
  M5.update();
  if (!l_pressed && M5.BtnA.isPressed()) {
    l_pressed = true;
    char sendbuf[80];
    strcpy(sendbuf, "name1\r\n");
    IPAddress server(192, 168, 249, 1);
    const int len = strlen(sendbuf);
    const int bgn = c_udp.beginPacket(server, l_txport);
    const size_t wr = c_udp.write((uint8_t *)sendbuf, len);
    const int end = c_udp.endPacket();
    char *ptr;
    if ((ptr = strchr(sendbuf, '\r')) != NULL) { *ptr = '\0'; }
    if ((ptr = strchr(sendbuf, '\n')) != NULL) { *ptr = '\0'; }
    Serial.print("udpsend ");
    Serial.print(server);
    Serial.printf(":%d %d [%s]\r\n", l_txport, len, sendbuf);
    delay(1000);
  }
}
```