Genaues Messen der Temperatur mit Arduino

Ich versuche, einen Thermostat mit Arduino zu bauen. Ich möchte es mit einem Handy-Akku/Ladegerät mit Strom versorgen, wodurch die Systemspannung sehr variabel wird. Im Moment verwende ich Arduino Uno, aber sobald es fertig ist, werde ich es auf Lilypad portieren.

Zuerst habe ich versucht, den Temperatursensor TMP36 zu verwenden. Bisher war es ein kompletter Fehlschlag. Während der Sensor selbst sehr stabil zu sein scheint, kann ich keine Möglichkeit finden, seine Spannung genau zu messen.

Die Verwendung der integrierten 5-V-Referenz für analoge Sensoren funktioniert überhaupt nicht - selbst wenn sie von +5 V des USB-Arduinos gespeist werden, sind es tatsächlich +4,8 V (was die gemessene Temperatur um einige Grad verschiebt). Wenn das Board von der Batterie gespeist wird, fällt die Spannung auf etwa 4 V ab und die gemessene Temperatur steigt sprunghaft an. Ich habe auch versucht, +3,3 V von der Platine als Referenz zu verwenden. Es scheint stabiler zu sein, wenn das Board über USB mit Strom versorgt wird, aber seine Spannung fällt ab, wenn die Batterie leer ist.

Gibt es eine andere Möglichkeit, die Sensorausgangsspannung zuverlässig zu messen?

Für die zweite Stufe plane ich, Thermistoren zu verwenden. Ich habe gerade ein paar dieser 20K-Thermistoren bestellt .

Soweit ich weiß, sollten diese einfacher genau zu messen sein, wenn ich einen Spannungsteiler baue und V_in als Referenzspannung für ADC verwende.

Ein paar Fragen dazu:

  • Ist es sinnvoll, wenige Spannungsteiler mit unterschiedlichem Festwiderstand zu verwenden, um die Genauigkeit zu erhöhen?
  • Ich kann einen programmierbaren Pin als V_in verwenden und die Temperatur mit wenigen verschiedenen Spannungspegeln messen. Es ist mir jedoch nicht klar, ob dies die Genauigkeit tatsächlich erhöht.
Bitte posten Sie Ihren Temperaturumrechnungscode.
Bitte definieren Sie, was Sie mit "genau" meinen. Welche Art von Temperaturauflösung und absoluter Genauigkeit möchten Sie erreichen?
Ich hoffe auf eine Auflösung von etwa 1-2 Grad. Ein absoluter Kalibrierungsfehler von 1-2 Grad sollte auch in Ordnung sein. Soweit ich weiß, ist es relativ einfach, einen Referenzpunkt bei 0 ° C zu erhalten, und ich denke, ich kann durch Kreuzkalibrierung von Sensoren einen zweiten (viel groberen) Punkt bei Raumtemperatur erhalten.
1-2 Grad für Temperaturen im Bereich von 5-25 °C.
@geometrikal Ich habe es gerade nicht zur Hand, aber es ist im Grunde dasselbe wie bei allen anderen: Erste Probe fallen lassen, ein paar Millisekunden warten, ein paar Mal mehr Probe und durchschnittliche Proben. Dann neu skalieren, was Ihrer Meinung nach Ihre Referenzspannung ist.
Verwenden Sie eine interne genaue 1,1-V-Referenz, um entweder die Thermometerspannung oder die Eingangsspannung zu messen.
Wir benötigten Temperatur- und Feuchtigkeitswerte, um das Gerät zu testen. Wir haben unser eigenes Gabelboard, das bei der Durchführung von Tests hilft. Den Selbsttest können Sie hier nachlesen: forktestlab.com/mtah

Antworten (5)

Es scheint, dass Sie sich des Problems mit der Änderung der Referenzspannung bewusst sind, und wenn Sie ein Gerät wie das TMP36 (feste 10 mV / ° C) verwenden, können Sie nichts anderes tun, als eine Spannungsreferenz von einem Chip zu verwenden, um die Dinge zu stabilisieren.

Wenn Sie jedoch ein RTD oder einen Thermistor verwenden, tritt das Problem nicht auf. Ihr ADC führt eine ratiometrische Messung durch - er vergleicht den ADC-Eingang mit seiner Referenzspannung, ABER wenn Sie den RTD oder Thermistor (über einen geeigneten Widerstand) mit derselben Referenzspannung versorgen, wirkt sich dies nicht auf die Messwerte aus. Wenn die Referenz um 10% steigt, steigt auch die Spannung in den ADC.

