以前の記事でEXCELのマクロ機能VBAを使ってUSB接続したPCとArduino間で通信してデーターをEXCELシートに取り込む方法を記載しました。

 ESP-32(ESP32-DevKitC)は無線でPCと通信することができるので、取得したデーターをワイヤレスでEXCELに取り込む方法を調べてみました。

 環境はWindows10 Home + EXCEL 2016 32bit です

WiFi経由での通信方法

ESP-32(ESP32-DevKitC)の準備

 ESP32の開発環境が整ったArduino IDEを使います。開発環境の構築はこちらで書きました。

スケッチ

 ESP-32(ESP32-DevKitC)にWiFi経由で”test?”と送ると”ESP32-DevKitC”と返すスケッチを記述します。

 WiFiのサンプルスケッチを改造して作成しました。
 3行目”yourssid”をアクセスポイントのSSIDに、4行目 “yourpasswd” を実際のパスワードに書き換えます。

#include <WiFi.h>

const char* ssid     = "yourssid";
const char* password = "yourpasswd";

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    delay(10);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();
}

void loop(){
 WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client.");
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
           if (currentLine == "test?"){
            client.println("ESP32-DevKitC");
            client.println();
            break;
           } else {
            currentLine == "";
           }
          } else if (c != '\r') {
          currentLine += c;
          }
        }  
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

IPアドレスの確認

 シリアルモニタを起動した状態でスケッチを書きこみIPアドレスをメモしておきます。

IO Libraries Suiteの設定

 Windows PC側の通信にはキーサイト・テクノロジーが無償公開している測定機器(例えばオシロスコープ等)の制御ライブラリKeysight IO Libraries Suiteを用いました。

 ネットを調べるとこういった通信にはWinSockを使う方法が見つかりますが、20年以上前の化石のようなツールで今更使う理由はありません。

Keysight IO Libraries Suiteの導入

 EXCELのVBAで通信するためのライブラリであるIO Libraries Suiteのについては以前の記事で書きましたのでそちらを見てください。

Connection Expertの起動

 常駐しているならばタスクバーのIOコントロールアイコン  からConnection Expertを起動します。 初めての起動時にWelcome動画が出ますが、”Show welcome at startup.”のチェックを外して閉じてしまいます。

 常駐を外しているならWindows スタートメニューからKeysight Connection Expertを起動してください。

接続の設定

 Connection Expertの画面、左側から”LAN”をクリックして選択します。
 次に”Instrument”のボタンをクリックします。

 ”Add a LAN device”のウィンドウが開くので”Enter Address”のタブを選択してクリックします。

  • ① ”Set LAN Address:”の”Hostname or IP Address”の項にESP32のIPアドレスを入力します。ESP32にスケッチを書きこむときにシリアルモニタを起動させておくと表示される値です。
  • ② 次いで”Set Protocol:”の”Socket”にチェックを入れます。
  • ③ そして”Port Number:”の項にポート番号を入力します。スケッチの6行目”WiFiServer server(80);”の数字がポート番号になります。
  • ④ 次に”Verify Connection:”の”Allow *IDN Query”のチェックを外します。
  • ⑤ 最後に”OK”をクリックします。

 Connection Expertの画面左のLAN(TCPIP0)に”Unknown”
機器が追加されています。赤い×印が付いていますが気にしません。

通信の確認

 Connection Expertの画面から『Interactive IO 』をクリックして開きます。

 コマンドに”test?”と入力して『Send & Read』をクリックすると”ESP32-DevKitC”と表示されて通信を確認できました。

 Interactive IOの画面は一度通信するといったん閉じて、開きなおさないと次の通信ができないようです。

 設定が終わればConnection Expertは閉じておきます。

EXCEL VBA

準備

 ”EXCEL開発タブの表示”から”参照設定”までこちらを参考に行います。

コードの記述

 VBAエディタにコードを記述します。記述の仕方はキーサイトのHPに記載されています。

