PICマイコンと接続して使用するための予備知識、M5 ATOM Lite bluetooth通信 

# PICマイコンをIOT端末化するための予備知識。

:::note info
今回は、
ATOM Liteのbluetooth通信の基本的な使い方メモ。

通信相手は、パソコンのUSB端子に差し込んだBluetoothアダプタ。

USARTシリアル通信、115200bps。

M5 ATOM Lite(arduino)のライブラリを使用するので、あっという間に通信できます。
![全体図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/42bd28f2-cb23-15df-d290-af06e34de2cc.jpeg)


:::

:::note info
開発環境：vsCode + Platform IO
ライブラリ：
FastLED by Daniel Garcia
M5Atom by M5Stack
:::


**M5 ATOM Lite**
![IMG_4860.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/b7ecde18-fa7a-de35-2677-cca0cfbb2277.jpeg)

**パソコン側 Bluetoothアダプター BSBT5D200シリーズ(BUFFALO)**
![IMG_4858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/3f569aa1-17ee-f6c3-e776-069fcce278f5.png)

パソコン側 Bluetoothアダプタの送受信
![出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/ece7f42b-0b3a-7229-5ac3-e8740f7dcb5c.png)


:::note info
**ATOMのプログラム書き込み（COM7）**
**Bluetoothアダプタ(COM3)**
※COM番号は、環境依存。
:::

# ATOM Lite　bluetooth通信コード
PICマイコンとはちがい、ATOMはマルチタスク、リアルタイムOSが搭載されています。
bluetoothのシリアル受信は、メインループとは別タスクを立ち上げて対応しています。
タスクの生成も、短い定型文で動作させることができます。

:::note info
platformIOの環境設定と使用ライブラリ。
[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
lib_deps = 
	fastled/FastLED@^3.7.0
	m5stack/M5Atom@^0.1.2
	lovyan03/LovyanGFX@^1.1.16
upload_port = COM19*
:::

```CPP:main.cpp
#include <M5Atom.h>
#include "mySerialBT.hpp"
#include "myTask.hpp"

CRGB color[3]={0x000F00,0x00000F,0x000000};

void setup(void)
{
  M5.begin(true,false,true);
  pinMode(22,OUTPUT); //Lチカ用
  //bluetooth初期化開始
  bluetoothBegin();
  SerialBT.println("Start\n");
  //シリアル通信受信タスクスタート
  setUPserialRxTask();
}

int counter;

void loop(void)
{
  //GP22のLEDと、本体LEDの点滅
  digitalWrite(22,HIGH);
  M5.dis.drawpix(0,color[0]);
  SerialBT.printf("cnt=%d\n",counter++);
  delay(500);

  digitalWrite(22,LOW);
  M5.dis.drawpix(0,color[1]);
  SerialBT.printf("cnt=%d\n",counter++);
  delay(500);
}
```

```CPP:mySerialBT.hpp
#ifndef MYSERIALBT_HPP
#define MYSERIALBT_HPP

#include <BluetoothSerial.h>

extern BluetoothSerial SerialBT;    //bluetoothインスタンス
extern void bluetoothBegin(void);  

#endif
```
```CPP:mySerialBT.cpp
#include "mySerialBT.cpp"

/// @brief bluetoothインスタンス
BluetoothSerial SerialBT;

/// @brief bluetooth初期化関数
/// @param address 
void bluetoothBegin(void)
{
    SerialBT.begin("M5 ATOM01",false);
    Serial.println("begin connect");
}

```

```CPP:myTask.hpp
#ifndef MYTASK_HPP
#define MYTASK_HPP

#include <stdint.h>
#include <M5ATOM.h>

#define INTERVAL_TASK 33

extern void setUPserialRxTask(void);
extern void serialRxTask(void *arg);
#endif
```

```CPP:myTask.cpp
#include "myTask.hpp"
#include "mySerialBT.hpp"


/// @brief シリアル通信受信タスク初期化
void setUPserialRxTask()
{
    xTaskCreate(serialRxTask, "serialRxTask", 2048, NULL, 1, NULL);
}

/// @brief シリアル通信受信タスク
/// @param arg 
void serialRxTask(void *arg) 
{
  while (1) 
  {
    if(SerialBT.available()>1)
    {
        String str = SerialBT.readStringUntil('\n');
        uint length = str.length();
        SerialBT.print("echo=> ");
        SerialBT.print(str);
        SerialBT.printf("length=%d\r",length);
        Serial.printf("%s\n",str);
    }
    vTaskDelay(INTERVAL_TASK / portTICK_RATE_MS);
  }
}
```