Pages: [1]   Go Down
Author Topic: Temperaturmessung mit NTC nur in Bereich möglich?  (Read 1958 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo!

Ich habe heute eine Temepraturmessung mit meinem Arduino durchgeführt.

Verwendet wurde ein Spannungsteileraufbau mit 10k NTC und 10k Festwiderstand.

Problem: Die Messung funktioniert nur bis 38,x °C! Will sagen, die Temp steigt an, bis sie bei 38,x °C hängen bleibt. Der Fühler hing aber in kochendem Wasser....
Ich möchte damit aber gerne einen Temperaturbereich bis 120°C messen... Das ist so ja kaum möglich....

Kurve vom Temp.-Verlauf und Messergebnisse im Anhang als PDF.

Der Programmcode folgt hier und ist noch mal im Anhang zum Download.

Code:
//VERWENDETE BIBLIOTHEKEN
#include <math.h>

//VARIABLENDEKLARATION
int r1;        //Festwiderstand
int r2;        //Widerstand NTC bei 25grad
int b;         //Fixwert aus Datenblatt
float tempwasser=0;      //gemessene Temperatur Wasser
float summtempwasser=0;  //Summe von 50 gemessenen Temperaturen
float wassertemp=0;      //Ausgabewert, eine Stelle hinter dem Komma
int s=0;                 //Übergabevariable zur Rundung
int i=0;
int j=0;
int k=0;
float tempaussen=0;      //gemessene Temperatur Aussen
float summtempaussen=0;  //Summe von 50 gemessenen Temperaturen
float aussentemp=0;      //Ausgabewert, eine Stelle hinter dem Komma
int zeit=0;

//START
void setup()
{
Serial.begin(9600);    //Serielle Ausgabe initialisieren
}
 
//PROGRAMMABLAUF
void loop ()

{
  
  //Temperatur Wasser berechnen; Analogeingang 1
   r1=10000;            //Festwiderstand mit 4,7k
   r2=10000;            //NTC Temp.-Widerstand mit 4,7k bei 25°C
   b=3950;             //Beiwert zur Berechnung aus Datenblatt vom NTC
  while (i<50)
  {
    tempwasser=(temp(analogRead(1)));          //Hilfsfunktion aufrufen um Temp aus Widerstandsverhältnis zu ermitteln
    summtempwasser=summtempwasser+ tempwasser;  //Summe von 50 Temp-Werten
    i++;    //i inkrementieren    
  }
  wassertemp=(summtempwasser)/50*10;  //Durchschnitt bilden und mit 10 multiplizieren
  s=(int)wassertemp;                  //Kommastellen wegschneiden  
  wassertemp=s;  
  wassertemp=wassertemp/10;           //eine Nachkommastelle
  Serial.print(zeit);
  Serial.print(";");  
  Serial.println(wassertemp-4);              //Temperatur mir einer Kommastelle ausgeben
  i=0;                //i zurücksetzen
  summtempwasser=0;   //Summe zurücksetzen
  delay(1000);
  zeit++;
  }





 
float temp(int rawadc)
// Funktion zur Umrechnung auf Grad Celsius
{
float r_akt; // Aktueller Wiederstand
float temp; //Temporäre Variable
float ergebnis; //
float tn = 25; //Basistemperatur in Grad Celsius
// Widerstand Therm ausrechnen
//Widerstand auf Temperatur umrechnen
tn = tn+273.15; // Basistemperatur auf Kelvin umrechnen
r_akt = ((4.64/(4.64/1023*rawadc))*r1)-r2; //Aktuellen Widerstand ermitteln
temp = b*tn/(b+log10((r_akt/r2))*tn);
temp = (temp - 273.15); //Ergebnis in Grad Celsius umwandeln
ergebnis =temp;
return ergebnis;
}


Wäre super, wenn mir da jemand helfen könnte...

Gruß
Morris


EDIT: bei ±38°C hat der NTC etwa 6,2kΩ Widerstand

* Messung.pdf (23.33 KB - downloaded 50 times.)
* sketch_mar12a.ino (2.25 KB - downloaded 19 times.)
« Last Edit: March 12, 2013, 09:40:12 am by maeckes » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
   r2=10000;            //NTC Temp.-Widerstand mit 4,7k bei 25°C

Du widersprichst Dir hier etwas. Entscheide Dich, ob Du mit Integer oder Floats rechnen willst, bei dem Durcheinander ist es unheimlich schwierig, zu ermitteln, ob nicht vielleicht irgendwo die Nachkommastellen abgeschnitten werden und womöglich ein Integer-Überlauf auftritt.
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 166
Posts: 3202
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kurve vom Temp.-Verlauf und Messergebnisse im Anhang als PDF.

Bei Deinen sogenannten Messergebnissen fehlen die Messergebnisse!

Stattdessen sehe ich nur die Rechenergebnisse für die ausgerechneten Temperaturen.

Die Messergebnisse (ADC Werte am Analogeingang) sehe ich nicht.

Anyway, ich habe mal mit Deinen teils unvollständigen und teils sich widersprechenden Angaben herumgerechnet und mir scheint, Dein Vorwiderstand von 10K ist viel zu hoch bemessen. Nimm mal als Vorwiderstand nur einen 1K Widerstand und passe Deine Berechnung (die ich äußerst unübersichtlich finde, ich kann sie nicht nachvollziehen) dabei entsprechend an!

Ändert sich was?

« Last Edit: March 12, 2013, 12:48:00 pm by jurs » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habe nen üblen Fehler irgendwo in der Rechnung.

Habe eben mal alles neu aufgestellt und da funktioniert alles einwandfrei

Danke Euch für die Hilfe! Echt Klasse, dass sofort jemand antwortet !!!
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es wäre toll, wenn Du Dein Ergebnis hier voerstellen könntest. Dann können andere die ein ähnliches Problem haben davon lernen.
Ich weiss, es ist Arbeit, aber eine gute Gelegenheit etwas von dem Feedback das man für das eigene Problem bekommen hat, zurück zu geben.
Mario.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Klar kein Thema!
Freue mich ja auch immer über jeden Sketch, den ich finde und verwenden kann.

Code:
#include <math.h>

const float referenceVolts = 5.0;  // Referenzspannung eines 5-Volt-Boards
float time = 0;

void setup()
{Serial.begin(9600);
}

void loop()
{
   int val = analogRead(1);  // Wert vom Sensor einlesen

   float volts = (val / 1023.0) * referenceVolts;  // Verh‰ltnis berechnen
 
   //Widerstand ausgeben
   float widerstand = ((10000*referenceVolts)/volts)-10000;  //berechnet den Widerstandswert vom NTC
   
   //Zeit ausgeben
   Serial.print(time); 
   Serial.print(";");   
 

   //Variablen zur Temp.-Berechnung
   int b=3435;  //Beiwert in Kelvin aus Datenblatt
   int Festwiderstand=10000;   //Festwiderstand bei 25∞C (298,15Kelvin)
   float Nenntemp = 298.15;
   
   //Temperatur berechnen   
   float t = (b*Nenntemp) / (b + (log (widerstand/Festwiderstand)*Nenntemp));
   Serial.println(t-273.15);
   
   delay (500);
   time = time + 0.5;
}
Logged

Pages: [1]   Go Up
Jump to: