[menu name=“Bordcomputer“]
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.
So soll der Sensor an den Arduino ohne GrovePi_Plus Board angeschlossen werden:
Arduino | Grove-High Temperature Sensor |
GND | Black |
5V | Red |
A1 | White |
A0 | Yellow |
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):
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:
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.
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.