Arduino + EXCEL VBA 직렬 통신 모니터
17913 단어 VBAExcelArduinoArduinoIDE
개요
일로 온도 센서의 정밀도 검증을 실시하고 있어, 그 때에 활용할 수 있을까 생각 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의 오브젝트명을 아래와 같이 변경해 참조하고 있습니다.
shtMainOption 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.vbOption 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
요약
메인 시트 측에서 데이터 포맷을 판단하도록 프로그램을 작성했기 때문에, 이번과는 다른 포맷 데이터의 모니터링이 필요하게 된 경우도 최소한의 수정으로 대응이 가능하게 되었다고 생각합니다.
그래프 데이터는 완성된 데이터를 바탕으로 그래프 툴을 사용하여 작성하는 형태로 잠시 모습을 보고 싶습니다.
Reference
이 문제에 관하여(Arduino + EXCEL VBA 직렬 통신 모니터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/e-katayama/items/d36d0e4b51c63a0dd1c4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래의 사이트에서 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의 오브젝트명을 아래와 같이 변경해 참조하고 있습니다.
shtMainOption 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.vbOption 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
요약
메인 시트 측에서 데이터 포맷을 판단하도록 프로그램을 작성했기 때문에, 이번과는 다른 포맷 데이터의 모니터링이 필요하게 된 경우도 최소한의 수정으로 대응이 가능하게 되었다고 생각합니다.
그래프 데이터는 완성된 데이터를 바탕으로 그래프 툴을 사용하여 작성하는 형태로 잠시 모습을 보고 싶습니다.
Reference
이 문제에 관하여(Arduino + EXCEL VBA 직렬 통신 모니터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/e-katayama/items/d36d0e4b51c63a0dd1c4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
시리얼 통신 정보
시리얼 통신을 하기 위해서 참고로 한 사이트에서 소개되고 있던 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
요약
메인 시트 측에서 데이터 포맷을 판단하도록 프로그램을 작성했기 때문에, 이번과는 다른 포맷 데이터의 모니터링이 필요하게 된 경우도 최소한의 수정으로 대응이 가능하게 되었다고 생각합니다.
그래프 데이터는 완성된 데이터를 바탕으로 그래프 툴을 사용하여 작성하는 형태로 잠시 모습을 보고 싶습니다.
Reference
이 문제에 관하여(Arduino + EXCEL VBA 직렬 통신 모니터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/e-katayama/items/d36d0e4b51c63a0dd1c4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Arduino + EXCEL VBA 직렬 통신 모니터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/e-katayama/items/d36d0e4b51c63a0dd1c4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)