Temperatur

http://sites.prenninger.com/arduino-uno-r3/temperatur

http://www.linksammlung.info/

http://www.schaltungen.at/

                                                                                             Wels, am 2015-01-28

BITTE nützen Sie doch rechts OBEN das Suchfeld  [                                                              ] [ Diese Site durchsuchen]

DIN A3 oder DIN A4 quer ausdrucken
**********************************************************************************
DIN A4  ausdrucken
*********************************************************

Temperatur messen - Darf's auch genauer sein ?!


704_d_fritz-x_Temperatur-Messung mit dem ARDUINO UNO § LM335 LM336 uA741_2a.pdf

Bereits ein LM35 mit der ATmega328p und der  internen 1,1V Referenz mißt im Range 0° bis 110°C genauer und hat eine größere Auflösung als die vorgestellte Schaltung/Sketch.
Der DS18B20 gibt den Temperaturwert  in 12-bit Genauigkeit digital aus - der kümmert sich um das Thema Referenzspannung so ganz nebenbei auch.


Eine simple Schaltung mit nur wenigen Bauteilen, die dennoch  genau ist, immerhin 1/8 Grad Auflösung am Analog-Eingang eines ARDUINO UNO.
Wenn man für alle Bauteile samt einer kleinen Vero-Board-Platte € 10,00 ausgibt, war's schon teuer.
Messbereich In 0,125V Schritten. Weit unter 0°C bis knapp über 100°C - das sollte für viele Fälle reichen.

Schaltungsbeschreibung:
Alle Bauteile sind gängig und sowohl in bedrahteter Form wie auch in SMD erhältlich.
Die Widerstände entsprechen der E12 Reihe 0,25W 2% Metallschicht
R1 und R3 bzw. R2 und R4 sollten schon 1% Toleranz haben oder besser für max. Genauigkeit auf gleiche Werte ausgemessen sein.
R4 und R5 sind unkritisch, der min. Strom durch die Referenzen sollte > 1mA sein.
P1 und P2 sollten Mehrgang-Cermet-Trimmer für präzise Einstellung sein. (Kann man auch weglassen, s. u.)
D3 und D4 sind irgendwelche Standard-Kleinleistungsdioden (z.B. 1N4148)
Auch der OpAmp ist unkritisch. Kann ein einfacher uA741 sein oder auch ein Doppel-OP.

Der LM335 ist von Haus aus ein hochpräziser, kalibrierbarer Temperatur-Sensor mit einer Spannngsdifferenz von 10mV/K.
Bei einem Strom von min. 1mA wird damit bei 25°C eine Spannung von 2,982V stabil erzeugt. (einstellbar)
Der LM336 ist von Haus aus eine hochstabile Zener-Referenz-Diode mit einer Spannung von 2,490V bei 25°C. (einstellbar)

Wer es nicht so genau braucht, kann auch P1, P2 und D3, D4 weglassen.
Die "Einstell-Beinchen" vom LM335 LM336 bleiben dann n.c. / frei / offen.

Wer selber rechnen möchte bei anderen Betriebs- und Ausgangsspannungen / erforderlicher Auflösung:

R5, R6 = (Ub - Uzener) / > 1mA

R1 = R3, R2 = R4
Vout = R2 / R1 x (V2 - V1)

Der Arduino sampelt an seinen Analog-Eingängen mit 10bit - also eine Auflösung bei max. 5V / 1023 = 4,887586mV / Schritt. (theorethisch)
Wer nun mit anderer Einstellung und / oder Verstärkung auf andere Ausgangsspannungen kommt, rechnet einfach:

Wert (Sample-Wert / Roh-Wert) = Vout / 5V x 1023

Den Temperatur-Sensor LM335 kann man natürlich auch über ein längeres Kabel anschließen.
Die Leitung sollte dann ein 2-poliges geschirmtes Kabel sein, um Störungen auf langen Leitungen zu vermeiden.
Als Stecker kommen z.B. 2,5mm Stereo-Klinken in Betracht.


#include <Streaming.h>

//
var's für Sammeln durchschnittliche Analogwert
#define MINANALOGREADSEQUENCE 25  
//
!!! dies ist eine ähnliche Verzögerung in ms für die wiederholte Verwendung von analogRead
//
Ein Wert von 25 Ergebnisse in max. 40 Proben / Sekunde
//
Anstieg (bis zu 100?) Wird die CPU-Auslastung in der Schleife zu verringern !!
int  time2sample     = 0;   //
0 (oder <= 333, siehe bleow) = Aus, kein Lesen
byte analogReadPin   = 0;   //
Die gewünschte Stift
byte nvalreaded      = 0;   //
Normalerweise nur zur internen Verwendung
long analogval       = 0;   //
Die der Mittelwert mindestens
long millis_lastval  = 0;   //
Normalerweise nur zur internen Verwendung



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

