Arduinoの初心者キット購入して温度、湿度など測定は簡単にできシリアルモニターで表示でるようになりました。
せっかく出力できてるのでExcelに取り込みできないかなあと思って探したら有りました。
「EasyComm」
おおシンプル
ec.bas ecDef.bas の2つだけ ExcelのVBAでインポートしてそのまま使える。
これはありがたい。
これがあれば後は定周期でデータ読込むだけです。
Arduinoにサミスタでの温度計とDHT11の温湿度計をつけてテストです。
ちなみにサミスターの方はケーブル伸ばして窓の外に出しているので温度低いです。
B1セルに取り込み周期を設定して[Start]
Excelは OfficeHome & Business2016です。
以下VBAのコードです
'********************************************************
Option Explicit
Const Adr_Start As String = "A3" ’書込み開始位置
Dim Next_time As Variant ’タイマー用
Sub EventStart()
Timer_Event
End Sub
Sub EventStop() ’タイマー停止用 これで止めないと止まらないので
Application.OnTime EarliestTime:=Next_time, Procedure:="Timer_Event", Schedule:=False
End Sub
Sub Timer_Event()
Call USB_DataRead(1) 'EasyComm使ってデータ読込
'タイマーセット
Next_time = Now() + Range("B1").Value '[B1]セルからインターバル時間を読取り
'タイマーで再起呼び出し
Application.OnTime EarliestTime:=Next_time, Procedure:="Timer_Event"
End Sub
'*****************************
'* 'EasyComm使ってデータ読込
'*****************************
Sub USB_DataRead(dummy As String)
Dim I As Long
Dim J As Integer
Dim A As String
Dim B() As String
'タイマーイベントで動かしてるので、データ取得時以外にセルを動かしてしまっても
'定位置に書込むように
I = Range("A1").Value + 1 '書込みカウンタ
Range(Adr_Start).Offset(I, 0).Activate '書込み位置に移動 (値を見たいので)
Range(Adr_Start).Offset(I, 0).Value = I
A = Replace(Rcv1(3), vbLf, "") 'データ受信 改行コードを取り除きます
B = Split(A, ",") '受信データカンマ区切りの分割
For J = LBound(B) To UBound(B) 'セルに書出し
Range(Adr_Start).Offset(I, J + 2).Value = Val(B(J))
Next
Range(Adr_Start).Offset(I, 1).Value = Format(Now, "yyyy/mm/dd hh:mm:ss") '読込んだ現在時間
Range(Adr_Start).Offset(I, 7).Activate 'メモ書き用にセルを移動しておく。
Range("A1").Value = I
End Sub
'**************************************
'取込み本体
'サンプルそのままパクりました
'**************************************
Function Rcv1(PortNum As Integer) As String
Dim RecieveString As String '受信データを格納する文字変数
Dim CountOld As Long '前回の受信データ数
Dim CountNew As Long '今回の受信データ数
ec.COMn = PortNum
ec.Setting = "9600,n,8,1"
ec.HandShaking = ec.HANDSHAKEs.No 'ハンドシェークなし
ec.InBuffer = 10& * 1024& '余裕を持ったバッファサイズを指定します
' ec.Ascii = "START" '"START"という文字列を送信します.
'デリミタは付加していません.
Do
CountOld = ec.InBuffer '受信データ数を読み取ります
DoEvents
Loop While CountOld = 0 '受信開始まで待ちます
'一定時間,受信データ数が変わらなければ受信完了と判断します.
Do
ec.WAITmS = 100 '100mS待ちます
CountNew = ec.InBuffer '受信データ数を取得します
If CountNew = CountOld Then '変化がなければ Loopを抜けます
Exit Do
End If
CountOld = CountNew '前回のデータ数を更新
Loop
' RecieveString = ec.Ascii '文字列を読み込みます.
Rcv1 = ec.Ascii '文字列を読み込みます.
Rcv1 = Replace(Rcv1, vbLf, "")
''''' 受信文字を処理します '''''
ec.COMn = 0 'ポートを閉じます.
End Function