Schwankende Messwerte des LM35-Temperatursensors (+ - 5 ° C) mit Arduino UNO

7

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

Versuchsaufbau

Rao
quelle
3
Ich sehe am LM35 keine Entkopplungskondensatoren (normalerweise 100 nF). Überprüfen Sie das Datenblatt auf Empfehlungen.
Transistor
Ich habe versucht, einen Blick auf das Datenblatt ti.com/lit/ds/symlink/lm35.pdf zu werfen, und Abb. 13 schlägt einen 10-nF-Bypass vor. Meinten Sie so etwas? (NB Ich verstehe Elektronik nicht sehr gut, also bitte mit mir tragen).
1
Ich gebe +1 für Ihre Debugging-Arbeit und die Sorgfalt bei der Vorbereitung dieser Frage.
2
+1 mehr für dasselbe. Sehr gute Frage. Ich würde eine weitere +1 für den Mittelungscode geben, wenn ich könnte. Du bist auf dem richtigen Weg. Ich verwende immer 0,1 uF-Kappen an meinen analogen Eingängen wie diesen. Nicht elektrolytisch. Ich vermeide Keramik, aber Tantal und Glimmer sind in Ordnung. Es kann einen größeren Wert haben, hilft aber nicht viel. Ein bisschen wird helfen. Aber vielleicht ein bisschen mehr als die Aluminiumfolie & Saran Wrap. ;-) (Übrigens, @analogsystemsrf, Sie erinnern mich daran, etwas Ähnliches mit Zeitungen auf dem Couchtisch zu tun. Wenn Sie Audio in die Primärwicklung eines Hi-V-Transformators
einspeisen, wird
@SDsolar ... können Sie erklären, warum Sie Keramik (und nicht elektrolytisch) vermeiden?
Michel Keijzers

Antworten:

1

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. Geben Sie hier die Bildbeschreibung ein

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.

Dorian
quelle
0

Versuchen :-

const int temperaturePin = A0;

void setup() {
  // put your setup code here, to run once:

        Serial.begin(9600);
    }


double getVoltage(int pin)
{

  return (analogRead(pin) * 0.004882814);

    }

void loop() {

      double degree,voltage;
      degree = analogRead(temperaturePin)*0.48875855;
      voltage = getVoltage(temperaturePin);
      Serial.print(voltage);
      Serial.print(degree);
      delay(1000);

    }

quelle
Vielen Dank für die Idee, ich werde es versuchen. Aber können Sie in der Zwischenzeit bitte etwas näher darauf eingehen, wie Sie zu diesen magischen Zahlen 0,004882814 und 0,48875855 gekommen sind? Ich vermute etwas wie 5V / 1024 (aber dies unterscheidet sich bei der letzten Ziffer; Anmerkung 1024 ) bzw. 5V / 1023 * 100 (dies ist mit 1023). Warum verschiedene 1000er?
Computer beginnen zu zählen 0statt 1...
Dandavis
Ich bin mir dessen sehr wohl bewusst, aber warum zählen Sie einmal mit 1023 und ein anderes Mal mit 1024? (Wenn meine Annahmen gültig wären.) Scheint so, als würden Sie einmal "Letzter Artikel ist # 1023" und ein anderes Mal "Wir haben 1024 Artikel" verwenden.
Rao
0

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.

Rob K.
quelle
1
Bei Verwendung von 0 lesen A0 oder 14 von demselben analogen Pin.
gre_gor
0

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:

for (int i = 0; i < 100; i++) 
{
levelSensorValue = levelSensorValue + analogRead(levelSensorPin);
moistureSensorValue = moistureSensorValue + analogRead(moistureSensorPin);
}
levelSensorValue = levelSensorValue / 100;
moistureSensorValue = moistureSensorValue / 100;

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.

farzad latifeh
quelle
0

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

Ich habe das vor einiger Zeit im Arduino-Forum gefunden

KJ
quelle
0

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:

  • Überprüfen Sie noch einmal, ob die Karte selbst über geeignete AVCC / AREF-Entkopplungskappen verfügt. Viele Klonplatinen achten nicht auf Produktionsfehler. Entkopplungskappen werden normalerweise zwischen Masse (GND) und einer positiven Versorgungsleitung (wie VCC) angeschlossen, um Rauschen herauszufiltern.
  • Wenn Sie Zugriff auf den AVCC / AREF-Pin haben, schließen Sie 2 oder 3 parallele 100nf-Kappen zwischen ihnen und Masse an. Die Werte sind nicht kritisch. Alles im Bereich von 10 nF bis 10 uF ist in Ordnung. Sie können für jede Kappe unterschiedliche Werte verwenden.
  • Überprüfen Sie das Rauschen Ihres Eingangsnetzteils. Der USB-Anschluss des Computers ist das vertrauenswürdigste Netzteil. Andere Netzteile (Wandadapter, billige Powerbanks usw.) weisen unvorstellbare Geräusche auf.
  • Verwenden Sie für jede einzelne Komponente oder jeden einzelnen Sensor Kappen (Entkopplungskappen. Die Kappen, die zwischen den Stiften + und - angeschlossen sind). wie LCDs, LM35 Sensor ....
  • Versuchen Sie, den genauen Code und Sensor für andere analoge Pins und, falls vorhanden, einen anderen Arduino zu verwenden. Wenn das Problem besteht, können Sie nach einem anderen LM35 oder dem Code suchen, wie die anderen sagten. Wenn das Problem jedoch nicht bestand, hat das Board ein Problem. Eine fehlerhafte Komponente in der Versorgungsleitung kann dies verursachen. von Reglern zu einem schlechten Gelenk oder einer Leiterplatte über.
Tirdad Sadri Nejad
quelle
Ich bin damit einverstanden, dass die Stromversorgung des USB-Anschlusses eines Computers viel sauberer ist als die eines chinesischen Power Bricks, aber nicht die sauberste. Es gibt verschiedene DC-DC-Module, die eine sehr saubere Leistung liefern. Wenn Sie eine perfekt gleichmäßige Stromversorgung wünschen, können Sie eine chemische Batterie nicht schlagen. Ich entwerfe nie für diese, aber ich benutze sie zur Fehlerbehebung.
Peter Wone
0

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

Geben Sie hier die Bildbeschreibung ein

Asim Merchant
quelle