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