.NET nanoFrameworkでマイコンプログラミング（温度センサー SHT30)

[前回](https://qiita.com/linyixian/items/fb8d54439761fecf28c4) .NET nanoFrameworkでの開発環境を構築しました。
今回はデバイスに温湿度センサーを接続してみます。

#使用するハードウェア
・M5ATOM Matrix
・Unit EnvIII

#使用するソフトウェア
・Visual Studio 2019
・ファームウェア ESP32_PICO 1.7.3-preview.124

#プログラム
・VisualStudioを起動して、新しいプロジェクトの作成をクリックします。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/52004771-1538-9180-8dc1-35036fe61309.png)

・Blank Application (nanoFramework)を選択し、次へをクリックします。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/36eb2baf-b953-3937-fb54-3decb88d838a.png)

・プロジェクト名（任意）を入力し、作成をクリックします。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/9acaf4cb-4b69-2f0d-388d-1290088f5b17.png)

・初めにプログラム内で使用するパッケージ（Arduinoではライブラリです）をインストールします。ツール > Nugetパッケージマネージャー > ソリューションのNugetパッケージの管理をクリックします。
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/fcbf1f8e-bce4-0b72-ce65-141b02987355.png)

・検索BOXにESP32と入力すると下部リストに nanoFramework.Hardware.Esp32が表示されるのでクリックします。右側のプロジェクト名にチェックを入れてインストールをクリックします。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/2151532a-a9e0-448b-2af4-af83336d8359.png)

・パッケージの依存関係がチェックされて追加パッケージが表示されます。そのままOKをクリックします。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/3bfc79dc-959d-f86e-5fe3-f441518013fc.png)

・再びパッケージ参照画面の検索ボックスにsht3と入力すると、リストに nanoFramework.Iot.Device.Sht3xと表示されるのでクリックします。先ほどと同じようにプロジェクト名にチェックを入れてインストールをクリックします。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/1e3c6feb-d622-61a7-cc96-1972ba3d991c.png)

・依存関係のチェックが行われます。OKをクリックしてインストールを完了します。
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/b7ae408d-7cd1-9438-3739-70c6c8a1e935.png)

・次にプログラムを書いていきます。Program.csを選択します。
![09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/a6d90107-61d3-538f-7f89-98e43f488f31.png)

・4行目より後に次の3行を追加します。

```
using nanoFramework.Hardware.Esp32;
using System.Device.I2c;
using Iot.Device.Sht3x;
```

・メインプロシージャ内に最初からあるコードを削除します。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/6b98509d-15c6-8401-bdda-0db7ab998aa5.png)

・メインプロシージャ内に次のコードを追加します。

```
//I2Cで使うPinを設定
Configuration.SetPinFunction(26, DeviceFunction.I2C1_DATA);
Configuration.SetPinFunction(32, DeviceFunction.I2C1_CLOCK);

//センサーのアドレスを設定
I2cConnectionSettings settings = new I2cConnectionSettings(1, 0x44);

//センサーオブジェクトの作成
using I2cDevice device = I2cDevice.Create(settings);
using Sht3x sensor = new(device);

while (true)
    {
        //センサーデータの取得
        double tmp = sensor.Temperature.DegreesCelsius;
        double hum = sensor.Humidity.Percent;

        //デバッグウィンドウに出力
        Debug.Write("tmp : ");
        Debug.WriteLine(tmp.ToString("F2"));
        Debug.Write("hum : ");
        Debug.WriteLine(hum.ToString("F2"));
        Debug.WriteLine(" ");

        Thread.Sleep(10000);
    }
```

・入力ができたらプログラムを実行してみましょう。画面上部の ▶.NET nanoFramework Device をクリックします。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/3fd27f62-6628-66d1-e01d-18815ce78104.png)

・もし配置エラーになるようでしたら一度PCからデバイスを外し、Device Explorerを表示してから デバイスをもう一度接続してください。自動的にデバイスが認識されます。その後実行をしてみましょう。

・エラーが出なければ出力ウィンドウに温度と湿度が10秒ごとに表示されます。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/c47864d1-7694-8475-7b17-4f902f10b41d.png)

以上でプログラムは完成です。

今回は温度センサーを使ってみましたが、既に .NET nanoFramework 向けに各種センサーのパッケージが用意されています。メジャーなセンサー類は大体そろっています。
興味のある方は[こちら](https://github.com/nanoframework/nanoFramework.IoT.Device)を参照してみてください。サンプルプログラムも含まれているのでぜひ参考にしてください。

最後に今回のコード全体を載せておきます。

```Program.cs
using System;
using System.Diagnostics;
using System.Threading;

//新たに追加
using nanoFramework.Hardware.Esp32; //デバイス
using System.Device.I2c;            //I2C
using Iot.Device.Sht3x;             //センサー
//

namespace NF_SHT30
{
    public class Program
    {
        public static void Main()
        {
            //I2Cで使うPinを設定
            Configuration.SetPinFunction(26, DeviceFunction.I2C1_DATA);                 //SDAはGPIO26に割り当て
            Configuration.SetPinFunction(32, DeviceFunction.I2C1_CLOCK);                //SCLはGPIO32に割り当て

            //センサーのアドレスを設定
            I2cConnectionSettings settings = new I2cConnectionSettings(1, 0x44);        //SHT30のアドレスは0x44、I2Cポートは１

            //センサーオブジェクトの作成
            using I2cDevice device = I2cDevice.Create(settings);
            using Sht3x sensor = new(device);

            while (true)
            {
                //センサーデータの取得
                double tmp = sensor.Temperature.DegreesCelsius;                         //温度を摂氏で取得
                double hum = sensor.Humidity.Percent;                                   //湿度をパーセントで取得

                //デバッグウィンドウに出力
                Debug.Write("tmp : ");
                Debug.WriteLine(tmp.ToString("F2"));
                Debug.Write("hum : ");
                Debug.WriteLine(hum.ToString("F2"));
                Debug.WriteLine(" ");

                Thread.Sleep(10000);                                                    //10秒待機

            }
        }
    }
}
```