Wie Entstehen Messdaten? Am Beispiel Der Temperatur
by maximusvo in Circuits > Electronics
918 Views, 0 Favorites, 0 Comments
Wie Entstehen Messdaten? Am Beispiel Der Temperatur
Täglich vermessen tausende technische Geräte mithilfe von Sensoren unsere Umwelt, reagieren anhand der Ergebnisse oder speichern sie in Datenbanken ab. Sind die Daten einmal erfasst, wirken sie wie kleine Wahrheiten, mit denen wir z.B. die Wasser- oder Luftqualität erforschen. Auf dem Weg dahin kann aber vieles schiefgehen, weswegen die eigentliche Aufgabe der Forscher in der Fehleranalyse und Interpretation liegt. Wer also mit solchen physikalischen Daten arbeiten möchte, muss sich mit ihrem Entstehungsweg vertraut machen, um Fehler erkennen und interpretieren zu können. Thema dieses Workshops ist jener Weg, vom natürlichen Ereignis zum digitalen Zahlenwert.
Am Beispiel eines Temperatursensors, eines sogenannten Heißleiters oder auch Thermistors, werden wir erforschen, was beim Erfassen einer Temperatur passiert. Dazu benötigen wir folgendes:
- 1 Heißleiter (10k Ohm bei 25°C)
- 1 Widerstand (10k Ohm)
- 1 Arduino UNO
- 3 Steckkabel
- 1 USB Kabel
- 1 Notebook
- 1 Multimeter (optional)
Was Sind Daten?
Daten können in verschiedener Form vorliegen. In der Regel sind es numerische (also Zahlenwerte) oder alphanumerische (Buchstaben oder Sonderzeichen) Repräsentationen von Informationen, die durch Computer verarbeitet werden können. Was bedeutet das genau?
Die Semiotik, die Zeichentheorie, unterscheidet die physischen Ereignissen von den Begriffen, die sie beschreiben sowie die Symbole, die die Beschreibungen repräsentieren. Dieser Zusammenhang wird im Semiotischen Dreieck abgebildet. Wir spüren z.B., dass es wärmer wird und nennen diesen Vorgang einen Temperaturanstieg, den wir im europäischen Raum mit einer Zahl sowie der Einheit Grad Celsius beschreiben. Indem wir diesen Vorgang messen erhalten wir Messdaten.
Analoge Messung Eines Physikalischen Ereignisses
Aber genau im Messen liegt die Schwierigkeit. Denn der Mensch hat sich den Begriff "Temperatur" ausgedacht und festgelegt: Wenn Wasser bei normalem Luftdruck beginnt zu gefrieren, nennen wir das 0°C. Wenn sich aber nun die Temperatur erhöht, ist der genaue Temperaturwert sehr schwer durch Finger und Augenmaß festzustellen. Deswegen wurden Messtechniken entwickelt, die da genauer sind. Der Mensch hat beobachtet, dass nicht nur Wasser sondern auch viele andere Materialien ihren Zustand verändern, wenn sich die Temperatur ändert. Z.B. ändern Metalle ihre elektrische Leitfähigkeit. Und so wurden Wege gefunden, die elektrische Leitfähigkeit mancher Metalle in Temperaturwerte umzurechnen, womit wir beim Thermistor angekommen sind.
Der Thermistor ist ein elektrischer Widerstand, der seinen Widerstandswert ändert, wenn sich die Temperatur verändert. Wenn es z.B. 25°C sind, hat der Thermistor einen Widerstand von 10.000 Ohm, bei 30°C 7942 Ohm, bei 35°C 6327 Ohm usw. D.h.: Umso mehr wir dieser Wertepaare kennen, desto genauer können wir die Temperatur angeben. Was aber ist das, dieser Widerstand und wie können wir ihn bestimmen?
Ein Widerstand ist in einem Stromkreis wie eine Verengung in einer Wasserleitung zu verstehen: Wenn von einem Berg durch ein dickes Rohr Wasser fließt, hat es eine bestimmte Fließkraft, die vom Durchmesser des Rohres und dem Höhenunterschied abhängt. Ist nun das Rohr an einer Stelle schmaler, ergibt sich für das Wasser ein Widerstand und es fließt schwächer. Die Menge an Wasser, die an einer Stelle in einer bestimmten Zeit fließt, nennt man Strom. Die Kraft, mit der sich der Strom bewegt, kann Spannung genannt werden.
Wenn wir also messen wollen, welche Temperatur wir haben, müssen wir messen, welchen Widerstand der Thermistor hat. Weil wir den nicht direkt messen können, müssen wir einen Trick anwenden. Für den brauchen wir eine Grundgleichung der Elektrotechnik, das Ohmsche Gesetz:
- U = R * I
Wie eben schon beschrieben, hängen Strom, Spannung und Widerstand miteinander zusammen. Ist der Widerstand hoch, wird mehr Spannung benötigt, um eine bestimmte Stromstärke durch einen elektrischen Leiter fließen zu lassen. U = R * I beschreibt diesen Zusammenhang. Während U das Formelzeichen für die Spannung (in Volt) ist, beschreiben R den Widerstand (in Ohm) und I den Strom (in Ampere). Wenn wir also den Strom und die Spannung kennen, lässt sich der Widerstand leicht berechnen. Dafür muss die Gleichung nur umgestellt werden: R = U / I. Also messen wir den Strom und die Spannung und ermitteln dann die Temperatur mit Hilfe des Ohmschen Gesetzes?
Der Spannungsteiler
Leider ist es dann doch nicht so einfach. Denn in der Regel messen wir die Spannung (der Strom kann nur über Umwege gemessen werden). Legen wir aber das Messgerät an den Thermistor an, wird immer die Spannung U_gesamt herauskommen, da ein Referenzpunkt fehlt, mit dem der Spannungsabfall am Thermistor selbst gemessen werden kann. Um aber trotzdem zu unserer Temperaturmessung zu kommen, können wir uns wieder eines Trickes bedienen, des Spannungsteilers. Dieser ergibt sich aus Folgendem: Wenn zwei Widerstände in Reihe geschaltet sind, dann dürfen ihre Widerstandswerte zu einem sogenannten Ersatzwiderstand addiert werden. Das gleiche gilt dann auch für das Ohmsche Gesetz, mit dem wir beide Widerstände berechnen können. Zusammen mit der Tatsache, dass der Strom in einer Reihenschaltung überall gleich ist, resultiert folgende Herleitung. Wir erinnern uns:
- U = R * I
Gleiches gilt auch für die Widerstände R2 und den Thermistor R1:
- U1 = R1 * I und U2 = R2 * I
Bei einer Reihenschaltung können wir R1 und R2 addieren, d.h.:
- R_gesamt = R1 + R2
- U_gesamt = R_gesamt * I
Formen wir letzteres um, so erhalten wir:
- I = U_gesamt / R_gesamt
Wenn wir jetzt den aktuellen Widerstand R1, unseren Thermistor, berechnen möchten, können wir I einfach durch den letzten Schritt ersetzen:
- U1 = R1 * I <=> U1 = R1 * (U_gesamt / R_gesamt)
Für R2 ergibt sich:
- U2 = R2 * I <=> U2 = R2 * (U_gesamt / R_gesamt)
Jetzt können wir eine Tabelle anlegen, in der wir einerseits die Temperatur- und Widerstandswerte eintragen sowie andererseits jedem Widerstandswert einen Spannungswert zuweisen, den wir mit der letzten Gleichung für R2 berechnet haben (die Widerstandswerte des Thermistors R1 müssen über sein Datenblatt ermittel werden). Messen wir jetzt zwischen R2 und dem Thermistor R1 (Messpunkt) die Spannung des Messwiderstandes R2, so können wir mit Hilfe der Tabelle und dem gemessen Spannungswert die Temperatur ablesen.
Der Mikrocontroller Auf Dem Arduino UNO
Die Messung und Auswertung des Thermistors erfolgt mit einem Ein-Chip-Computer, einem sogenannten Mikrocontroller. Diese Computer befinden sich in sehr vielen Geräten des Alltags und steuern zum Beispiel eure Waschmaschine. Mikrocontroller zeichnen sich dadurch aus, dass wir an sie recht einfach Sensoren oder Aktoren, z.B. Leuchtdioden, anschließen können. Wir verwenden in diesem Workshop ein Arduino UNO, auf dem ein solcher Mikrocontroller verbaut ist.
Damit dieser arbeitet, muss er programmiert werden. Das passiert z.B. mit Hilfe eines Notebooks. Dort muss die Arduino IDE installiert sein. Das ist ein Programm, mit dem ihr selbst Programme in der Programmiersprache C schreiben (keine Sorge, das ist schnell gelernt) und auf Mikrocontroller übertragen könnt. Dabei müsst ihr euch nur an eine vorgegebene Struktur halten. Jedes Programm besteht aus folgenden zwei Teilen:
- der "void setup()" und der
- "void loop()" Funktion
Diese beiden Funktionen machen genau das, was ihre Namen sagen: In der Ersten wird festgelegt, was in der Zweiten verwendet wird. Z.B. wird ein Pin des Mikrocontrollers als Ausgang festgelegt, damit ihr damit eine Leuchtdiode ansteuern könnt. In der loop Funktion, die der Mikrocontroller im Betrieb fortwährend abarbeitet, kann die LED dann z.B. ein und ausgeschaltet werden.
Navigiert in eurer Arduino IDE Installtion über Datei/Beispiele/Basics zum Projekt "Blink" und probiert das Beschriebene einfach aus. Dazu öffnet ihr "Blink", steckt den Arduino UNO via USB an euer Notebook, wählt diesen über Werkzeuge/Board sowie über Werkzeuge/Port in der Arduino IDE aus und klickt im Editor auf den Pfeil nach rechts "Hochladen" - fertig. Jetzt sollte auf eurem Arduino Board eine Leuchtdiode blinken.
Digitalisierung Der Analogen Messung
Inzwischen kennen wir den Mikrocontroller und haben erste Temperaturmessungen gemacht. Die Messungen waren aber noch sehr aufwändig, denn wir mussten immer das Messgerät anlegen, eine Spannung ablesen und die über eine Tabelle einer Temperatur zuordnen. Besser wäre es, wenn das automatisch ablaufen würde und wir die Daten direkt verarbeiten könnten. Das geht mit unserem Mikrocontroller. Denn mit diesem können wir ebenfalls eine Messung durchführen, sofern wir ihn so programmieren. Dafür müssen wir uns eine neue Funktion anschauen, die uns das ermöglicht:
Mit ihr erfolgt ein grundlegender Schritt der Datenverarbeitung, die Analog-Digital-Wandlung: Durch die Funktion analogRead(pin) wird ein analoges Signal, das an "pin" anliegt, digitalisiert. Analog, digital, was war'n das noch mal?
Letztendlich macht der Mikrocontroller nichts anderes, als das, was wir mit dem Messgerät gemacht haben, mit einer Ausnahme: Er misst die Spannung an "pin" und weist das Ergebnis einem Zahlenwert zwischen 0 und 1023 zu. Das macht er so schnell, wie wir es ihm sagen und wie es sein Prozessor erlaubt. Möchten wir daraus den Spannungswert berechnen, müssen wir das Ergebnis der Wandlung wieder umwandeln, also mit 5V/1023 multiplizieren. Wenn uns der Mikrocontroller den Wert 788 zurück gibt, so erhalten wir durch die Multiplikation mit 5V/1024 3,8 Volt. Haben wir auf dem Speicher des Controllers eine Liste mit dem Temperaturverlauf unseres Thermistors abgelegt, in der er 3,8 Volt einem Temperaturwert zuweisen kann, so können wir uns diesen auf unseren Notebook-Bildschirm ausgeben lassen. Aber Eins nach dem Anderen:
Der Code für die Digitalisierung und die Rückgabe des digitalisierten und umgerechneten Spannungswertes ist folgendermaßen:
void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 1: float sensorValue = analogRead(A1) * (5.0/1024.0); // print out the value you read: Serial.println(sensorValue); // delay in between reads for stability delay(1); }
Bevor wir den Code auf den Mikrocontroller übertragen, muss die Termistor-Schaltung über ein Kabel mit dem Pin A1 am Messpunkt (+) verbunden werden (siehe step 3). Auch +5V sowie GND (-) müssen vom Mikrocontroller kommen. Die Funktion "Serial.println(message)" ermöglicht es, Zustände im Mikrocontroller an unser Notebook zu senden. Um Serial.println() nutzen zu können, muss in der Funktion "setup()" vorher die Sendegeschwindigkeit festgelegt worden sein. Im Beispiel sind das 9600 bits pro Sekunde. Anschließend müssen wir in der Arduino IDE über "Werkzeuge" den Seriellen Monitor starten.
Aber was passiert da genau? Mit Searial.begin(9600) wird in der Setup Funktion die serielle Datenübertragung initialisiert und die Geschwindigkeit von 9600 bits/s gesetzt. Anschließend startet die loop() Funktion. In dieser wird immer wieder eine float Variable namens "sensorValue" erstellt und dieser der mit 5/1024 multiplizierte Wert zugewiesen, der durch die Analog-Digital-Wandlung bestimmt wurde. Anschließend sendet der Mikrocontroller den Inhalt der Variable mithilfe der Searial.println() Funktion an unser Notebook, wartet ganz kurz delay(1) und beginnt von Vorne.
Automatische Messung Und Umrechnung
Wir können also jetzt mit dem Mikrocontroller einen Spannungswert messen und durch eine Temperatur <-> Widerstand <-> Spannung Tabelle die aktuelle Temperatur interpretieren. Diese Tabelle haben wir allerdings auf dem Mikrocontroller noch nicht abgelegt, da sie einen Haken hat: sie ist ungenau. Denn die meinsten Datenblätter geben den Widerstandswert nur alle 5°C an, die Werte dazwischen fehlen.
Dieses Problem lässt sich wieder mithilfe eines Trickes lösen: Wenn wir die Widerstandswerte in Abhängigkeit von der Temperatur in ein Koordinatensystem übertragen, dann ist ein kontinuierlicher Verlauf zu sehen. Durch die Mathematik wissen wir, dass eine solche Regelmäßigkeit auch durch eine Funktion ausgedrückt werden kann. Finden wir also eine Funktion, die unserer Folge von Widerstandswerten ähnelt, lassen sich mit ihr die fehlenden Werte ermitteln. Um das zu erreichen, können wir uns eines Tabellenkalkulationsprogrammes bedienen. Das geht folgendermaßen: Erst tragen wir die Widerstandswerte in eine Spalte ein, daneben die Temperaturwerte. Anschließend nutzen wir das umgeformte Ohmsche Gesetz U2 = R2 * (U_gesamt / R_gesamt) und berechnen die Spannungswerte für den Messwiderstand R2, die wir in eine Spalte neben die Temperaturwerte schreiben. Jetzt haben wir zu jedem Widerstandswert eine Temperatur und einen Spannungswert. Die beiden letzten Spalten markieren wir und weisen das Programm an, diese als x und y Werte in ein Koordinatensystem zu zeichnen. Anschließend rechts-klicken wir auf die nun sichtbare Folge von Punkten und wählen "Trendlinie einfügen" aus. Nun probieren wir verschiedene der angebotenen Trendfunktionen aus und wählen die, die unserer Punktfolge am nächsten ist. Ist eine passende gefunden, wählen wir zum Schluss in diesem Auswahlfenster "Gleichung anzeigen" aus - fertig. Nun müsste etwa folgendes in eurem Chart zu sehen sein: f(x) = 1,0304979225x^4 - 8,8852088479x^3 + 26,7473408985x^2 - 13,6032287304x - 8,9327944109
Mit dieser Gleichung lässt sich nun die Temperatur direkt berechnen, sofern wir den aktuellen Spannungswert unserer Thermistor-Schaltung kennen. Der Code dazu kann folgendermaßen aussehen:
// the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 1: float sensorValue = (analogRead(A1)*(5.0/1023.0)); double temp = 1.0304979225*pow(sensorValue,4) - 8.8852088479*pow(sensorValue,3) + 26.7473408985*pow(sensorValue,2) - 13.6032287304*sensorValue - 8.9327944109; // print out the value you read: Serial.println(temp); delay(1); // delay in between reads for stability }
Zugegeben, die vielen Nachkommastellen machen den Code nicht gerade übersichtlich. Übertragen wir diesen auf unseren Mikrocontroller, so erhalten wir über den Seriellen Monitor eine ungefähre Temperaturangabe. Glückwunsch, du hast ein digitales Thermometer gebaut!
Diskussion - Messen Und Wahrheit
Wenn du das Ergebnis jetzt mit anderen Thermometern vergleichst, wird dir möglicherweise auffallen, dass es starke Abweichungen gibt. Das liegt in erster Linie an der Toleranz eines jeden Thermistors. Das ist ein Wert, der in Prozent angibt, wie stark die Widerstandswerte von der Norm abweichen können. Um solche Ungenauigkeiten zu vermeiden, muss dieser Aufbau, wie jedes Messgerät, kalibriert werden. Dazu nimmt man ein sehr genaues Temperaturmessgerät, was kalibriert ist und misst die Abweichung des selbstgebauten Sensors. Die Abweichung wird dann im Code unseres Sensors berücksichtigt.
Neben dieser Standardabweichung sind noch viele andere Messfehler möglich. Z.B. können Materialermüdung, Verschmutzungen am Sensor, ungünstige Aufstellungsorte des Messgerätes und Schwankungen der Stromversorgung das Messergebnis verfälschen. Wenn mit Messdaten gearbeitet wird, müssen diese Aspekte unbedingt berücksichtig werden, weil es sonst zu Fehlinterpretationen und -entscheidungen kommen kann.