Wassertemperatur schwankt laut LM335

Hallo,

ich messe mit dem LM335 die Wassertemperatur meines Aquariums.
Leider stelle ich immer wieder fest, dass sie mal bei 24.99 und dann bei 25.87 oder auch mal bei 27 Grad misst.
Die Temperatur ist allerdings konstant, ich habe auch mehrfach mit einem analogen Thermometer nachgemessen.

Daher kann ich das nicht nach vollziehen. Ist der LM335 kein guter Temp Sensor?

Hier noch mal mein Code:

void getTemp() {
   if (messungen < 10 && millis() - messungmillis > 10000) {
    sensorValue[messungen] = analogRead(sensorPin);
    messungen++;
    messungmillis=millis();
  }
  else if (messungen == 10) {
    int mittelwert=(sensorValue[0]+sensorValue[1]+sensorValue[2]+sensorValue[3]+sensorValue[4]+sensorValue[5]+sensorValue[6]+sensorValue[7]+sensorValue[8]+sensorValue[9])/10;
    Kelvin = (((float(mittelwert) / 1023) * 5) * 100);
    Celsius = Kelvin - 273.15;
    messungen=0;
    messungmillis=millis();
  }
}

Der sensor als solcher ist laut datenblatt unkalibriert nicht genauer als +-1° oder schlechter, allerdings erklaert das nicht das sprunghafte verhalten.

Schwanken die messwerte auch mit einem multimeter (ohne arduino verbindung). Wurde schon eine anderer ADC port getestet? Schwanken auch messungen der raumtemperatur?

Falls es sich um ein echtes rauschen handeln sollte, hilft es mehr zu mitteln. Bis 65536 passt noch in ein 'unsigned int' hinein.

currymuetze: ... Leider stelle ich immer wieder fest, dass sie mal bei 24.99 und dann bei 25.87 oder auch mal bei 27 Grad misst.

Der Unterschied von 24.99, 25.87 und 27 Grad sind gerade mal 4 digits ( 610, 612 und 614) das ist einfach Meßungenauigkeit des ADC von Arduino gepaart mit leichten Spannungsschwankungen der 5V die als Referenz genommen wurde. Verbesserung der Meßwerte durch eine externe 3,5V Referenz. Aber allzuviel an Genauigkeit und Auflösung bringt das auch nicht.

Ich würde Dir einen LM35 raten ( der mißt 10mV pro grad Celsius) und die interne 1,1V Referenz

Grüße Uwe

Frage: Ich habe auch so einen Temperaturfühler (ich glaube den LM35) und dabei ist mir aufgefallen das der auch schwankte. Google hat dann ergeben das man den Wert lesen soll und nach nem kurzen DELAY nochmal lesen soll. Und diesen Wert dann verwenden. Ich weiß nicht mehr genau was die als Grund genannt hatten ich glaube das sich der Port erst einpegeln muss oder so. Kann das hier auch ein Grund mit sein? oder hat das nur bei mir geholfen?

Denn nachdem ich das eingebaut hatte waren die Werte konstant und im Bereich wo ich sagen würde so kalt war es in meinem Bastelzimmer.

Gruß MueThoS

Hallo Muethos, wie sieht dein code denn aus? Im Grunde mache ich ja ähnliches, ich lese sogar 10mal ab und rechne den Durchschnitt aus. Oder wäre bei mir dann die Zeit dazwischen zu hoch mit 10 Sek? Würd mich mal interessieren Gruß Thorsten

Hi, hab mir jetzt mal den LM 35 DZ geordert. Wenn ich das Datenblatt richtig verstehe ist der Unterschied zwischen LM 35 DZ und CZ dass letztere eine Abweichung von +-0.9° und der DZ eine Abweichung von +-0.4° hat? Dann fahre ich also mit dem DZ besser.

Der 335 wird über ein 10kOhm Poti calibriert, wie mache ich das bei dem LM 35? Wenn ich das richtig lese, wird der ja direkt ohne Widerstände, Potis oder sonstiges an den Arduino angeschlossen: http://www.ladyada.net/learn/sensors/tmp36.html

Gruß

So:

