Arduinoの出力値をExcelに取り込む その2

 

Comポート開けっ放しで読込むバージョン Comポートつかみっぱなしなので、途中でArduino IDEでの書込みや、シリアルポートモニターは使えません。

VBAの方はイベント使わないのでシンプルになりました。

 

あとはBlutoothで飛ばしたいなあ。受信側のアプリどうすればいいのかなあ

 

サミスターは室外にケーブル伸ばしておいているのですが、こんなに温度差有ったのかとびっくり

今の時期 昼は暖かいけど夜はグーっと冷えてくるんだね

 

 

 

画面構成などはその1と全く同じです

 

 

Excel本体はこちら EasyComも入り

 

 

***Sheet Macro*****************************************************

Option Explicit
Private Sub cb_Start_Click()
    Call RcvData
End Sub
 

Private Sub cb_Stop_Click()
    StopFlag = True
End Sub
 

'***Module1*****************************************

Public StopFlag As Boolean   'Loopを終了させるためのボタン用

Const Adr_Start As String = "A3"  '書込み開始セル
Const Adr_Cnt As String = "A1"  'カウンター書込み位置

Sub RcvData()
    Dim Rcv As String
    Dim CountOld As Long        '前回の受信データ数
    Dim CountNew As Long        '今回の受信データ数
    Dim I             As Long
    Dim J              As Long
    Dim wTime       As Date
    Dim ChkTime     As Date
    Dim B()             As String
    
    
    wTime = Range("B1").Value    '待ち時間

    ec.COMn = 3          'Arduino接続PortNum 'ポートが違う場合はここ修正
    ec.Setting = "9600,n,8,1"  
    StopFlag = False
    I = Range("A1").Value + 1
 Range(Adr_Start).Offset(I, 0).Activate      

 

  Do
            If StopFlag = True Then
                If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbYes Then
                    Exit Do
                Else
                    StopFlag = False
                End If
            End If
    
            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
            
            
            ''''' 受信文字を処理します '''''
            Rcv = ec.Ascii    '文字列を読み込みます.
            Rcv = Replace(Rcv, vbLf, "")
            
           '''''' 待ち時間になるまで パス

            If Now > ChkTime + wTime Then
                B = Split(Rcv, ",")
                For J = LBound(B) To UBound(B)
                    Range(Adr_Start).Offset(I, J + 2).Value = Val(B(J))
                Next
                
                With Range(Adr_Start)
                    .Offset(I, 0).Value = I
                    .Offset(I, 1).Value = Now
                    .Offset(I, 1).Value = Format(Now, "yyyy/mm/dd hh:mm:ss")
    
                End With
                Range(Adr_Cnt).Value = I
                
                I = I + 1
                ChkTime = Now

       ActiveWindow.SmallScroll Up:=-1, ToLeft:=-0
            End If
        
        Loop
    ec.COMn = 0                 'ポートを閉じます.

End Sub

 

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
 

 

Arduinoの初心者キット購入して遊び始めました。C言語もほぼ初心者ですが、Arduino用のIDE専用で、サンプルソフトがあるので比較的簡単に使えました。
LED点滅からキット順番に、温度計、温湿度計、アナログ入力、シフトレジスタ、LCD表示
サーボモーター、ステッピングモーター、超音波距離計、赤外線リモコンetc
盛りだくさん。
世の中の技術ってこんな簡単になったんだね。
学研のエレキット時代と比べたら格段の進歩。
値段も圧倒的に安くなって。
実際に単体で使えるものを作ろうかなあと部品の値段調べたら、Auruinoも互換品だと何と¥600程度。一番高くつきそうなのは表示部分とケースなんですね。
 

 

EXCELでCSVファイル開くと、IDなど文字として認識させたいものが、

親切に数字で認識されて「0123」が「123」となってしまうので、簡単なマクロで対応のメモ

AIに食わせるデータ整理用にちょっと必要だったので

 

