AREF und analogReference(EXTERNAL) funktionieren nicht mit Temperatursensor

Ich bin mal diesem Tutorial gefolgt https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor

Oberer Code ohne AREF funktioniert wunderbar. Der Temperatursensor reagiert auf Wärme.

Schließe ich jetzt AREF mit 3.3V und aktualisere den Code (unterer Code) wie im Tutorial beschrieben, so kommen ziemlich unsinnige Temperaturwerte raus. Volts zeigt immer auf etwa 1.3 (sollte bei etwa 0.25 im Zimmertemperatur sein) und die reagieren nicht darauf wenn ich den Temperatursensor erwärme.

Woran kann es liegen? Ist aref-Funktion kaputt ?

Ich hab auf zwei verschiedenen Arduino UNO getestet, beidem das gleiche Ergebnis.

Du kannst die Spannungen mit einem Voltmeter kontrollieren. AREF müßte dann 3,3V sein, und der Sensor müßte eine Spannung abhängig von der Temperatur liefern, so wie sie auch auf dem Monitor angezeigt wird.

DrDiettrich: Du kannst die Spannungen mit einem Voltmeter kontrollieren. AREF müßte dann 3,3V sein, und der Sensor müßte eine Spannung abhängig von der Temperatur liefern, so wie sie auch auf dem Monitor angezeigt wird.

Normal zeigt AREF eine Spannung von 5V Wenn dieser Befehl analogReference(EXTERNAL); ausgeführt wird, dann zeigt er die auf Spannung 0V. Kann das richtig sein?

EDIT: Ich glaub ich habs. Analog Pin im zweiten Code ist 1 statt 0. peinlich ^^

Trotzdem kommen störhafte Werte raus wenn ich einen komplexeren Code nehm, wie diese hier z.B.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

// A simple data logger for the Arduino analog pins

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL  1000 // mills between entries (reduce to take more/faster data)

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to 
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

#define ECHO_TO_SERIAL   0 // echo data to serial port
#define WAIT_TO_START    0 // Wait for serial input in setup()

// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3

// The analog pins that connect to the sensors
#define photocellPin 0           // analog 0
#define tempPin 1                // analog 1
#define BANDGAPREF 14            // special indicator that we want to measure the bandgap

#define aref_voltage 3.3         // we tie 3.3V to ARef and measure it with a multimeter!
#define bandgap_voltage 1.1      // this is not super guaranteed but its not -too- off

RTC_DS1307 RTC; // define the Real Time Clock object

// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 10;

// the logging file
File logfile;

void error(char *str)
{
  Serial.print("error: ");
  Serial.println(str);
  
  // red LED indicates error
  digitalWrite(redLEDpin, HIGH);

  while(1);
}

void setup(void)
{
  Serial.begin(9600);
    Serial.print("inititttt: ");
  Serial.println(analogRead(0));
  Serial.println();
  
  // use debugging LEDs
  pinMode(redLEDpin, OUTPUT);
  pinMode(greenLEDpin, OUTPUT);
  
#if WAIT_TO_START
  Serial.println("Type any character to start");
  while (!Serial.available());
#endif //WAIT_TO_START

  // initialize the SD card
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    error("Card failed, or not present");
  }
  Serial.println("card initialized.");
  
  // create a new file
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i/10 + '0';
    filename[7] = i%10 + '0';
    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE); 
      break;  // leave the loop!
    }
  }
  
  if (! logfile) {
    error("couldnt create file");
  }
  
  Serial.print("Logging to: ");
  Serial.println(filename);

  // connect to RTC
  Wire.begin();  
  if (!RTC.begin()) {
    logfile.println("RTC failed");
#if ECHO_TO_SERIAL
    Serial.println("RTC failed");
#endif  //ECHO_TO_SERIAL
  }
  

  logfile.println("millis,stamp,datetime,light,temp,vcc");    
#if ECHO_TO_SERIAL
  Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL
 
  // If you want to set the aref to something other than 5v
  //analogReference(INTERNAL);
  analogReference(EXTERNAL); 
}

