Sollen float oder double Variablen formatiert auf einen String geschrieben werden, so bietet sich der Befehl "sprintf" mit seinen Formatierungen an:

sprintf(line, "T=%f C", Temp);

gibt die Variable Temp nicht als Fliesskommazahl "T=22.5 C" sondern meist als "?" aus. Hier scheint ein Defekt oder eine Fehlkonfiguration am Compiler vorzuliegen. Die Foren sind voll von Einträgen zu diesem Thema. Laut http://dereenigne.org/electronics/arduino/arduino-float-to-string gibt es einen Alternativbefehl

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

z.B. wandelt der Befehl

dtostrf(Temp, 5, 2, line);

die Float-Variable Temp richtig in einen String mit 5 Gesamtstellen (inkl. Dezimalpunkt) und zwei Nachkommastellen um.

Bei den anderen Zahlentypen funktioniert sprintf jedoch sehr gut. Die Formatierungsparameter sind leider nicht in der Arduino-Referenz erklärt, aber hier zu finden: http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/