'*****************************************************
' 名称:Read_CSVFile
' 概要:CSVファイルの読み込み
'
'*****************************************************
Sub Read_CSVFile(dummy As String)
    Dim FolName As String
    Dim RfName  As String
    Dim A       As String
    Dim I As Long, J As Long, K As Long
    Dim Dat
    Dim Cfix    As Long
    Dim Rfix    As Long
    Dim DSrow   As Long     '読込開始行
    
    Range(Adr_Msg).Clear    'メッセージエリアクリアー
    
    With ActiveWindow       '行列固定位置読込
        Cfix = .SplitRow
        Rfix = .SplitColumn
    End With
    
    With ActiveWindow
        .SplitRow = 0
        .SplitColumn = 0
    End With
    
    DSrow = Range(Adr_DSrow).Value  'データ開始行   この行からセル分割
    
    
    Range(Adr_Msg).Clear    'メッセージエリアクリアー
    
    'file名読込
    FolName = Range(Adr_Folder).Value
    RfName = Range(Adr_Rfile).Value
    RfName = FolName & "\" & RfName & ".csv"

'    On Error GoTo ErrTr1
    If Dir(RfName) = "" Then
        MsgBox ("残念でした ファイルが有りません" & vbLf & RfName)
        Range(Adr_Msg).Value = Now() & " エラー:ファイルが有りません " & RfName
        Range(Adr_Rfile).Activate
        End
    End If
    
    Open RfName For Input As #1
    
    '画面クリアー
    ActiveWindow.FreezePanes = False
    Range(Adr_Start).Resize(5000, 1).EntireRow.Delete
    
    
    Range(Adr_Start).Activate
    
    'データ読込み
    While Not EOF(1)
        Line Input #1, A
        Range(Adr_Msg).Value = A
        
        If I >= DSrow - 1 And InStr(A, ",") > 0 Then
            If InStr(A, """") = 0 Then
                Dat = Split(A, ",")
                ActiveCell.Offset(I, 0).Resize(1, UBound(Dat) + 1).Value = Dat
            Else
                Dat = Split2(A)
                ActiveCell.Offset(I, 0).Resize(1, UBound(Dat) + 1).Value = Dat
            End If
        Else
            ActiveCell.Offset(I, 0).Value = A   '項目開始行まではそのまま記入
        End If
       
       I = I + 1

    Wend
    Close

    Cells(Cfix + 1, Rfix + 1).Activate
    ActiveWindow.FreezePanes = True
 

    Range(Adr_Msg).Value = "読込:" & Now & "   File日付:" & FileDateTime(RfName)
end sub

 

'*************************************************

' 名称: Split2
' 概要:ダブルクオーテーションを含むCSV行の分割

'

'*************************************************

Function Split2(A As String) As Variant
    Dim I As Long, J As Long, Cnt As Long, P As Long
    Dim B As String
    Dim BufStr As String
    Dim ScCnt   As Long    '
    Dim sA(1025) As String
    Dim aSP()   As String
    
    Split2 = ""
    For I = 1 To Len(A)
        B = Mid(A, I, 1)
        Select Case B
            Case ","
                sA(Cnt) = BufStr
                Cnt = Cnt + 1
                BufStr = ""
                
            Case """"
                P = InStr(I + 1, A, """")
                BufStr = Mid(A, I + 1, P - I - 1)
                sA(Cnt) = BufStr
                BufStr = ""
                Cnt = Cnt + 1
                I = P + 1
            Case Else
                BufStr = BufStr & B
        
        End Select
    Next
    sA(Cnt) = BufStr
    
    ReDim aSP(Cnt)
    For I = 0 To Cnt
        aSP(I) = sA(I)
    Next   
    Split2 = aSP
End Function

 

 

テレワーク用に会社用ノートPCと個人用のノートPCで、USBレシーバー付け替えてキーボード・マウス切替ていたけど、毎回抜き差しするのもコネクターに良くなさそうなので、USB切替機amazonでポチリ
似た様なのいくつかあったけど、USB3.0で評価の多かったこれを購入。\2,020


USB機器側はLogicoolのMK235の無線マウス・キーボードレシーバー、TV会議用カメラ
何の問題も無く接続するだけで使えた。

 

ボタン1つで素直に切替り、今どっちが接続されてるかランプで確認できるのでシンプルですが便利
ただPCを1→2に切り替えて使っていると USBの接続、切離し時の「タンタラタン」って音が頻繁に鳴るのが気になる。

逆ではこんな頻繁に音しないけどと思って、PCの1,2の接続入れ替えてみたら、音が鳴るPCは同じDell側だけだった。

結局対策としては、このUSB接続・切離しの音を消す設定で対応。

 

設定

 

 

ディバイス  

 

「Blutoothとその他のディバイス」 の一番下に「関連設定」の「サウンドの設定」

 


 

 

https://www.amazon.co.jp/gp/product/B0859YCPWV