void loop(void)
{
  DateTime now;

  // delay for the amount of time we want between readings
  delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
  
  digitalWrite(greenLEDpin, HIGH);
  
  // log milliseconds since starting
  uint32_t m = millis();
  logfile.print(m);           // milliseconds since start
  logfile.print(", ");    
#if ECHO_TO_SERIAL
  Serial.print(m);         // milliseconds since start
  Serial.print(", ");  
#endif

  // fetch the time
  now = RTC.now();
  // log time
  logfile.print(now.unixtime()); // seconds since 1/1/1970
  logfile.print(", ");
  logfile.print('"');
  logfile.print(now.year(), DEC);
  logfile.print("/");
  logfile.print(now.month(), DEC);
  logfile.print("/");
  logfile.print(now.day(), DEC);
  logfile.print(" ");
  logfile.print(now.hour(), DEC);
  logfile.print(":");
  logfile.print(now.minute(), DEC);
  logfile.print(":");
  logfile.print(now.second(), DEC);
  logfile.print('"');
#if ECHO_TO_SERIAL
  Serial.print(now.unixtime()); // seconds since 1/1/1970
  Serial.print(", ");
  Serial.print('"');
  Serial.print(now.year(), DEC);
  Serial.print("/");
  Serial.print(now.month(), DEC);
  Serial.print("/");
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.print('"');
#endif //ECHO_TO_SERIAL

//  analogRead(photocellPin);
 // delay(10); 
 // int photocellReading = analogRead(photocellPin);  
  
//  analogRead(tempPin); 
 // delay(10);
  int tempReading = analogRead(tempPin);    

  //Serial.println(" ");
  //Serial.println(tempReading);
  
  // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0
  float voltage = tempReading * aref_voltage / 1024;  
  float temperatureC = (voltage - 0.5) * 100+50 ;
  float temperatureF = (temperatureC * 9 / 5) + 32;
  
  Serial.print("T:");              // for labview
  //Serial.print(temperatureC / 9.31);   // for labview
  Serial.print(temperatureC );   // for labview
   
//  logfile.print(", ");    
 // logfile.print(photocellReading);
  logfile.print(", ");    
  logfile.print(temperatureF);
#if ECHO_TO_SERIAL
  Serial.print(", ");   
  Serial.print(photocellReading);
  Serial.print(", ");    
  Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL

  // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
  analogRead(BANDGAPREF); 
  delay(10);
  int refReading = analogRead(BANDGAPREF); 
  float supplyvoltage = (bandgap_voltage * 1024) / refReading; 
  
  logfile.print(", ");
  logfile.print(supplyvoltage);
#if ECHO_TO_SERIAL
  Serial.print(", ");   
  Serial.print(supplyvoltage);
#endif // ECHO_TO_SERIAL

  logfile.println();
#if ECHO_TO_SERIAL
  Serial.println();
#endif // ECHO_TO_SERIAL

  digitalWrite(greenLEDpin, LOW);

  // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
  // which uses a bunch of power and takes time
  if ((millis() - syncTime) < SYNC_INTERVAL) return;
  syncTime = millis();
  
  // blink LED to show we are syncing data to the card & updating FAT!
  digitalWrite(redLEDpin, HIGH);
  logfile.flush();
  digitalWrite(redLEDpin, LOW);
  
}

Kann es sein dass andere Prozesse wie z.B. SD-Card oder Timer Clock die Temperaturwerte stören ?

forgoden: Normal zeigt AREF eine Spannung von 5V Wenn dieser Befehl analogReference(EXTERNAL); ausgeführt wird, dann zeigt er die auf Spannung 0V. Kann das richtig sein?

So sollte das sein. Die interne Spannungsquelle wird abgeschaltet, so daß von außen gefahrlos eine neue Referenzspannung eingespeist werden kann.

EDIT: Ich glaub ich habs. Analog Pin im zweiten Code ist 1 statt 0. peinlich ^^

Typischer Fall von "Kaum macht man's richtig, schon klappt's" ;-)

Setze zwischen Analog Input und Masse noch einen 1 oder 2,2µF Folienkondensator, möglichst keinen Elko. Wenn der Sensor eine längere Zuleitung bekommen soll (alles was 30 cm überschreitet), dann nimm ein geschirmtes Kabel und lege den Schirm auf Arduino Seite auf Masse. Nächster Schritt wäre im Sketch noch eine Mittelwertbildung aus z.B. 50 Messungen. So habe ich mit einem LM35 eine sehr stabile, störunempflindliche Anzeige bei 1,5m Fühlerzuleitung. Trotzdem reagiert die Anzeige noch im 1/10 Sekundenbereich

Ok, habe mir Folienkondensator bestellt und werde die nächsten Tage hier weiter berichten

nix_mehr_frei: Setze zwischen Analog Input und Masse noch einen 1 oder 2,2µF Folienkondensator, möglichst keinen Elko. Wenn der Sensor eine längere Zuleitung bekommen soll (alles was 30 cm überschreitet), dann nimm ein geschirmtes Kabel und lege den Schirm auf Arduino Seite auf Masse. Nächster Schritt wäre im Sketch noch eine Mittelwertbildung aus z.B. 50 Messungen. So habe ich mit einem LM35 eine sehr stabile, störunempflindliche Anzeige bei 1,5m Fühlerzuleitung. Trotzdem reagiert die Anzeige noch im 1/10 Sekundenbereich

Folienkondensator ist jetzt drauf, die Werte schwankten am anfang immer noch, aber dann ist es doch stabilisiert und die Werte sehr korrekt.

Könnte so ein geschirmtes Kabel richtig sein? http://www.ebay.de/itm/Lapp-Kabel-Steuerleitung-Olflex-Classic-110-3x0-5mm-25M-1119003-/262277007503?hash=item3d10ed888f:g:MSkAAOSwpzdWtFVk

Das Bild ist zwar falsch aber es ist ein 3x0,5²