Um dann mal auf dein ursprüngliches Problem zurück zu kommen:
Ich kann nur vermuten, dass du einen LM35 o. ä. als Sensor verwendest. Aus deinem Code geht das leider nicht hervor, und auch nicht, mit welcher Referenzspannung du misst.
Ich mache es so:
analogReference(DEFAULT); // set analog reference voltage to VCC=5V
int getTemperatureTMP35(byte analogPin){ // returns temperature in tenth of centigrade, for TMP35 sensor
long value; // intermediate results need to be long
value = analogRead(analogPin); // take three readings and average
value += analogRead(analogPin);
value += analogRead(analogPin);
value /= 3;
value = (5000 * value) / 1024L;
return(int)value;
}
5000 (mV) ist meine Versorgungsspannung, in deinem Fall also 3300, Ausgabe ist in milliGrad Celsius. Ich verwende keine floats auf Gründen der Geschwindigkeit und Codegröße, ist auch nicht nötig.
Ein LM35 hat eine Genauigkeit von 1 Grad bei Zimmertemperatur, der Spannungsregler ist deutlich genauer und sollte keinen Einfluss auf dein Ergebnis haben.
Wenn die Ausgangsspannung des Spannungsreglers bei mir im Batteriebetrieb unter 5 Volt sinkt, gehen die Messwerte in die Höhe.
Der Tip von michael_x ist in diesem Fall tatsächlich die Lösung, sieht bei mir so aus:
inline int getVcc(){ // Returns actual value of Vcc (in milliVolts), modified code copied from the forum
const long InternalReferenceVoltage = 1100; // assume perfect 1.1V reference voltage, the absolute error does not matter much
// REFS1 REFS0 --> 0 1, AVcc internal ref. -Selects AVcc external reference
// MUX3 MUX2 MUX1 MUX0 --> 1110 1.1V (VBG) -Selects channel 14, bandgap voltage, to measure
ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1);
// Start a conversion
ADCSRA |= _BV( ADSC );
// Wait for it to complete
while((ADCSRA & _BV(ADSC)));
// Scale the value
int result = (((InternalReferenceVoltage * 1024L) / ADC) + 5L);
return result;
}
result ersetzt dann die 5000 aus obiger Berechnung.