Temperatuur sensor omrekenen naar graden Celsius

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor Koepel » 18 Aug 2016, 01:51

Eindelijk gevonden, een online berekening van de A,B,C waarden als je een paar punten invult : http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
Als ik verschillende punten probeer, dan veranderen de waarden voor A, B, C iets.
De punten voor 0, 100 en 250 graden lijken de beste punten. Dan zijn de waarden A = 0.6742E-3, B = 2.030E-4, C = 0.9711E-7. Dan is de weerstand bij 25 graden 210k, dus is het een 210k NTC type, dat is goed mogelijk. De ß waarde is echter 4133K, terwijl de ET-73 datasheet 3500K zegt. Vervolgens ging ik op zoek naar de ß waarde van 210k NTC weerstanden, en het blijkt mogelijk te zijn dat de waarde zoveel afwijkt.

Dus uiteindelijk valt het wel mee. Als je metingen correct zijn, dan heb je in plaats van een 200k NTC met ß = 3500K een iets andere NTC van 210k met een ß = 4133K. Als je metingen iets afwijken dan valt jouw NTC binnen de tolerantie van een echte ET-73.

Advertisement

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor DeDraak » 18 Aug 2016, 12:06

Ik heb met 2 dezelfde thermistors de meting gedaan, 1 met het display eraan zodat ik de temperatuur uit kon lezen en op die andere mijn Ohmmeter.
Dus de waardes die ik gepost heb zijn vrij nauwkeurig.

Ik heb nu eigenlijk geen idee hoe ik dit nu in mijn sketch moet gaan zetten, kun jij mij daarmee helpen?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor Koepel » 18 Aug 2016, 21:01

Hoe weet je dat de temperatuur probe met het display wel nauwkeurig is. Misschien wijkt die wel 50 graden af.
Nul en 100 graden is met gedestileerd water op zeehoogte (nul NAP) met ijswater en kokend water. Dat zijn ijkpunten. Een DS18B20 temperatuursensor is ook goed, die gaat tot 120 graden dacht ik.

Dan wordt het voor mij droogzwemmen. Een werkende sketch maken, zonder een NTC. Ik zal het proberen.

Wil je de weerstanden van 17k en 550k blijven gebruiken ? Waarom zijn die waarden eigenlijk zo vreemd ? 18k en 560k zijn normale standaard waarden. Kun je een foto van die weerstanden maken ? Als je multimeter die waarden heeft gemeten, dan klopt je multimeter misschien niet.
Twee weerstanden gebruiken doe ik ook om een LDR een groter bereik te geven. Het blijkt in de praktijk niet nodig om een derde toe te voegen, omdat ook het gemiddelde van die twee gebruikt kan worden. Een derde weerstand daartussen is dus niet nodig.
Afbeelding

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor DeDraak » 18 Aug 2016, 21:52

Ik heb een orginele foodprove gebruikt en er naast gelegd, zo ben ik aan die gegevens gekomen.
Ook heb ik water gekookt en een keer in ijswater gehad, 0 graden!
Dus ik ben wel overtuigd van deze weerstand waardes.

Die 2 weerstanden heb ik gebruikt voor het vervangen van de probe (vaste temperatuur) om te kijken of die dan de juiste waarde aan gaf met die andere sketch, dat werkte dus niet dus die kunnen wat mij betreft vergeten worden.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor Koepel » 18 Aug 2016, 23:32

Gekookt water en ijswater 8-) cool.

Wat is dan de waarde van die serieweerstand? Nog steeds de 22k ?
Ik was intussen aan de slag gegaan met die twee weerstanden. Dat is misschien niet zo'n slecht idee, omdat de ADC waarde soms erg dicht tegen de 0 of de 1023 zit, en veel nauwkeurigheid blijft er dan niet over.

Hieronder staat de code. Jouw meetwaarden staan in een tabel. Eerst wordt de tabel nagerekent, dan kun je kijken of de temperatuur in de buurt komt van wat jij gemeten hebt. Daarna wordt de echt temperatuurProbe gemeten, maar ik weet dus niet of dat werkt, en ook heeft de sketch de juiste serieweerstand nodig.

De nauwkeurigheid van de Steinhart-Hart is niet zozeer de berekening, maar de waarden voor A, B, en C, die de website berekende.

Een soort van multi-map, door zelf iets passend op te zoeken in de tabel, dat heb ik niet gedaan.

