In diesem Beitrag möchte ich euch zeigen wie man Daten, welche über die seriellen Schnittstelle ausgegeben werden, loggen kann. Dafür nutze ich Putty, um die Daten in eine Textdatei zu speichern. Anschließend werte ich diese Daten mit Octave aus. Da ich keine Matlab Lizenz besitze, weiche ich auf diese freie Software aus.
In meinem Fall stellt ein Arduino Mega 2560 Messdaten über die serielle Schnittstelle zur Verfügung. Die Messdaten werden über den IC MCP9600 erfasst und über die I2C Schnittstelle an den Arduino gesendet. Der IC MCP9600 ist ein IC zum Auswerten eines Thermocouple. In meinem Fall verwende ich ein Typ K Thermocouple.
Arduino und der MCP9600
Für dieses Beispiel werde ich eine Temperatur loggen, welche ich über den IC MCP9600 auslese. Man könnte auch genauso die Spannung über den ADC ADS1115 aufzeichnen, welcher sich aus sehr einfach mit dem Arduino über die I2C Schnittstelle verbinden lässt.
Den IC MCP9600 gibt es zum Beispiel von Seeedstudio oder Adafruit auf einem kleinem Breakout Board fertig bestück. Dieses muss nur noch über 4 Pins mit dem Arduino verbunden werden:
- GND -> GND
- VCC -> 5V
- SDA -> D20
- SCL -> D21
Mithilfe des Library Managers kann über Tools > Manage Libraries… die Bibliothek von Adafruit eingebunden werden. Diese wird über das Stichwort mcp9600 gefunden.
Ob der Arduino mit dem MCP9600 richtig verbunden worden ist, kann mithilfe des Beispiel Code überprüft werden. Dieses befindet sich unter File > Examples > Adafruit MCP9600 Library > mcp9600_test. Nach dem Upload sollten über den Serial Monitor die ersten Messwerte ausgegeben werden. Auch wenn kein Thermocouple angeschlossen ist, werden Messwerte zu Hot Junction und Cold Junction ausgegeben.
Für das Logging habe ich mich entschieden, dass jede Messung eine eigene Zeile wird. Dafür habe ich den Abschnitt in der For-Loop etwas abgeändert. Mit dem entsprechenden Einsatz von Serial.print und Serial.println wird dies erreicht.
void loop()
{
currentTime = millis();
Serial.print("Time:"); Serial.print(currentTime); Serial.print(",");
Serial.print("Hot Junction:"); Serial.print(mcp.readThermocouple()); Serial.print(",");
Serial.print("Cold Junction:"); Serial.println(mcp.readAmbient());
delay(1000);
}
Am Anfang des Code habe ich noch folgende Variable eingefügt:
unsigned long currentTime;
Die gesamte Datei steht hier zum Download bereit:
Putty
Da nun die Messdaten über die Serielle Schnittstelle zur Verfügung stehen, können diese mit Putty abgeriffen und in eine Text-Datei gespeichert werden. Putty steht hier zum Download bereit.
Nach der Installation sollte sich nach dem Programmstart folgendes Fenster öffnen:
Nachfolgende Änderungen werden getroffen, um eine Serielle Verbindung herzustellen. In meine Fall verwende ich COM4 und eine Geschwindigkeit von 115200bps. Der richtige COM-Port kann über den Task-Manager in der Systemsteuerung herausgefunden werden.
Die Geschwindigkeit wird im Arduino Code durch folgende Zeile definiert
Serial.begin(115200);
Die aktuelle Session kann man unter Saved Sessisons speichern, indem dort ein Name vergeben wird und anschließen auf Save geklickt wird. In meinem Fall sieht dies wie folgt aus:
Unter Session > Logging auf der linken Seite muss noch das Logging aktiviert werden und schon werden alle Daten in eine Datei gespeichert. Danach sollte die Session, wie oben beschrieben, wieder gespeichert werden.
Nachdem auf Open geklickt wird, verschwindet das Putty Configuration Fenster und der Datenstrom über die Serielle Schnittstelle wird angezeigt:
Die Datei putty.log muss sofort ersichtlich sein. Erfolgt kein Logging in den Default-Ordner (C:\Program Files\PuTTY) so besitzt man evt. nicht die Berechtigungen und ein alternativer Ordner muss gewählt werden.
Das Logging kann ganz einfach unterbrochen werden, in dem das Fenster geschlossen wird.
Octave
Ich greife auf die freie Software Octave zurück um eine Visualisierung meiner Messdaten zu erzeugen.
Mein Auswerte Skript steht hier zum Download bereit:
Die Datei putty.log speichere ich in den selben Ordner wie das Auswerteskript analysis.m. Nach dem Ausführen des Code, sollten die Messdaten in dem Fenster figure(1) dargestellt werden. Das Zahnrad Symbol mit dem gelben Dreieck speichert und führt den Code aus.
Meine Auswerteskript gliedert sich in vier Abschnitte. Der erste Abschnitt extrahiert die Daten aus putty.log. Mithilfe von strsplit werden die Werte einer Zeile, welche durch „:“ oder „,“ getrennt sind, auf eine eigene Spalten aufgeteilt. Somit ist jeder Messwert in einer neuen Spalte hinterlegt. Strtrim entfernt unnötige Leerzeichen. Anschließend erfolgt noch eine Umwandlung in das Zahlenformat double.
Mit der Konvertierung zu double werden Buchstaben/Wörter zu NaN in der Variable data. Die ersten Zeile enthalten ohnehin keine Messdaten und daher werden die ersten neun Zeilen gelöscht (siehe Zeile 30). In diesem Beispiel befindet sich die Zeit in der zweiten Spalte. Diese Daten werden zur x-Achse. Die Daten zur Hot- und Cold Junction Temperatur befinden sich in Spalte vier und sechs und bilden die y-Achse.
Zum Schluss werden mit dem Befehl plot die Messdaten in figure(1) dargestellt.
Zusammenfassung
Mit drei Gratis Software (Arduino, Putty und Octave) können schnell Messdaten individuell visualisiert werden. Der Vorteil in dem Auswerteskript, welches mit Octave geschrieben wurde, besteht darin, dass der Graph ganz nach den eigenen Wünschen angepasst werden kann. Titel, Achsenbeschriftung, Legenden oder eine Sekundärachse können nach belieben angepasst werden.
In Arduino steht zwar der Serial Plotter zur Verfügung, doch dieser gewährt nicht 100%ige Freiheit. Auch die Rohdaten stehen dort nicht zur Verfügung und ein anschließendes Nachbearbeiten ist somit nicht möglich.