void tempRead(){
  analogRead(tempPin);
  delay(10);
  temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;
}

Mein Display aktualisiert sich im Sekundentakt und deshalb lese ich auch im Sekundentakt aus. Klappt eigentlich super so

Hi, 10ms reichen also aus um den Sensor kurz "aufzuwärmen"? Wie ist das mit der Kalibirerung? Ist der Sensor kalibriert?

currymuetze: Hi, 10ms reichen also aus um den Sensor kurz "aufzuwärmen"?

Sieht so aus :)

currymuetze: Wie ist das mit der Kalibirerung? Ist der Sensor kalibriert?

Hmm, ich dächte das braucht der nicht (LM35) Die angezeigte Temperatur schien jedenfalls zu stimmen.

Gruß Thorsten

Naja, frag auch nur weil der LM 335 über nen Poti kalibriert werden muss was ich eher umständlich finde.
Ok, da bin ich ja mla gespannt, wenn der da ist

Ich habe auch einen LM35cz ALS Temperatursensor nur empfehlen und wenn du den dann ein bisschen filterst hat du dann keine Probleme mehr.

  TEMPact=analogRead(A0);              // Einlesen des aktuellen Loadwertes
  TEMPX=TEMPact*100*0.1;               // Filter neuer Lesewert mit 10% Einfluss  pro Zyklus
  TEMPY=TEMPlast*100*0.9;              // Bewertung alter Lesewert mit 90% Einfluss pro Zyklus 
  TEMPdis=(TEMPX+TEMPY)/100;       // Addition beider Werte 
  TEMPlast=TEMPdis;                       // Der aktuelle Wert wird als letzter Wert gespeichert

Bei den kurzen Zykluszeiten ist die reaktionszeit auf große änderungen sehr schnell. Großer Vorteil bei dieser Sache selbst einer Abweichung bei einemal lesen ist nur 10% auf den Gesamtwert. Damit hast du dann ein Glättung und brauchst keine Mittelwerte extern auszuwerten

currymuetze: Naja, frag auch nur weil der LM 335 über nen Poti kalibriert werden muss was ich eher umständlich finde.

Hallo currymuetze Verwechsle die veschiedenen Fehlerquellen nicht. Bei einer Kalibrierung kannst Du konstante Fehler eliminieren wie zB Exemplarstreuungen. Du kannst durch eine Kalibration aber nicht nichtlinearitäten in der Meßkurve, Einfluß von der Versorgungsspannung auf das Meßergebnis und Fehler bei der Digitalisierung ausgleichen da diese Fehler normalerweise nicht erfassbar sind.

Grüße Uwe.

volvodani:
Ich habe auch einen LM35cz ALS Temperatursensor nur empfehlen und wenn du den dann ein bisschen filterst hat du dann keine Probleme mehr.

  TEMPact=analogRead(A0);              // Einlesen des aktuellen Loadwertes

TEMPX=TEMPact1000.1;               // Filter neuer Lesewert mit 10% Einfluss  pro Zyklus
 TEMPY=TEMPlast1000.9;              // Bewertung alter Lesewert mit 90% Einfluss pro Zyklus
 TEMPdis=(TEMPX+TEMPY)/100;       // Addition beider Werte
 TEMPlast=TEMPdis;                       // Der aktuelle Wert wird als letzter Wert gespeichert




Bei den kurzen Zykluszeiten ist die reaktionszeit auf große änderungen sehr schnell. Großer Vorteil bei dieser Sache selbst einer Abweichung bei einemal lesen ist nur 10% auf den Gesamtwert. Damit hast du dann ein Glättung und brauchst keine Mittelwerte extern auszuwerten

Hi volvodani,
liest du den wert dann durchgängig aus oder nur in regelmäßigen abständen?
Tempdis wird dann vermutlich als Temperatur ausgegeben richtig?

Bringt es was, wenn ich die 3.3v Referenz des Arduino nutze? siehe hier am ende:
http://www.ladyada.net/learn/sensors/tmp36.html

gruß

Wie sieht denn das Spektrum der Schwankungen aus? Sample das mal über einen längeren Zeitraum und schick das durch eine FFT. Das sollte einen Hinweis auf die Ursache der Schwankungen geben.