Is de sketch te volgen ? Ik heb het zomaar in elkaar geflanst.
Code: Alles selecteren
// A sketch for a ET73
//
// august 2016, by Koepel
//
// For: http://arduinoforum.nl/viewtopic.php?f=25&t=1958
//
// Tested with Arduino Uno and Arduino.cc IDE 1.6.11
//


// Measured values
const float measured_T[] =
  { 0,      20,     40,     60,    80,    100,   120,    140,    160,     180,     200,    220, 240, 250 };
const float measured_R[] =
  { 750E+3, 300E+3, 120E+3, 52E+3, 25E+3, 13E+3, 7.5E+3, 4.1E+3, 2.48E+3, 1.56E+3, 1.0E+3, 680, 480, 400 };


// Using: http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
// With the measured values at 0, 100, 250 degrees:
//    A = 0.6742E-3, B = 2.030E-4, C = 0.9711E-7, beta = 4133K
const float A = 0.6742E-3;
const float B = 2.030E-4;
const float C = 0.9711E-7;
const float beta = 4133.22;   // This is the 'beta', not the 'B'.

// The resistance at 25 degrees is also taken from that thinksrs page.
const float ntc_nominal_T = 25.0;
const float ntc_nominal_R = 210876.87;

// Pins
const int probePin = A0;
const int R_seriesPin[] = { 2, 3 };

// Values for the two resistors
const float R_series[] = { 17E+3, 550E+3 };            // 17k, 550k


void setup()
{
  Serial.begin( 9600);
 
  Serial.println();
  Serial.println(F( "\nET-73"));
  Serial.println(F( "-------"));

  // Set the first series resistor to 5V, disable the other series resistor.
  setResistor( 0);


  // Calculate the ADC value, and calculate the temperature to see if it matches the table.
  for( int j=0; j<2; j++)
  {
    float series_resistor = R_series[j];
   
    Serial.print(F( "Using series resistor of : "));
    Serial.print( series_resistor);
    Serial.println(F( " Ohm"));
    for( int i=0; i<sizeof(measured_T) / sizeof(float); i++)
    {
      Serial.print(F( "T = "));
      Serial.print( measured_T[i]);
      Serial.print(F( ", R = "));
      Serial.print( measured_R[i]);
 
      // Calculate what the ADC value would be with this resistor value.
      int adc = int( measured_R[i] / (measured_R[i] + series_resistor) * 1023.0);
 
      Serial.print(F( ", Simple = "));
      Serial.print( SimpleBeta( series_resistor, adc));
      Serial.print(F( ", Stein = "));
      Serial.print( SteinhartHart( series_resistor, adc));
 
      if( adc < 2 || adc > 1021)
        Serial.print(F( "  out of range"));
 
      Serial.println();
    }
    Serial.println();
  }
}

void loop()
{
  // Measure the real temperature.
 
  for( int j=0; j<2; j++)
  {
    setResistor( j);

    // Add a delay, to make analog value stable ?
    delay( 100);

    // no average at the moment
    int rawADC = analogRead( probePin);
   
    float series_resistor = R_series[j];
   
    Serial.print(F( "With series resistor "));
    Serial.print( series_resistor);

    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( series_resistor, rawADC));
    Serial.print(F( ", Stein = "));
    Serial.print( SteinhartHart( series_resistor, rawADC));
 
    if( rawADC < 2 || rawADC > 1021)
      Serial.print(F( "  out of range"));

    Serial.println();
  }
  Serial.println();
  delay( 5000);
}


// Set the 5V to one of the resistors. Disable the other one.
void setResistor( int index)
{
  pinMode( R_seriesPin[index], OUTPUT);
  digitalWrite( R_seriesPin[index], HIGH);

  int other = index == 0 ? 1 : 0;
  pinMode( R_seriesPin[other], INPUT);     // disable it, by making it high impedance.
}


// Calculation as shown at https://learn.adafruit.com/thermistor/using-a-thermistor
// And here : https://en.wikipedia.org/wiki/Thermistor
// The simplified Beta parameter equation is used.
//
// The voltage at the pin is (rawADC + 0.5) * Vcc / 1024.
// Therefor I use "1024" instead of the "1023" in the Adafruit page.
//
float SimpleBeta( float series_R, int rawADC)
{
  float r  = series_R / ((1024.0 / (float) rawADC) - 1.0);

  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( r / ntc_nominal_R) / beta);
  t1 = (1.0 / t1) - 273.15;

  return( t1);
}


