【C#】Arduinoで取得したセンサ値をシリアル通信からCSV出力する

#概要
題名の通りです

やっぱりみんなpythonが好きらしく，C#でやっている人は少なかったので情報共有

今回はArduinoからのセンサ出力をWindowsコンソールアプリケーションを用いてCSVに出力するまでの道のりです

#環境
windows10
Visual Studio 2019
Arduino IDE
Arduino Pro mini
適当な光センサ

#実装
##Arduino IDE側

```c

const int analogInPin = A0; 

int sensorValue = 0;   

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogInPin);

  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\n");
  
  delay(2);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/f6813113-2ce4-a761-facc-dc8bd9a66f45.png)
シリアルモニタ結果はこんな感じ
このウィンドウ名の通り今回のシリアルポートはCM3
ツールタブ押してシリアルポート見ても確認できます
後，bpsは9600であることも覚えておきます

##Visual Studio側
まず今回必要なパッケージを.NETからインストールします
###①System.Text.Encoding.CodePages

csvに出力する際にあのShift-Jisを使います
そして案の定Shift-Jisは適してないと怒られます
Windowsの呪いは恐ろしいです
そして調査したところ，
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
と魔法の言葉を打てば大丈夫らしいです（投げやり）

1.VSのプロジェクトタブからNuGetパッケージの管理を選択

2.参照タブの検索ボックスにSystem.Text.Encoding.CodePagesと入力

3.一番上のやつをインストール，私のはver.4.7.1でした


###②System.IO.Ports
私のSystem.IO.Portsは旧バージョンだったらしくコンパイル時にSerialPort型が名前空間にないと怒られました

最新verの方は必要ないと思いますが私のような症状が出たのであればインストールしてみてください

1.VSのプロジェクトタブからNuGetパッケージの管理を選択

2.参照タブの検索ボックスにSystem.IO.Portsと入力

3.一番上のやつをインストール，私のはver.4.7.0でした


###ソースコード


```cs:ArduinoSerial_DataToCSV.cs
using System;
using System.IO.Ports;
using System.Text;

namespace ArduinoSerial_DataToCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            //キー入力に使用
            var outChar = "";

            //現在時刻
            DateTime dt = DateTime.Now;
            String now_time = dt.ToString();
            now_time = now_time.Replace("/", ".").Replace(" ","_").Replace(":","-");

            String PATH = @"C:/Users/○○/~/"+now_time+"_SensorData.csv";

            //EncodeをShift-Jisに対応
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            //シリアルポート取得
            SerialPort sp = new SerialPort("COM3");

            //csv出力
            var sw = new System.IO.StreamWriter(PATH, false, System.Text.Encoding.GetEncoding("shift_jis"));

            //Arduino側のサンプリング周波数
            sp.BaudRate = 9600;
            sp.Open();

            while (true)
            {
                //センサ値1行分取得
                string data = sp.ReadLine();

                //csv出力
                sw.WriteLine(data);
                Console.WriteLine(data);

                //Q入力でプログラム終了
                if (Console.KeyAvailable)
                {
                    outChar = Console.ReadKey().Key.ToString();
                    if (outChar == "Q")
                    {
                        return;
                    }
                }

            }
        }
    }
}

```
#実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/e5f8ed3c-d2ab-17b6-992b-6aa621455e4b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518001/e52eaacb-49f6-7fd2-5308-365d445c19fe.png)

1行目がうまくいかない不具合があるけどよくわからずじまい
疲れたので修正するならまた今度

#参考資料
Arduino日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/index.php

.NET CoreでShift-JISを取り扱う方法
https://blog.hitsujin.jp/entry/2019/01/27/200055