currymuetze: Bringt es was, wenn ich die 3.3v Referenz des Arduino nutze? ...

Ja, beim LM335. Vref = 3,3V sind ca max 58Grad. Beim LM35 ist Vref 1,1V besser (interne Referenz) In beiden Fällen erhöhst Du die Auflösung. Grüße Uwe

Wie kann ich denn die 1.1Vref nutzen? Ich habe doch nur einen 3.3v und einen 5V Ausgang. Muss ich da einen Widerstand zwischen setzen? Gruß //EDIT schon gefunden:

void setup()
{
analogReference(INTERNAL);
}

Wie muss ich das verstehen? Wird dann die 5V Stromversorgung auf 1.1V geändert? Was mach ich denn, wenn ich die 5V Spannnung für andere Bauteile benötige?

//EDIT2 schon klar...reden ja von analog In und nicht Out. Trotzdem, welche Auswirkung hat das auf andere Sensoren?

Der ATmega hat eine interne 1,1V Referenz. http://arduino.cc/en/Reference/AnalogReference

Die Referenzspannung sagt aus, welche Spannung den Wert 1023 darstellt.

Wenn Du eine Referenzspannung einstellst, dann gilt die für alle analogen Eingänge. Wenn Du eine höhere Spannung messen willst mußt Du sie mit einem Spannungteiler absenken (ist einfacher als die kleine Spannung zu verstärken).

Grüße Uwe

Hallo, hat die Länge des Kabels oder der Queryschnitt etwas mit der Qualität der Tewmperaturgenauigkeit zu tun? Wenn ich den Sensor auf ein Breadboard stecke und dann mit den kleinen Steckkabeln an den Arduino anschließe, dann passt didRemperatur. Wenn ich dann den Sensor an meine Steuerung anschließe, sprich an eine ca 1.5m lange Leitung mit Stecker/Kupplung dazwischen kommt nur noch Blödsinn an´..... Was sagt ihr?

currymuetze: Hallo, hat die Länge des Kabels oder der Queryschnitt etwas mit der Qualität der Tewmperaturgenauigkeit zu tun? Wenn ich den Sensor auf ein Breadboard stecke und dann mit den kleinen Steckkabeln an den Arduino anschließe, dann passt didRemperatur. Wenn ich dann den Sensor an meine Steuerung anschließe, sprich an eine ca 1.5m lange Leitung mit Stecker/Kupplung dazwischen kommt nur noch Blödsinn an´..... Was sagt ihr?

1,5m Kabel müßte kein Problem sein. Hast Du alles gut verlötet und die Steckverbindung macht gut Kontakt?

Grüße Uwe

Die Leitungen sollten auch verdrillt ( verflochten ) sein.
Vielleicht lag currymuetze’s Problem daran.
Gut ist auch Telefon-Kabel mit Abschirmung, wobei die Abschirmung dann einseitig NUR an die Arduino-Masse gehört.
Ich habe 4 Aquarien, alle mit LM35-Sensor.

Angeschlossen sind die allerdings an einem Board von Elektor mit BASIC http://www.elektor.de/jahrgang/2001/februar/mcs-basic-52-1-3.59382.lynkx
( Oh, schon 10 Jahre alt. :astonished: )

Jedenfalls ist die längste Leitung zum Ostfenster ( mein Garnelen-Becken ) ca. 6 m lang, und besteht aus oben erwähntem Telefonkabel.
Wenn ich eine der anderen 3 Leitungen in die Nähe meines Trafos für die Bodenheizung brachte ( 50 VA ), sprangen die Werte auch wild durcheinander.
Auch die Drosseln der LS-Röhren sind solche Fehler-Quellen.
Auf Nachkommastellen habe ich verzichtet.

Und noch ein Code von Earthshine zur Mittelwert-Bildung ( ziemlich kurz: 20 mal den selben Analog-Wert in eine Variable addieren, und dann durch 20 teilen ):

int LM35 = 0;
void loop() {
int span = 20;
int aRead = 0;
for (int i = 0; i < span; i++) {
aRead = aRead+analogRead(LM35);
}
aRead = aRead / 20;