Ich denke, Sie sollten die Verwendung eines digitalen Temperatursensors wie DS18B20 / DS18S20 in Betracht ziehen, da dies nicht von der Genauigkeit Ihres ATmega ADC abhängt, um ein analoges Signal zu messen, sondern ein digitales 1-Draht-Protokoll verwendet, um die Temperatur zu melden.

Siehe die folgenden Tutorials
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

Diese Antwort ist nicht sehr hilfreich, es sei denn, Sie erklären, warum das OP auf einen anderen Sensor umsteigen sollte, und Sie haben dafür keine Begründung angegeben. Es ist keine gute Idee, nur Links in einer Antwort bereitzustellen, da diese häufig tot sind und der Inhalt der Antwort verloren geht.
Anstatt meine eigene Antwort in die gleiche Richtung zu schreiben, habe ich dieses A bearbeitet, um auf die von Joe geäußerten Bedenken einzugehen.
@JoeHass Die einzige Alternative zum Verlinken auf externe Artikel besteht darin, den Code in der Antwort anzuhängen, aber ich habe keinen eigenen Code zum Anhängen, und es wäre nicht fair, den Code einer anderen Person ohne deren Zustimmung anzuhängen. Selbst wenn die Links tot sind, kann eine Bibliothek für Arduino leicht mit google und DS18B20 als Schlüsselwort gefunden werden. In Bezug auf die Erklärung war es mein Fehler, ich dachte, dass die Erwähnung, dass der Sensor digital ist, meinen Standpunkt erklärt hätte.
Danke für den Kommentar. Aus irgendeinem Grund sind digitale Sensoren ziemlich schwer zu finden. Weder lokale Anbieter (Maplin) noch billige Online-Typen (ich habe Spiraltronics verwendet) verkaufen keine. 3 £ pro Pop + Lieferung machen es immer noch zu einer relativ kostspieligen Option.
@Usov Nach den von Ihnen bereitgestellten Links zu urteilen, gehe ich davon aus, dass Sie in Großbritannien leben. Normalerweise kaufe ich diese Komponenten billig aus China, aber ich habe sie auch bei ebay.uk für 1,49 £ gefunden, vielleicht passen sie zu Ihnen

Ihre Messung ist so gut wie die Referenzspannung für ADC gut ist. Arduino verwendet standardmäßig die Versorgungsspannung als Referenzspannung, aber in Ihrem Fall wäre die Verwendung des Aref-Pins von Arduino der richtige Weg. Sie müssen sich einen speziellen Chip namens "Voltage Reference" besorgen und ihn mit dem Aref-Pin verbinden, dann ADC so einstellen, dass er die externe Referenz im Arduino-Code verwendet ( analogReference(EXTERNAL))

Die Spannung der Referenz muss so gewählt werden, dass der volle Ausschlag Ihres Temperatursensors in die Referenzspannung passt. TMP36 gibt ~1,5 V bei 100 °C aus, sodass Sie eine Referenz über 1,5 V verwenden müssten, um Temperaturen bis zu 100 °C zu messen. Sie möchten, dass Ihre Referenz so nah wie möglich an der maximal gemessenen Spannung liegt, um eine möglichst hohe Auflösung zu erhalten.

Atmega328p hat zwei interne Referenzen, die ohne externe Komponenten verwendet werden können. Einer ist 1,1 V, ein anderer 2,56 V. Sie sind normalerweise etwas schlechter als das, was Sie durch die Verwendung einer externen dedizierten Komponente erhalten würden. Überprüfen Sie die Arduino-Dokumentation für analogReference und das Atmega328p-Datenblatt für die interne Referenzgenauigkeit.

Wenn Sie wirklich Nüsse mit unterschiedlichen Reichweiten bekommen möchten, können Sie mehrere externe Referenzen verwenden und sie mit einem analogen Schalter wie 74hc4051 umschalten. Oder Sie können zwischen zwei internen Referenzen wechseln.

Mit Thermistoren erzielen Sie bessere Ergebnisse, wenn Sie anstelle eines dummen Widerstands eine Konstantstromquelle einrichten. Andererseits würde ein dummer Widerstand, der von einer stabilen Spannungsreferenz gespeist wird, in Ordnung funktionieren.