// Zur Überprüfung gültiger Tastendruck verwendet und
// Zum Sammeln durchschnittliche Analogwert
long millis_act;



void loop()
{

   // ... Bewerten Serien für Befehle / Werte
   // ... Etwas anderes tun in der Schleife ...

 millis_act = millis();
 

   // Sammeln eine durchschnittliche Analogwert für einen definierten Zeit
   // Set "time2sample" auf 0 (oder <333) stoppt Lesen von Werten

  if (time2sample > 333)                
// 333 nur auf den Monitor von zu viel am Laufen zu halten
  { if (nvalreaded == 0) millis_lastval = millis_act;         //
Zeit erinnern
    if ((millis_lastval + nvalreaded * MINANALOGREADSEQUENCE) <= millis_act)
   { analogval = analogval + analogRead(analogReadPin);      //
In den Wert
      nvalreaded++;                                           //
Erinnern Anzahl der Hinzufügungen
    }
   if ((nvalreaded * MINANALOGREADSEQUENCE) >= time2sample)  //
Time zu bewerten?
    { analogval = analogval / nvalreaded + 0.5;               //
Calc Durchschnittswert (0,5 für Rund up)

// ---> Hier haben wir die Durchschnittsergebnis!

      Serial << "Analog-value on Pin " << analogReadPin << " - Average value: " << analogval << " for " << millis_act - millis_lastval << " ms from " << nvalreaded << " values" << endl;
     // ---> use "analogval" for your intended purpose
     nvalreaded = 0;             //
Den Zähler zurückzusetzen .... wir wieder beginnen
      analogval  = 0;             //
Nicht vergessen, um den Wert zu löschen! Es wird dort neues Ergebnis!
    }    
 }

 //
... Etwas anderes tun in der Schleife
}

/*
Anwendung:
Je nach dem, wer was wie macht,
- analogReadPin übergeben (oder fest setzen)
- time2sample dito (0 oder <= 333 macht keine Prüfung)
-> analogval auslesen.

Das funktioniert hier bei mir ganz ausgezeichnet und bringt stabile (Mittel-) Werte ohne "Gezappel" !
Die vorgegebene Sample-Zeit ist dann auch die für Rückgabezyklen.
Oder nur einmal lesen und dann time2sample wieder auf 0 setzen.

Da blockiert kein Delay und es bleibt Zeit genug für anderes in der Loop.
Ist auch nicht zeitkritisch.
*/



Anwendung:
Je nach dem, wer was wie macht,
- analogReadPin übergeben (oder fest setzen)
- time2sample dito (0 oder <= 333 macht keine Prüfung)
-> analogval auslesen.

Das funktioniert hier bei mir ganz ausgezeichnet und bringt stabile (Mittel-) Werte ohne "Gezappel" !
Die vorgegebene Sample-Zeit ist dann auch die für Rückgabezyklen.
Oder nur einmal lesen und dann time2sample wieder auf 0 setzen.

Da blockiert kein Delay und es bleibt Zeit genug für anderes in der Loop. Ist auch nicht Zeitkritisch.


Die Referenz des AD-Wandlers im Arduino ist die Ub = 5V  die aber in den seltensten Fällen auch 5,0V entsprechen.
Bei einem Steckernetzteil ist das noch wahrscheinlicher, als an einem USB Anschluß.
Ich habe einen LM35 verwendet und weil mir dessen Messwerte etwas "spanisch" vorkamen, habe ich die Ub gemessen.
Bei mir 4,86V. Kann man in der Formel wieder rausrechnen lassen 
Ist aber nicht Sinn der Sache, wenn man dann per Software zu calibrieren anfängt.
Laß doch den OPV weg und lege die Referenzspannung an einen weiteren Analogeingang des Arduino.
Außerdem kann ein 1µF Folienkondensator zwischen Vss OP und dem "Mittelbein" nicht schaden.
Sonst messe ich auf einer 2m Leitung alles Mögliche, nur keine stabile Temperatur.
Deswegen bin ich auf einen DS18B20 ausgewichen.
Der kostet ca.€ 2,00, ist genauso präzise und liefert mir ein digitales Signal.
Außerdem kann ich auf einen pin mehrere Sensoren parallel auslesen lassen, da jeder eine eigne ID hat.



http://forum.arduino.cc/index.php/topic,181573.0.html






DIN A4 ausdrucken
*********************************************************

Impressum: Fritz Prenninger, Haidestr. 11A, A-4600 Wels, Ober-Österreich, mailto:schaltungen@schaltungen.at
ENDE









Comments