// Calculation with Steinhart-Hart
// This calculation does not use the simplified Beta,
// but the A, B, C numbers.
// The function "log()" in 'c' or 'c++' is the natural logarithm.
float SteinhartHart( float series_R, int rawADC)
{
  float r = series_R / ((1024.0 / (float) rawADC) - 1.0);
 
  float t3 = C * log( r) * log( r) * log( r);
  float t4 = A + (B * log( r)) + t3;
  return( (1.0 / t4) - 273.15);
}

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor DeDraak » 19 Aug 2016, 09:53

Ik gebruik nog steeds die 22k serie weerstand inderdaad.

Ik ben nu even met verlof, volgende week ga ik het eens proberen.
Bedank alvast!!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor Koepel » 19 Aug 2016, 10:41

Bij 22k en 0 graden is de ADC waarde 993.
Bij 22k en 250 graden is de ADC waarde 18.
Dit is vrij dicht bij de grenzen, maar er rolt toch nog een redelijk nauwkeurige temperatuur uit voor allebei.
Dus als je range van 0 tot 250 graden is, dan is de 22k helemaal perfect.

Met 22k kun je van -30 tot 350 graden met nog redelijk nauwkeurigheid meten.
Bij -40 en 400 graden is de nauwkeurigheid helemaal verdwenen, omdat de adc waarden dan 1021 en 2 zijn.

Kun je zelf de sketch aanpassen ? Als je iets aanpast en je hebt een vraag, dan graag de hele sketch laten zien.
Zeg het maar als je wilt dat ik iets maak om het gemiddelde van een aantal samples te nemen.

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor DeDraak » 31 Aug 2016, 13:52

Hallo Koepel,

Ik heb hem zojuist getest en hij werkt goed!!
Ik wel de versie geprobeerd met de 2 weerstanden, ik heb geprobeerd om alleen de 22k weerstand te gebruiken maar dit is me niet gelukt.
Ik zou het liefste met 1 weerstand willen werken om ingangen te sparen..

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor Koepel » 31 Aug 2016, 20:40

Ik ben benieuwd wat er niet gelukt is.

De sketch heb intussen gemaakt voor 22k en meteen wat gewijzigd.
In setup() wordt nog steeds je tabel herberekend met de twee methodes. De Steinhart-Hart is duidelijk beter, maar daar is die functie dan ook voor bedoeld :lol:
Je kunt de hele for-loop in setup() er uit halen.

In de loop() wordt de NTC gelezen. Ik kon geen 210k NTC vinden, maar wel een 100k NTC. Het gemiddelde van 20 samples bleek duidelijk een meer stabiele temperatuur op te leveren.

Code: Alles selecteren
// A sketch for a ET73
//
// 18 august 2016, by Koepel, Public Domain / WTFPL license.
//    Version 1.0, first version for two possible series resistors.
//    For: http://arduinoforum.nl/viewtopic.php?f=25&t=1958
//    Tested with Arduino Uno and Arduino.cc IDE 1.6.11
// 31 august 2016
//    Version 2.0, just one 22k series resistor. Added averaging.
//    Resistor of 22k to 5V and A0, probe to GND and A0.
//    Not using the 3.3V and not using AREF.
//
//
//
//

// Calculate the resistance of the NTC thermistor.
// -----------------------------------------------
// With a 5V Arduino board, the voltage at a pin is:
//    V = ( adc + 0.5 ) / 1024 * 5V
// Half a bit is added, because the ADC goes to the next step if the voltage is at the next step.
// The average voltage is in the middle of that step.
// There are 1024 steps, so it must be divided by 1024 and not 1023.
// This means that an analog input can never measure exactly 5.0V, and that is indeed
// how the ADC works, because 5.0V would be the 1025-th step.
//
// When a series resistor is connected to 5V, and the NTC to GND, it is:
//   V = Rntc / (Rntc + Rseries) * 5V
// Combining them together:
//   ( adc + 0.5 ) / 1024 * 5V = Rntc / (Rntc + Rseries) * 5V
//   Rntc = Rseries / ((1024 / (adc + 0.5)) - 1)
//   


// Measured values
const float measured_T[] =
  { 0,      20,     40,     60,    80,    100,   120,    140,    160,     180,     200,    220, 240, 250 };
const float measured_R[] =
  { 750E+3, 300E+3, 120E+3, 52E+3, 25E+3, 13E+3, 7.5E+3, 4.1E+3, 2.48E+3, 1.56E+3, 1.0E+3, 680, 480, 400 };