Sub ボタン1_Click()
    'VISA COMオブジェクトを作成し接続を設定
    Dim rm As New VisaComLib.ResourceManager
    Dim ESP As New VisaComLib.FormattedIO488
    Set ESP.IO = rm.Open("TCPIP0::192.168.000.000::80::SOCKET")
 
    '終端文字を識別し読み込みを終了させる
    ESP.IO.TerminationCharacter = 10
    ESP.IO.TerminationCharacterEnabled = True
    
    'ESP32に"test?"を送り、応答をA1セルに入力する
    ESP.WriteString "test?"
    Range("A1") = ESP.ReadString()

    '接続をCloseし、オブジェクトを解放する
    ESP.IO.Close
    Set ESP = Nothing
    Set rm = Nothing
End Sub

 5行目の”TCPIP0::192.168.000.000::80::SOCKET”はVISA アドレスでKeysight Connection Expert で確認します。

 8,9行目はLAN接続の機器をソケットプロトコルで接続するときに記述し、終端文字で読み込みを終了させる設定にします。記述が無ければ読み込みが終了せずタイムアウトエラーとなります。

 EXCELのシートに戻ると、『ボタン』ができています。この『ボタン』をクリックするとA1セルに”ESP32-DevKitC”と入力されます。

ブックの保存

 マクロを含むEXCELブックは標準の” *.xlsx ” では保存できません。EXCEL マクロ有効ブック” *.xlsm ” で保存します。

広告

WiFi経由での温湿度データの取得

 温湿度センサーのデータをWiFiで送るようにしました。

配線

 温湿度センサーはDHT11 温湿度センサーを基板に取り付けモジュール化されたものを用いました。配線は簡単で+3.3V,GND,データ線をメス-メスのジャンプワイヤーでESP32-DevKitCにつなぐだけです。

ESP32-DevKitCDHT11
GNDGND
3.3VVcc
GPIO4DATA

ライブラリ

 DHT11 温湿度センサーを使うにはDHT sensor libraryAdafruit Unified Sensorというライブラリが必要です。

  • Arduino IDEを起動し、『ツール』⇒『ライブラリを管理(Ctrl+Shift+I)』でライブラリマネージャーを開きます。
  • 検索ウィンドウに”DHT”と入力し、出てきた候補の中から”DHT sensor library by Adafruit”を探します。ここにマウスポインタを当てると[インストール]のボタンが出ますのでクリックしてインストールします。暫くするとインストールが完了しますので[閉じる]ボタンを押します。
  • 続いて検索ウィンドウに”Adafruit Unified Sensor”と入力し、出てきた候補の中から”Adafruit Unified Sensor by Adafruit”を探します。ここにマウスポインタを当てると[インストール]のボタンが出ますのでクリックしてインストールします。暫くするとインストールが完了しますので[閉じる]ボタンを押します。

  これでライブラリの導入が完了しました。

スケッチ

 スケッチは次のようにしました。 シリアル通信で ”MEAS” を受信すると、温湿度を測定し、カンマで区切った湿度と温度のデータをWiFi経由で返します。
  7行目”yourssid”をアクセスポイントのSSIDに、8行目 “yourpasswd” を実際のパスワードに書き換えます。

#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
#include <WiFi.h>

DHT dht(DHTPIN, DHTTYPE);
const char* ssid     = "yourssid";
const char* password = "yourpassword";

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    delay(10);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    dht.begin();
    server.begin();
}

void loop(){
 WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client.");
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
           if (currentLine == "MEAS"){
            float h = dht.readHumidity();
            float t = dht.readTemperature();
            if (isnan(h))  h = -999;
            if (isnan(t)) t = -999;
            client.print(h);
            client.print(",");
            client.println(t);
            break;
           } else {
            currentLine == "";
           }
          } else if (c != '\r') {
          currentLine += c;
          }
        }  
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

VBAプログラム

 VBAのプログラムは以前の記事で書いたUSB経由で温度・湿度を取得するプログラムとほぼ同じですので作り方はそちらを見てください。変更点はVISAアドレスを変え(27行目)、データを一度読み込む度に接続を閉じて再度接続するようにしました(27,44行目)。また終端文字を認識して読み込みを終了するコードを加えました(29,30行目)。あと、変数名を少し変えています。

Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '32bit版EXCEL
'Private Declare PtrSafe Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '64bit版EXCEL
Public StopMeas As Boolean

