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
Antworten:
Die Ursache ist die geringe Sinkfähigkeit des LM35-Ausgangs. Dies macht den Ausgang empfindlich gegenüber EMI. Ja, die Ausgangsausgangsimpedanz wird mit 0,5 Ohm angegeben, jedoch nur für die Stromquelle. Der sinkende Strom ist auf 1 uA begrenzt, was durch das Umgebungsgeräusch leicht erreicht wird.
Sie müssen eine niederohmige Last zwischen LM35-Ausgang und Masse hinzufügen, die 200 Ohm betragen kann, wie im Datenblatt für schwere kapazitive Lasten empfohlen, aber ich würde nicht so weit gehen, möglicherweise 1k oder 2k, um Fehler bei der Eigenerwärmung zu vermeiden.
Keine Software-Lösung kann diesen Fehler beheben.
quelle
Versuchen :-
quelle
0
statt1
...Ich denke, wenn 0 = 0 und 5V = 1023, dann sollten Sie durch 1023 dividieren. Wenn ich die Frage betrachte, stelle ich fest, dass Sie AnalogPin = 0 verwenden. Ich selbst würde mich an AnalogPin = A0 halten. A0 ist definiert als:
definiere PIN_A0 (14)
es ist also nicht gleich 0. Sind Sie sicher, dass Sie den richtigen Stift lesen? Versuchen Sie auch einen anderen Pin wie A3.
quelle
Dies ist ein bekanntes Problem für alle Arduino-Sensoren (Schwankungen und Drift). Ich hatte auch dieses Problem mit dem Feuchtigkeitssensor und dem Wasserstandsensor mit LM393-Komparator. Ich habe versucht, die Schwankungen zu verringern, indem ich versucht habe, Durchschnittswerte anstelle von Einzelwerten zu berechnen lesen:
Im Allgemeinen haben alle Sensoren einen linearen Bereich, der darüber hinaus nicht zuverlässig sein kann, und auch eine Kalibrierung für sie ist erforderlich.
quelle
Warum hast du 1.1 / 1023 gemacht? Sie sagen, dass die Versorgung 1,1 V beträgt, aber Sie liefern sie 5 V. Ich benutze (readLM35 / 1024) * 500, um den Temperaturwert in ° C zu erhalten, und er entspricht einem von mir gekauften Thermometer. Wenn dies nicht funktioniert, versuchen Sie es mit einem anderen lm35. Möglicherweise haben Sie nur einen fehlerhaften.
Auch der LM35 ist werkseitig auf Spannung kalibriert. Sie müssen es also entsprechend dem von Ihnen verwendeten Arduino kalibrieren. Ich würde den ds18b20 empfehlen, da er für die Temperatur kalibriert ist. Die Verwendung der Dallas-Temperaturbibliothek erleichtert auch die Verwendung
quelle
Bei vielen Antworten bleiben Sie beim Code oder beim LM35 selbst und nicht beim Hauptteil, dem ADC. Wenn Sie eine [ungefähr] richtige Temperatur lesen, dann ist der Code, die vRef- und die Pin-Konfiguration richtig. Ich hatte Probleme mit ADCs, da ich für meine Diplomarbeit viele Sprachsignale messen musste. Hier sind einige Probleme, die auftreten können:
quelle
Wenn das Problem mit den Messwerten weiterhin besteht, setzen Sie eine RC-Schaltung zum Messen der Spannung ein, da diese der in der Software durchgeführten Mittelwertbildung ähnelt. Sie können auch versuchen, den LM35 durch einen neuen zu ersetzen, da er manchmal fehlerhaft ist oder Sie ihn beschädigt haben (ist bei mir passiert). Sie können dies jedoch leicht überprüfen, indem Sie die Spannung am Messstift messen, ob sie dem entspricht, was Sie erhalten. Wenn Sie mit Elektronik arbeiten, investieren Sie bitte in ein Multimeter, da es Ihnen bei all Ihren Projekten hilft
quelle