Das sehr preiswerte Modul SR04M kann eigenständig laufende Messwerte seriell ausgeben. Mit einem FTDI-Adapter, wie er im Buch mehrfach zum Einsatz kommt, landen die RX/TX-Daten direkt über USB am PC an einer seriellen Schnittstelle. Ein kurzes VBA-Makro fängt die Daten ein.
Die beiden Platinen verbinden sich mit den vier Leitungen: 5V, TX, RX und GND, wobei die beiden mittleren seriellen Leitungen gekreuzt werden müssen. Das US-Board verfügt über einen eigenen STM8S-Controller, der beim Einschalten zunächst die beiden links neben der Masse angebrachten Anschlüsse für einen R19 überprüft. Im Auslieferungszustand ist dort kein Widerstand eingebaut und das Modul benutzt die RX/TX-Pins als Trigger/Echo, wie bei dem noch mehr verbreiteten US-Sensor HC-SR04 mit getrennter Sende- und Empfangs-Kapsel. Ist dort ein 0 Ohm Widerstand, bzw. eine Brücke eingebaut, arbeitet das Board im Modus 5. Dabei sendet die Platine nach einer Aufforderung auf der Sendeleitung Adapter und Empfangsleitung Modul durch ein Zeichen oder Byte (z. B. 0x01) das Messergebnis als Zeichenkette der Form "Gap=1678mm" auf der anderen Leitung zurück. Dabei handelt es sich vermutlich um den Abstand in Luft bei einer Temperatur von 20 °C. Bei anderen Temperaturen oder Medien muss umgerechnet werden.
Ist der US-Kopf angesteckt, Adapter und Platine korrekt verbunden, die Brücke bei R19 gelegt und der PC per USB mit dem Adapter verbunden, so kann nun über den neuen COM-Anschluss gemessen werden:
Erster Test mit COM15:
'US Measuring Transducer Sensor Model: AJ -SR04M
Sub dist()
If OPENCOM("COM15:9600,N,8,1") < 1 Then MsgBox "Fehler": End
SENDBYTE 1
A$ = "xxxxxxxxxxxxxxxx" 'Platzhalter
Result = Left(A$, READSTRINGNL(A$))
Debug.Print Result ' Gap=1464mm
End Sub
Soll die Messwertanzeige dynamisch in einem Dialog, wie weiter oben dargestellt erfolgen, so ist hier der Quelltext für eine UserForm2 mit den Elementen Label1, Label4 und CommandButton1, sowie den in einem anderen Modul deklarierten Aufrufen der RSAPI64.
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Dim t0
Private Sub CommandButton1_Click()
End
'Selection.TypeText Text:=Label1.Caption + Chr(9) + Label1.Caption + Chr(11)
End Sub
Private Sub UserForm_Activate()
If OPENCOM("COM15:9600,N,8,1") < 1 Then MsgBox "Fehler": End
w0 = Label4.Width
t0 = Timer
While UserForm2.Visible
DoEvents
SENDBYTE 1
Label4.BackColor = &HC00000
A$ = "xxxxxxxxxxxxxxxx" 'Platzhalter
Result = Left(A$, READSTRINGNL(A$))
Result = Replace(Result, "Gap=", "")
Result = Replace(Result, "mm", "")
If Result <= 200 Then Label4.BackColor = &HFF&
Label1.Caption = Format(Result / 1000, "0.000") + " m"
Label4.Width = w0 * Result / 8000
Sleep 200
Wend
End Sub