Sub GetTemperatureHumidity()
    ' VISA COMオブジェクトを作成し接続を設定
    Dim RM As New VisaComLib.ResourceManager
    Dim ESP As New VisaComLib.FormattedIO488
    ' 変数の宣言
    Dim HumTempData As Variant, GetSerial As String
    Dim i As Long, j As Long: i = 0
    Dim StartTime As Date: StartTime = Int(Now() * 1440) / 1440     ' 開始時刻を秒以下切り捨てて取得
    StopMeas = False
    
    Worksheets("Sheet1").Range(Cells(2, 1), Cells(Rows.Count, 3)).Clear
   
    UserForm1.Show vbModeless ' ユーザーフォームをモードレスで表示

    Do
        ' 毎分0秒になるまで待機させる。
        For j = 1 To 60
            DoEvents ' 入力を受け付けれるようにする
            Application.Wait StartTime + (i + j / 60) / 1440
            If StopMeas = True Then Exit Do ' ユーザーフォームの"STOP"がクリックされるとループを抜ける
        Next j
        
        Set ESP.IO = RM.Open("TCPIP0::192.168.0.8::80::SOCKET") ' ESP32と接続 VISAアドレス"TCPIP0::192.168.000.000::80::SOCKET"はConnection Expert で確認
        '終端文字を識別し読み込みを終了させる
        ESP.IO.TerminationCharacter = 10
        ESP.IO.TerminationCharacterEnabled = True

        ' ESP32に"MEAS"コードを送り、応答データから改行コードを削除して、","で分割する
        ESP.WriteString "MEAS"
        GetSerial = Replace(ESP.ReadString(), vbCrLf, "")
        HumTempData = Split(GetSerial, ",")
        
        ' セルに時刻、温度、湿度を入力
        Cells(i + 2, 1) = Format(Now(), "yyyy/mm/dd hh:mm:ss")
        Cells(i + 2, 2) = HumTempData(1)
        Cells(i + 2, 3) = HumTempData(0)

        i = i + 1
        '接続を閉じる
        ESP.IO.Close
    Loop
    
    ' オブジェクトを解放する
    Unload UserForm1
    Set ESP = Nothing
    Set RM = Nothing
End Sub

 作成が終わってワークシートの『ボタン』をクリックすると一分毎に温度と湿度のデータをセルに入力してくれます。『STOP』ボタンを押すと測定が終了します。モバイルバッテリーで動かしながらでもデータが取れました。

 これでWiFi電波の届く範囲内であればどこからでも温度・湿度のデータを取得できるようになりました。

広告

Bluetooth経由での温湿度データの取得

 Bluetooth経由でもEXCELに温湿度データを取れるかやってみました。

配線

 配線はWiFiで温湿度データを取得したときと同じです。

スケッチ

 ESP-32(ESP32-DevKitC)にBluetooth経由で”MEAS”と送ると”温度,湿度”を返すスケッチを記述します。

 Bluetoothのサンプルスケッチを改造して作成しました。

#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

DHT dht(DHTPIN, DHTTYPE);
BluetoothSerial SerialBT;
String command;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
  dht.begin();
}

void loop() {
  if (SerialBT.available()) {
    // Serial.write(SerialBT.read());
    command = SerialBT.readStringUntil(0x0a);
    if(command == "MEAS"){
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      if (isnan(h))  h = -999;
      if (isnan(t)) t = -999;
      SerialBT.print(h);
      SerialBT.print(",");
      SerialBT.println(t);
    }
  }
  delay(20);
}

 スケッチをESP32-DevKitCに書き込み、Bluetoothのペアリングを行います。ペアリング方法はこちらに書きました。

COMポートの確認

 Bluetooth serialのCOMポート番号を確認しておきます。

 Windowsの”設定”の『デバイス』⇒『Bluetoothとその他のデバイス』の画面の下の方”その他のBluetoothオプション”をクリックして開きます

 ”Bluetooth 設定”の画面が開きますので、”COM ポート”のタブを開きます。Bluetooth接続のCOMポートの一覧が出ますので、[方向]が”発信”で[名前]が”スケッチで設定したデバイス名 +’ESP32SPP’ “(記事の例だと”ESP32test’ESP32SPP’ ”)であるCOMポートの番号をメモしておきます。

IO Libraries Suite

設定

 Connection Expertを起動します。

 Connection Expertの画面、左側のメニューのCOM(ASRL〇)[*〇はCOMポートの番号]を選択します。
 続いて右上の『Instrument』をクリックすると”Add an RS-232 serial instrument ”のウィンドウが開きます。


 ”Specify Connection Addresses:”の項の”VISA Interface ID:”、”SICL Interface ID:” の番号がCOMポートの番号であることを確認します。
 ”Configure Serial Properties:”の項の”Baud Rate:”を”115200”にします。
 ”Auto-Identify This Instrument” のチェックを外し、”Test This VISA Address” をクリックします。 ”Verified” と表示されたら”OK” をクリックします。 その他の設定はデフォルトで良いと思います。

 設定が完了すると”Unknown”の機器が表示されます。

通信の確認

 Connection Expertの画面から『Interactive IO 』をクリックして開きます。 コマンドに”MEAS”と入力して『Send & Read』をクリックすると温度と湿度が表示されて通信を確認できました。

VBAプログラム

 VBAのプログラムは以前の記事で書いたUSB経由で温度・湿度を取得するプログラムとほぼ同じですので作り方はそちらを見てください。変更点はVISAアドレスを変え(18行目)、変数名を少し変えました。19行目接続待機は必要なさそうなのでコメントアウトしました。

Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '32bit版EXCEL
'Private Declare PtrSafe Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) '64bit版EXCEL
Public StopMeas As Boolean

Sub GetTemperatureHumidityBT()
    ' VISA COMオブジェクトを作成し接続を設定
    Dim RM As New VisaComLib.ResourceManager
    Dim ESP As New VisaComLib.FormattedIO488
    ' 変数の宣言
    Dim HumTempData As Variant, GetSerial As String
    Dim i As Long, j As Long: i = 0
    Dim StartTime As Date: StartTime = Int(Now() * 1440) / 1440     ' 開始時刻を秒以下切り捨てて取得
    StopMeas = False
    
    Worksheets("Sheet1").Range(Cells(2, 1), Cells(Rows.Count, 3)).Clear
    
    
    Set ESP.IO = RM.Open("ASRL5::INSTR") ' Arduinoと接続 VISAアドレス"ASRL5::INSTR"はConnection Expert で確認
    'Sleep (3000) ' ESP32の準備が整うまで待機

    UserForm1.Show vbModeless ' ユーザーフォームをモードレスで表示

    Do
        ' 毎分0秒になるまで待機させる。
        For j = 1 To 60
            DoEvents ' 入力を受け付けれるようにする
            Application.Wait StartTime + (i + j / 60) / 1440
            If StopMeas = True Then Exit Do ' ユーザーフォームの"STOP"がクリックされるとループを抜ける
        Next j
        
        ' ESP32に"MEAS"コードを送り、応答データから改行コードを削除して、","で分割する
        ESP.WriteString "MEAS"
        GetSerial = Replace(ESP.ReadString(), vbCrLf, "")
        HumTempData = Split(GetSerial, ",")
        
        ' セルに時刻、温度、湿度を入力
        Cells(i + 2, 1) = Format(Now(), "yyyy/mm/dd hh:mm:ss")
        Cells(i + 2, 2) = HumTempData(1)
        Cells(i + 2, 3) = HumTempData(0)

        i = i + 1
    Loop
    
    ' 接続をCloseし、オブジェクトを解放する
    Unload UserForm1
    ESP.IO.Close
    Set ESP = Nothing
    Set RM = Nothing
End Sub

 作成が終わってワークシートの『ボタン』をクリックすると一分毎に温度と湿度のデータをセルに入力してくれます。『STOP』ボタンを押すと測定が終了します。モバイルバッテリーで動かしながらでもデータが取れました。

 これでBluetoothの電波の届く範囲内であればどこからでも温度・湿度のデータを取得できるようになりました。

広告
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 DHT11 温度&湿度センサーモジュール
価格:1064円(税込、送料別) (2021/2/3時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Arduino互換 37-in-1 センサーモジュールキットセット
価格:5904円(税込、送料別) (2021/2/3時点)