Nachbau eines Thermometers

Um die Ergebnisse der Messung des Ressourcenverbrauchs für Fließkomma- bzw. Floating-Point Berechnungen zu überprüfen, wiederhole ich den Versuch diesmal mit einem NTC Widerstand zum Messen der Temperatur.
Die verwendete Hardware bleibt, bis auf den Sensor, gleich: drei verschieden Arduino Boards ( Uno, Due und Mega2560 ). Als AD Wandler einen externen 16bit ADC über I2C und eine zweizeilige LCD Anzeige ebenfalls über I2C. Mich interessieren dabei wieder folgende Größen:

  • der Programmspeicherplatz ohne und mit Temperaturberechnung
  • die Laufzeit der Temperaturberechnung im Betrieb. Für die Laufzeitmessung setze ich einfach wieder denselben Pin auf High und messe den dann mit einem Oszilloskop.

Ergebnisse:

  • Programmspeicherplatz / Dateigrößen

ohne Temperaturberechnung, ohne Laufzeitmessung
Arduino Due : 41296 Bytes Programmspeicher
Arduino Uno : 7864 Bytes Programmspeicher
Arduino Mega2560 : 8262 Bytes Programmspeicher

mit Temperaturberechnung, ohne Laufzeitmessung
Arduino Due : 42712 Bytes Programmspeicher, Differenz 1416 Bytes
Arduino Uno : 8608 Bytes Programmspeicher, Differenz 744 Bytes
Arduino Mega2560 : 8942 Bytes Programmspeicher, Differenz 680 Bytes

  • Laufzeiten

mit Temperaturberechnung, mit Laufzeitmessung
Arduino Due : 120 Mikrosekunden
Arduino Uno : 320 Mikrosekunden
Arduino Mega2560 : 330 Mikrosekunden

Der Sketch: NTC und Display

Fazit:
Auch an diesem Beispiel zeigt sich dasselbe Bild: Speicherplatzbedarf und Laufzeiten sind bei weitem viel kleiner bzw. kürzer als immer behauptet wird. Es gibt also keinen Grund, auf Fließkomma- bzw. Floating-Point Berechnungen zu verzichten. Selbst wenn die erforderlichen Zykluszeiten kürzer sind, lassen sich die Berechnungen asynchron dazu durchführen.

Ergänzung:
Beim Umstellen auf einen Arduino Uno / Mega2560 hat sich folgendes ergeben:

  • Die Genauigkeit wird besser, wenn ich den berechneten MAX_ADC_READING benutze. Die Abweichung beträgt bei mir ca. +0,2 Grad Celsius. Setze ich den MAX_ADC_READING auf 26566, komme ich auf <= +-0.1 Grad Celsius.
  • Für die Ausgabe des Float Wertes benutze ich zwei integer Werte, einen für die Ganzzahl und einen für die erste Nachkommastelle:
int tmp = 0;
int frac = 0;
..
tmp = (int)temp;
frac = (int)(temp * 10.0) - (tmp * 10);
sprintf(text, " T = %d.%d%sC", tmp, frac, grad);

Links

NTC / Heißleiter
https://de.wikipedia.org/wiki/Heißleiter

Temperaturberechnung mittels NTC Widerstand
https://forum.arduino.cc/index.php?topic=194846.0

Using a thermistor
https://learn.adafruit.com/thermistor/using-a-thermistor

Arduino Tutorial: Der Temperatursensor
https://www.mymakerstuff.de/2018/05/18/arduino-tutorial-der-temperatursensor/

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.