// Using: http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm
// With the measured values at 0, 100, 250 degrees:
//    A = 0.6742E-3, B = 2.030E-4, C = 0.9711E-7, beta = 4133K
const float A = 0.6742E-3;
const float B = 2.030E-4;
const float C = 0.9711E-7;
const float beta = 4133.22;   // This is the 'beta', not the 'B'.

// The resistance at 25 degrees is also taken from that thinksrs page.
const float ntc_nominal_T = 25.0;
const float ntc_nominal_R = 210876.87;        // It is probably a 210k NTC resistor

// Pins
const int probePin = A0;

// Values for the series resistor to 5V
const float series_resistor = 22E+3;      // 22k


void setup()
{
  Serial.begin( 9600);
 
  Serial.println();
  Serial.println(F( "\nET-73"));
  Serial.println(F( "-------"));

  for( int i=0; i<sizeof(measured_T) / sizeof(float); i++)
  {
    Serial.print(F( "T = "));
    Serial.print( measured_T[i]);
    Serial.print(F( ", R = "));
    Serial.print( measured_R[i]);

    // Calculate what the ADC value would be with this resistor value.
    // Simulate the ADC, by rounding to lower integer with floor().
    float adc = floor( measured_R[i] / (measured_R[i] + series_resistor) * 1024.0);

    // Calculate the resistance value of the NTC thermistor
    float r  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);
   
    Serial.print(F( ", Simple = "));
    Serial.print( SimpleBeta( r));
    Serial.print(F( ", Stein = "));
    Serial.print( SteinhartHart( r));

    if( adc < 2 || adc > 1021)
      Serial.print(F( "  out of range"));

    Serial.println();
  }
  Serial.println();
}


void loop()
{
  // Measure the real temperature.
 
   

  // Calculate the resistance value of the NTC thermistor
  float adc = getADC( probePin);
  float r  = series_resistor / ((1024.0 / (adc + 0.5)) - 1.0);

  Serial.print(F( "R = "));
  Serial.print( r);
  Serial.print(F( ", Simple = "));
  Serial.print( SimpleBeta( r));
  Serial.print(F( ", Stein = "));
  Serial.print( SteinhartHart( r));
 
  if( adc < 2.0 || adc > 1021.0)
    Serial.print(F( "  out of range"));

  Serial.println();

 
  delay( 5000);
}


// getADC
// ------
// This function returns the adc value as a float.
// It is ment for the ATmega chips with 10-bits ADC.
// Because the average is used, a little noise could increase
// the number of bits. Therefor a float number is returned.
//
float getADC( int pin)
{
  // About 60 samples fit into a unsigned int.
  // Therefor the 'n' should be not above 60.
  int n = 20;                      // maximum 60
  unsigned int total = 0;         
  for( int i=0; i<n; i++)         
  {
    total += analogRead( pin);
  }
  float adc = (float) total / (float) n;
  return( adc);
}


// SimpleBeta
// ----------
// Calculate the temperature of a NTC thermistor.
// Calculation as shown at https://learn.adafruit.com/thermistor/using-a-thermistor
// And here : https://en.wikipedia.org/wiki/Thermistor
// The simplified Beta parameter equation is used.
//
// The voltage at the pin is (rawADC + 0.5) * Vcc / 1024.
// Therefor I use "1024" instead of the "1023" in the Adafruit page.
//
float SimpleBeta( float r)
{
  float t1 = (1.0 / (ntc_nominal_T + 273.15)) + (log( r / ntc_nominal_R) / beta);
  return( (1.0 / t1) - 273.15);
}


// SteinhartHart
// -------------
// Calculation with Steinhart-Hart to get the temperature of a NTC thermistor.
// This calculation does not use the simplified Beta,
// but the A, B, C numbers.
// The function "log()" in 'c' or 'c++' is the natural logarithm.
float SteinhartHart( float r)
{
  float t1 = log( r);
  float t2 = C * t1 * t1 * t1;
  float t3 = A + (B * log( r)) + t2;
  return( (1.0 / t3) - 273.15);
}

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Temperatuur sensor omrekenen naar graden Celsius

Berichtdoor DeDraak » 01 Sep 2016, 10:24

Deze werkt perfect Koepel!

De temperatuur komt perfect overeen met de andere meter die ik heb liggen.
De for-loop heb ik ff even uitgehaald, nu wil ik een 2e et-73 erbij gaan maken.
Ik wil dus 2 verschillende temperaturen tegelijk zien.
Is hier trouwens een Library van te maken?

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten