[menu name=“Bordcomputer“]

Beschreibung

Im Motorraum soll die Temperatur an ein oder zwei Stellen gemessen werden können. Das soll mir Aufschluss über diverese Kühlungsmaßnahmen geben.

Die Auswahl an verfügbaren Sensoren die einen sehr hohen Bereich messen können ist nicht sehr groß und ich hab mich so für den Seeed Grove – High Temperature Sensor entschieden.

http://wiki.seeedstudio.com/Grove-High_Temperature_Sensor/

Was mir zunächst nicht bewusst war ist, dass dieser Sensor gedacht ist um mit dem GrovePi_Plus Board betrieben zu werden.

Verwendet man einen Arduino geht es auch ohne, mit einem Raspberry Pi braucht man as Board.

Weshalb ist das so? Letztlich liegt das nur daran, dass der Arduino im Gegensatz zum Raspberry Pi Analog-Eingänge hat und dieser Sensor seinen Wert Analog liefert. Also muss das doch auch irgendwie direkt am Raspberry Pi funktionieren.

Anschluss an den Raspberry Pi

So soll der Sensor an den Arduino ohne GrovePi_Plus Board angeschlossen werden:

ArduinoGrove-High Temperature Sensor
GNDBlack
5VRed
A1White
A0Yellow

Der Sensor wird somit zwei analoge Werte liefern. Das deckt sich mit der Beschreibung:

One which is for measuring room temperatures – that’s found on the sensor’s board.

Another one which is for measuring temperatures between -50 °C and +650 °C – it’s the long metal wire.

Im Code der Sensor-Bibliothek findet sich noch dieser Code mit dem Hinweis, dass die Raum-Temperatur über A1 (White) und die Temperatur bis 650°C über A0 (Yellow) geliefert wird:

room_temperature_pin = 15 # this is equal to A1

probe_temperature_pin = 14 # this is equal to A0

Das sollte also auch über einen ADC am Raspberry Pi möglich sein. Ich nutze hier den ADC1115 16-Bit Analog/Digital Converter.

https://www.adafruit.com/product/1085

GND und 5V können direkt vom Raspberry Pi geholt werden, das gelbe und das weiße Kabel kommt an A0 und A1 vom ADC1115 (A3 kann hier ignoriert werden, damit lese ich etwas anders aus):

Funktionsweise des Sensors

Was liefert der Sensor überhaupt und wie verarbeitet ihn das GroovePi_Plus-Board?

Hierzu ein Blick in die Beschreibung des Sensors und des Codes:

Daraus lässt sich folgende Funktionsweise ableiten:

  • Der Sensor liefert sowohl an A0 als auch an A1 eine Spannung im Bereich von 0-3.3V.
  • Der GroovePi_Plus wertet dieses Signal mit einem 10-Bit DAC aus und bildet diesen Wert auf den Bereich 0-1023 ab der über Methode analogRead() ausgelesen werden kann.

Die Raumtemperatur an A1 wird über eine Formel in °C umgewandelt (getRoomTemperature()).

Die Hochtemperatur an A0 wird über eine Zuordnungstabelle (getProbeTemperature(), thermocouple_table.json) ermittelt.

Werte auslesen und interpretieren

Der Plan ist nun, die Funktion analogRead() in der grove_hightemperature_sensor.py gegen eine Funktion zu ersetzen, die den Wert vom ADC1115 ausliest.

Den ADC1115 kann ich mit dem GAIN von 1 auf einen Bereich von -4,096V – 4,096V einstellen. Das funktionierte in den ersten Tests auch ohne Probleme.

Ich erhalte aber ein 16-Bit aufgelöstes Signal für den Bereich von -4,096V-4,096V = -32768-32767.
Das soll nun so umgerechnet werden, dass ich den Wert auf den Bereich von 0-3.3V = 0-1023 vom 10-Bit DAC abbilden kann und die bisherigen Funktionen der Bibliothek ohne weitere Anpassungen funktionieren.

Eine Excel-Tabelle gibt mir Aufschluss über die Digital-Werte der beiden DACs.

Bei 3.3V, die der Sensor maximal liefern kann, würde der GroovePi_Plus mit dem Wert 1023 arbeiten. Der ADC1115 liefert hier dann etwa 26406. Daraus ergibt sich die Umrechnung:

analog_value = 16bit_value / 26406 * 1023

In der Tabelle ganz rechts unter „Umgerechnet“ treffen die Werte ziemlich gut die Werte die vom 10-Bit DAC kommen würden.

Nach entfernen der Anpassung an 5V in der getRoomTemperature() liefert die Raumtemperatur schon ordentliche Werte:


Zum Vergleich mit einem anderen Thermometer und einer Abweichung von +/-2 Grad passt das doch ziemlich gut:

Der zweite Temperaturwert muss laut der Doku noch kalibriert werden.