Temperaturmessung mit dem LM 335 Z Sensor

Hallo zusammen
In meiner Maturaarbeit beschäftige ich mich mit dem Flug eines Wetterballons auf 25'000 Meter. Der Wetterballon wird mit einer Box ausgerüstet, in der sich eine Kamera, GPS, ein Arduino und bis jetzt zwei LM335Z Temperatursensoren (Es kommt noch ein Barometric Pressure Sensor - BMP085 dazu) befinden werden. Das Arduino wird die Kamera Steuern und mit den Sensoren soll die Temperatur auf eine MicroSD-Karte geschrieben werden. Nun bastle ich schon tagelang an einem Code herum, doch ich krieg es nicht hin, dass die richtige Temperatur auf die Karte geschrieben wird.

Mit folgendem Code berechne ich die Millivolt, die der Sensor ausgibt. Doch wie komme ich von diesen auf Grad Celsius?

/*
  SD card datalogger
 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created  24 Nov 2010
 updated 2 Dec 2010
 by Tom Igoe
 
 "This example code is in the public domain."	 
 
 angepasst und übersetzt an Projekt Space Ballon 17.05.2011
 by Dominik Frey
 */
//....................................................................................

#include <SD.h>

const int chipSelect = 3;       // SD Karte ist an Pin 3 angeschlossen


//***************************EINSTELLUNGEN***************************
int sensoren = 1;               // Anzahl Sensoren, die verwendet werden
//*******************************************************************


void setup()
{
//****************************KAMERA AUSGANG***************************
  pinMode(2, OUTPUT);          //  Ausgang für den Kamera Auslöser definieren
  pinMode(1, OUTPUT);
  
//***************************SD-KARTE ÖFFNEN***************************
  Serial.begin(9600);
  Serial.print("Initializing SD card...");                  // Statusinformationen zum Serial Monitor am PC (SD-Karte öffnen)
  
//--------------------------------------------------------------------  
 
  if (!SD.begin(chipSelect))                                // Versuchen, die Karte zu öffnen
  {                             
     Serial.println("card failed, or not present");         // Statusinformationen zum Serial Monitor am PC (Karte öffnen fehlgeschlagen) falls fehlgeschlagen
     return;
  }
  
//--------------------------------------------------------------------  

  Serial.println("card initialized.");                      // Statusinformationen zum Serial Monitor am PC (Karte geöffnet) falls erfolgreich
}
//*********************************************************************


void loop()

//***************SENSOREN LESEN UND AUF KARTE SCHREIBEN****************
{
  String dataString = "";                                  // erstellt einen Sting (Buchstabenfolge), den man auf die SD-Karte speichern kann
  
//--------------------------------------------------------------------  

  for (int analogPin = 0; analogPin < sensoren; analogPin++) // Anzahl Sensoren festlegen mit der Variable "sensoren" aus den EINSTELLUGEN
  { 
    int sensor = analogRead(analogPin);                      // Sensoren lesen (ANALOG)
    int temperatur=(sensor*4.9);                             // Wert 0-1023 in Millivolt umrechnen
    dataString += String(temperatur);                        // gelesene Daten in dataString einfügen
   
  if (analogPin < (sensoren-1)) {                            // schauen ob es noch mehr Sensoren gibt
    dataString += ",";          }                            // Daten der verschiedenen Sensoren trennen durch ein Komma (wenn nötig)
  }

//--------------------------------------------------------------------  

  File dataFile = SD.open("datalog.txt", FILE_WRITE);       // Auf der SD-Karte wird eine TXT-Datei geöffnet oder erstellt falls sie noch nicht vorhanden ist

  if (dataFile)                                             // ausführen sobald die Datei geöffnet ist
  {
    dataFile.println(dataString);                           // den dataString in die Datei hineinschreiben (println)
    dataFile.close();                                       // Datei schliessen

    Serial.println(dataString);                             // Daten auch in den Serial Monitor schreiben zur Überwachung
  }  
  
  
 else {                                                    // falls die Datei nicht geöffnet werden konnte Fehlermeldung in den Serial Monitor schreiben
    Serial.println("error opening datalog.txt");
 }
//************************AUSLÖSEN DER KAMERA**************************
 digitalWrite(2, HIGH);
 delay(300);
 digitalWrite(1,HIGH);
 delay(300);
 digitalWrite(2,LOW);
 digitalWrite(1,LOW);
 delay(15000);
}                                                         
//*********************************************************************

Vielen Dank für die schnelle Antwort!

Gruss Elyptikus

Der LM335 gibt laut Datenblatt 2.98 Volt bei 25°C und Ir=1mA aus. Veränderung pro 10mV = 1K. Rest ist Gehirnschmalz :wink:

Noch ein paar Gedanken zur Nutzung vom LM335: Wireless Sensor Networks or "Look Ma no wire!": LM 335 issues und Alternativen.

markbee

Meine Werte stimmen leider überhaupt nicht mit dem überein. Im Vergleich mit einem genauen Thermometer kam folgendes heraus:

LabPro Arduino

13.8°C 3562 mV

21.7°C 3572 mV

50.1°C 3635 mV

Was mache ich falsch?

Wie ist denn der LM 335 beschaltet?

markbee

P.S.: Das Datenblatt zeigt den "bottom view" für die Pinbelegung, das kann man gerne mal verwechseln.

So habe ich es angeschlossen! Der Pin ganz links vom Sensor ist nicht belegt. Der Widerstand hat einen Wert von 2 kOhm.
Stimmt die Belegung so?

Das sieht gut aus. Sicher mit dem 2kOhm Widerstand? Abgebildet ist imho ein 20k, das wäre dann zu wenig Steuerstrom.

markbee

Ich habe den Widerstand nachgemessen. Es sind 2 kOhm!
Hast du eine Idee was sonst noch das Problem sein könnte?

Vielleicht ist der LM335 einfach kaputt. Hast Du einen anderen, den Du ausprobieren kannst?

markbee

Hallo elyptikus !

Warum nimmst du nicht den LM35 ? Gibt es viele Programmier-Beispiele.

2,50 Euro bei Reichelt.de oder ähnlichen...

MfG