Stellen Sie bei der Auswahl einer externen Referenz sicher, dass Sie über genügend Spannung verfügen, um die Abfallspannung zu kompensieren, wenn Sie mit Batterien betrieben werden und die Batterien leer sind. Vref+Vdropout < Vbat-min.

Vielen Dank für Ihren Kommentar. Dies ist im Grunde derselbe Kommentar, den ich heute erhalten habe - baue meine eigene Referenzspannung auf einer Zenerdiode auf oder besorge dir einen dedizierten Niederspannungsregler für AREF.
Warum bessere Ergebnisse mit Konstantstrom und einem Thermistor?

Keine stabile ADC-Referenz zu haben, ist eigentlich ein Symptom für ein anderes Problem in Ihrer Schaltung: Sie liefern keine ausreichend hohe Spannung an die Platine. Dies wird dadurch angezeigt, dass die 5-V-Versorgung auf 4 V abfällt und die 3,3 V ebenfalls abfallen.

Der Spannungsregler (MC33269D-5.0 IIRC) auf dem Arduino-Board hat eine Dropout-Spannung von ~1,0 V, daher müssen Sie ihn mit mindestens 6 V versorgen, um einen stabilen 5-V-Ausgang zu erhalten. AA-Batterien beginnen bei 1,5-1,6 V und sind bei 1,1 V fast leer, sodass Sie das Board mit mindestens 6 AA-Batterien versorgen müssen, um eine stabile Ausgabe über die gesamte Batterielebensdauer zu erhalten.

Bei korrekter Stromversorgung können Sie entweder die interne ADC-Referenz oder entweder die 5-V- oder die 3,3-V-Leitung verwenden. Da der Temperatursensor um etwa 10 mV pro Grad Celsius variiert, könnten Sie einen Spannungsteiler verwenden, um die Referenzspannung gleich der maximal erwarteten Sensorausgangsspannung einzustellen (z. B. für 50 Grad C). Dadurch erhalten Sie eine genauere Messung.

Wenn Sie weniger als 6 AA-Batterien verwenden möchten, versuchen Sie es mit einem DC-DC-Aufwärtswandler, z . B. https://www.sparkfun.com/products/10968 . Das verlinkte Beispiel nimmt 1V - 4V und macht 5V. Der Ausgang würde direkt in den 5-V-Pin des Arduino eingespeist und sein Regler umgangen.

Damit das Board länger mit Batterien läuft, versetzen Sie die MCU zwischen den Sensorablesungen in den Ruhezustand. Die Rocketscream-Low-Power-Bibliothek eignet sich hervorragend für diesen Zweck. Aber es ist nur dann wirklich nützlich, wenn ein effizienter Regler / DC-DC-Wandler verwendet wird, da der Standard-Arduino-Regler alleine 10 mA verbraucht!

Antwort auf die Frage Gibt es eine andere Möglichkeit, die Sensorausgangsspannung zuverlässig zu messen?

ADC verwendet die Referenzspannung für die Umwandlung von analog nach digital. Wenn sich also die Referenzspannung ändert, ändern sich die konvertierten Werte (dh der digitale Wert). Der digitale Wert wird für denselben analogen Eingang unterschiedlich sein, wenn sich die Referenzspannung ändert.

Eine einfache Möglichkeit besteht darin, die interne Referenzspannung im Arduino (dh Atmega-Controller) zu verwenden.

Siehe den folgenden Link, wo ein Beispielcode zur Verwendung des internen ADC (Arduino-Funktionsname - analogReference (DEFAULT)) bereitgestellt wird.

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Ich denke, dies wird Ihr Problem lösen und es besteht keine Notwendigkeit, auf Thermistoren umzusteigen.

Ich bin mir nicht sicher, inwiefern "Hacking Wifi Finder" relevant ist - ich kann dort nichts Relevantes finden. In Bezug auf die interne ADC-Referenz - ich habe darüber geschrieben. Es funktioniert nicht, auch wenn Arduino über USB mit Strom versorgt wird. Und wenn das Board von einem Handy-Akku (3,7 - 4,5 V) gespeist wird, ist es noch schlimmer.
Entschuldigung, es ist ein Copy/Paste-Fehler. Werde den Link bald korrigieren!
@Usov-Link korrigiert!
1,1 V intern kann gemäß atmega328-Spezifikation um über 10% schweben. Dies scheint auch keine sehr zuverlässige Referenz zu sein.