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/