Ich versuche mit Arduino UNO einen LM35-Temperatursensor zu lesen, den ich als Geschenk bekommen habe. Das Problem ist die Tatsache, dass meine Messwerte des Sensors zumindest verdächtig sind - sie springen mit jedem Messwert um 5 ° C nach oben oder unten.
Ich hatte mehrere Beiträge verwendet, um das Ding mit dem Arduino-Board zu verbinden und das Lesen ( 1 , 2 , 3 ) zu programmieren , und den unten angegebenen Code erstellt. Der Sensorwert schwankt sehr stark - er springt nach jedem Messwert unabhängig von der Lesefrequenz um 3 bis 7 ° C (getestet mit einem Messwert von jeweils 0,5 s, 1,0 s oder 2,5 s). (Leider besitze ich kein Multimeter, um die tatsächlichen Werte zu überprüfen.) Um das Problem zu beheben, habe ich einen Mittelwertbildner implementiert, aber das zugrunde liegende Problem bleibt bestehen. Die erwarteten Werte liegen bei 23 oder 24 ° C, gemessen mit einer digitalen Wetterstation bzw. einem Bimetallthermometer.
Hast du das schon mal getroffen? Haben Sie Ideen, woran das liegen könnte? Ich bin sowohl Anfänger in der Elektronik als auch in Arduino und versuche, es zu lernen und hauptsächlich zu verstehen.
Der vollständige Code:
#include <WString.h>
//Stores read analog values
int readLM35;
const int sensorAnalogPin = 0;
const float voltsToTemperature = 1.1 / 1023 * 100; // (1.1V supply / 10bit resolution) * (10 mV/°C = 1 V / 100 °C)
//Stores the temperature in °C
float temp;
//Averager
float temps[8];
byte position = 0;
float averageTemp;
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
//For setting internal analog reference voltage to 1.1V
analogReference(INTERNAL);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(50);
digitalWrite(LED_BUILTIN, LOW);
//Measure temperature
readLM35 = analogRead(sensorAnalogPin);
temp = readLM35 * voltsToTemperature;
//Save it
temps[position] = temp;
if (position == 7) {
position = 0;
} else {
position++;
}
//Get average
averageTemp = 0;
for (byte i = 0; i < 8; i++) {
averageTemp += temps[i] / 8;
}
//Write
Serial.println(String(readLM35) + " => " + String(temp, 1) + " deg. C, avg. " + String(averageTemp, 1));
delay(2500);
}
Beispiel für die Ausgabe (beachten Sie die ersten Zahlen - tatsächliche Anzeige):
211 => 22.7 deg. C, avg. 22.5
186 => 20.0 deg. C, avg. 21.9
234 => 25.2 deg. C, avg. 22.7
173 => 18.6 deg. C, avg. 21.9
237 => 25.5 deg. C, avg. 22.6
185 => 19.9 deg. C, avg. 21.9
231 => 24.8 deg. C, avg. 22.4
193 => 20.8 deg. C, avg. 22.2
223 => 24.0 deg. C, avg. 22.3
206 => 22.2 deg. C, avg. 22.6
197 => 21.2 deg. C, avg. 22.1
225 => 24.2 deg. C, avg. 22.8
183 => 19.7 deg. C, avg. 22.1
240 => 25.8 deg. C, avg. 22.8