Arduino + EXCEL VBA 직렬 통신 모니터

개요



일로 온도 센서의 정밀도 검증을 실시하고 있어, 그 때에 활용할 수 있을까 생각 EXCEL VBA로 실시하는 시리얼 통신 모니터를 작성했습니다.

지금까지는 기록용의 자료를 작성해, ArduinoIDE의 툴의 「시리얼 모니터」로 표시된 온도를 전기, 계기로 실측한 값을 입력해 정밀도의 확인의 자료로서 왔습니다.

또 ArduinoIDE의 툴 「시리얼 플로터」로 그래프를 보고 추이를 확인하고 있었습니다. 하지만 이 그래프에서는 세세한 수치를 확인할 수 없어 곤란했습니다.

거기서 어떻게든 할 수 없는가와 모니터링의 방법을 조사했습니다. 몇 가지 방법이 있었습니다만, 시리얼 데이터를 EXCEL로 출력하는 방법을 준비해 두면 향후, 다른 데이터의 모니터링이 필요하게 되었을 경우에도 응용이 유리하지 않을까라고 이 방법을 채용했습니다 .

이번에는 5분 간격으로 계측한 온도가 EXCEL에 출력되도록 했습니다. 또 출력 시트에 실측한 값을 계측 중에도 입력할 수 있도록 생각 작성했습니다.

참고로 한 사이트



아래의 사이트에서 Arduino + EXCEL VBA에 대해서는 쓰여져 있었으므로, 참고로 했습니다.
htps : // bgs. 야호오. 이. jp/노비타_rx7/28090650. HTML

Arduino 측 설정



정밀도 검증을 실시하고 싶은 센서의 값을 콤마 단락으로 취득시키고 있습니다.

사용하는 센서:
atlas-scientific RTD Temperature
방수형 온도 센서 DS18B20

검색할 직렬 데이터 형식
온도 1(atlas의 온도 데이터), 온도 2(DS18B20의 온도 데이터)

 28.021,28.22

EXCEL VBA 직렬 통신 모니터



시리얼 통신 정보
시리얼 통신을 하기 위해서 참고로 한 사이트에서 소개되고 있던 EasycCmm 의 모듈을 사용합니다.

명세:
메인 시트에서 포트 번호를 지정 가능.
시작 버튼을 누르면 모니터링이 시작됩니다.
모니터링이 시작되면 템플릿 시트를 기반으로 새 통합 문서가 만들어지고 모니터링 된 값이 출력됩니다.
모니터링 중에도 데이터 시트를 편집 가능 (실측치 입력 등을 평행하게 할 수 있도록 한다)
종료 버튼을 누르면 모니터링이 종료됩니다.

EXCEL VBA 코드



메인 시트 프로그램:
시작 버튼, 정지 버튼이 있고 포트 번호를 설정할 수 있는 메인 시트입니다.


※프로그램 안에서 사용되고 있는 shtMain.Range("포트 번호")는 「이름의 관리」로 정의되고 있는 셀로부터 참조하고 있습니다.
※Worksheet의 오브젝트명을 아래와 같이 변경해 참조하고 있습니다.


shtMain
Option Explicit

Enum E_COL
    C_時刻 = 1
    C_AtlasRTDCircuit
    C_DS18B20
End Enum

Private WithEvents m_monitoring As clsMonitoring

'-------------------------------
' モニタリングを開始します
'-------------------------------
Sub MonitoringStart()
    Dim bk As Workbook
    Dim sht As Worksheet
    Dim r As Long

    Set m_monitoring = New clsMonitoring

    'テンプレートシートを元に新しいブックを作成
    shtTemp.Copy

    Set bk = ActiveWorkbook
    Set sht = bk.Sheets(1)

    'カーソルを初期位置に設定
    r = 3
    sht.Cells(r, C_時刻).Select
    ActiveCell.Offset(0, 0).Activate

    '5分間隔でモニタリング開始
    Call m_monitoring.MonitoringStart(CInt(shtMain.Range("ポート番号")), 5, sht, r)
End Sub

'-------------------------------
' モニタリングを終了します
'-------------------------------
Sub MonitoringEnd()
    If m_monitoring Is Nothing Then
        Exit Sub
    End If

    Call m_monitoring.MonitoringEnd

    Set m_monitoring = Nothing

    MsgBox "モニタリングを停止しました。"
End Sub

'-------------------------------
' モニタリングイベント:モニタリング結果をシートに反映
'-------------------------------
Private Sub m_monitoring_DisplaySerialData(sht As Worksheet, r As Long, value As String)
    Dim vals As Variant

    vals = Split(value, ",")

    sht.Cells(r, C_時刻) = Format(Now(), "yyyy/mm/dd hh:mm:ss")
    sht.Cells(r, C_AtlasRTDCircuit) = vals(0)
    sht.Cells(r, C_DS18B20) = vals(1)
End Sub

템플릿 시트:


모니터링 클래스:
  모니터링의 시작, 종료를 실시합니다.
  시리얼 데이터 기입시에 출력 이벤트를 발생시키고 있습니다.

clsMonitoring.vb
Option Explicit

' 取得したシリアルデータを表示するイベント
Public Event DisplaySerialData(sht As Worksheet, r As Long, value As String)

' モニタリング終了フラグ
Private m_endFlg As Boolean

'-------------------------------
' モニタリングを開始します
'
' ※spanMinute: 10 の場合は(10:10,10:20,10:30~)という10分ごとの区切りで実行されます。
'-------------------------------
Function MonitoringStart(portNo As Integer, spanMinute As Integer, sht As Worksheet, stRow As Long)
    ec.COMn = portNo 'COM3を指定します
    ec.Setting = "9600,n,8,2" '通信条件(ボーレート,パリティビット数,データビット数,ストップビット数)の設定
    ec.HandShaking = ec.HANDSHAKEs.RTSCTS '通信ハンドシェークの設定
    ec.Delimiter = ec.DELIMs.CrLf 'データの区切りを示す文字列を設定します
    ec.OutBuffer = 100& * 1024& '現在処理の対象になっているポートの送信バッファを100kBに設定します

    Dim value As String
    Dim r As Long
    Dim nextTime As Date

    r = stRow
    Do While Not m_endFlg
        ' 指定分ごとに実行
        nextTime = GetNextTimeMinute(spanMinute)

        ' 指定分たつまでの間、EXCELが編集できないのは困るので、DoEventでイベントを処理しながら待機
        Do While nextTime > Now()
            DoEvents
            Sleep (100)
            If m_endFlg Then
                Exit Do
            End If

            value = Replace(ec.AsciiLine, vbCr, "")
            ec.InBufferClear '受信バッファをクリア
        Loop

        ' 時間が経過した場合、取得したシリアルデータを表示
        RaiseEvent DisplaySerialData(sht, r, value)

        r = r + 1

        DoEvents
    Loop

    'ポートを閉じる
    ec.COMn = -1 '終了処理

End Function

'-------------------------------
' モニタリングを終了します
'-------------------------------
Function MonitoringEnd()
    m_endFlg = True
End Function

'-------------------------------
' 次の計測時間を取得します
'-------------------------------
Function GetNextTimeMinute(mi As Integer) As Variant
    Dim t As Date
    Dim ms As String
    Dim m As Integer

    t = Now()
    m = Mid(Format(t, "HH:MM:SS"), 4, 2)
    m = m - m Mod mi + mi

    ms = "00:" & Right(Format(t, "HH:MM:SS"), 5)


    GetNextTimeMinute = t - TimeValue(ms) + TimeValue(WorksheetFunction.RoundDown(m / 60, 0) & ":" & m Mod 60 & ":00")
End Function


요약



메인 시트 측에서 데이터 포맷을 판단하도록 프로그램을 작성했기 때문에, 이번과는 다른 포맷 데이터의 모니터링이 필요하게 된 경우도 최소한의 수정으로 대응이 가능하게 되었다고 생각합니다.
그래프 데이터는 완성된 데이터를 바탕으로 그래프 툴을 사용하여 작성하는 형태로 잠시 모습을 보고 싶습니다.

좋은 웹페이지 즐겨찾기