Temperatur genau mit Arduino messen

10

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

Zuerst habe ich versucht, einen TMP36- Temperatursensor zu verwenden. Bisher war es ein völliger Misserfolg. Obwohl der Sensor selbst sehr stabil zu sein scheint, kann ich keine Möglichkeit finden, seine Spannung genau zu messen.

Die Verwendung der eingebauten 5-V-Referenz für analoge Sensoren funktioniert überhaupt nicht - selbst die Stromversorgung über USB + 5 V beträgt + 4,8 V (wodurch die gemessene Temperatur um einige Grad verschoben wird). Wenn die Platine von der Batterie gespeist wird, fällt die Spannung auf ca. 4 V ab und die Temperatur wird in die Höhe geschossen. Ich habe auch versucht, +3,3 V von der Platine als Referenz zu verwenden. Es scheint stabiler zu sein, wenn die Karte über USB mit Strom versorgt wird, aber die Spannung fällt ab, wenn der Akku entladen wird.

Gibt es eine andere Möglichkeit, die Ausgangsspannung des Sensors zuverlässig zu messen?

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

Soweit ich weiß, sollten diese leichter 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 unterschiedlichen Festwiderständen zu verwenden, um die Genauigkeit zu erhöhen?
  • Ich kann den programmierbaren Pin als V_in verwenden und die Temperatur mit wenigen verschiedenen Spannungspegeln messen. Obwohl mir nicht klar ist, ob dies tatsächlich die Genauigkeit erhöht.
Usov
quelle
Bitte geben Sie Ihren Temperaturumrechnungscode ein.
geometrisch
Bitte definieren Sie, was Sie unter "genau" verstehen. Welche Art von Temperaturauflösung und absoluter Genauigkeit möchten Sie erreichen?
Joe Hass
Ich hoffe auf eine Auflösung von ca. 1-2 Grad. Ein absoluter Kalibrierungsfehler von 1-2 Grad sollte ebenfalls 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 raueren) Punkt bei Raumtemperatur erhalten.
Usov
1-2 Grad für Temperaturen im Bereich von 5-25 ° C.
Usov
@geometrikal Ich habe es momentan nicht zur Hand, aber es ist im Grunde das gleiche wie bei allen anderen: erste Probe fallen lassen, ein paar Millis warten, noch ein paar Mal probieren und durchschnittliche Proben. Skalieren Sie dann nach Ihrer Referenzspannung neu.
Usov

Antworten:

2

Anscheinend sind Sie sich des Problems mit der Änderung der Referenzspannung bewusst, und wenn Sie ein Gerät wie das TMP36 (fest 10 mV / ° C) verwenden, können Sie nichts anderes tun, als eine Spannungsreferenz von einem Chip zur Stabilisierung zu verwenden.

Wenn Sie jedoch einen Widerstandsthermometer 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 Widerstandsthermometer oder Thermistor (über einen geeigneten Widerstand) mit derselben Referenzspannung versorgen, hat dies keinen Einfluss auf die Messwerte. Wenn der Referenzwert um 10% steigt, steigt auch die Spannung im ADC.

Andy aka
quelle
4

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

Weitere Informationen finden Sie in den folgenden Tutorials:
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
quelle
2
Diese Antwort ist nur dann sehr hilfreich, wenn Sie erklären, warum das OP auf einen anderen Sensor umgestellt werden sollte, und Sie haben dies nicht begründet. Nur Links in einer Antwort anzugeben, ist keine gute Idee, da sie oft tot sind und der Inhalt der Antwort verloren geht.
Joe Hass
Anstatt meine eigene Antwort in die gleiche Richtung zu schreiben, habe ich dieses A bearbeitet, um die von Joe angesprochenen Bedenken auszuräumen.
RedGrittyBrick
@JoeHass Die einzige Alternative zum Verknüpfen mit externen Artikeln besteht darin, den Code in der Antwort anzuhängen, aber ich habe keinen eigenen Code zum Anhängen, und es wäre nicht fair, einen anderen Code ohne dessen Zustimmung anzuhängen. Selbst wenn die Links nicht mehr funktionieren, kann eine Bibliothek für Arduino mit Google und DS18B20 als Schlüsselwort leicht 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.
alexan_e
Danke für den Kommentar. Aus irgendeinem Grund sind digitale Sensoren ziemlich schwer zu finden. Weder lokale Lieferanten (Maplin) noch billige (er) Online-Leute (ich habe Spiraltronics verwendet) verkaufen keine. £ 3 pro Pop + Lieferung macht es immer noch relativ teuer Option.
Usov
@Usov Nach den von Ihnen bereitgestellten Links zu urteilen, gehe ich davon aus, dass Sie in Großbritannien leben. Normalerweise kaufe ich diese Komponenten günstig in China, aber ich habe sie auch bei ebay.uk für £ 1.49 gefunden, vielleicht passen sie zu Ihnen
alexan_e
3

Ihre Messung ist so gut wie die Referenzspannung für ADC gut ist. Arduino verwendet standardmäßig die Versorgungsspannung als Referenzspannung. In Ihrem Fall ist es jedoch richtig, den Aref-Pin von Arduino zu verwenden. Sie müssen einen speziellen Chip namens "Spannungsreferenz" erwerben und ihn an den Aref-Pin anschließen. Stellen Sie dann den ADC so ein, dass die externe Referenz im Arduino-Code ( analogReference(EXTERNAL)) verwendet wird.

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

Atmega328p verfügt über zwei interne Referenzen, die ohne externe Komponenten verwendet werden können. Eine ist 1,1 V, eine andere 2,56 V. Sie sind normalerweise etwas schlechter als bei Verwendung einer externen dedizierten Komponente. Überprüfen Sie die Arduino-Dokumentation auf analogReference und Atmega328p-Datenblatt auf interne Referenzgenauigkeit.

Wenn Sie wirklich Muttern mit unterschiedlichen Bereichen erhalten möchten, können Sie mehrere externe Referenzen verwenden und diese mithilfe eines analogen Schalters wie 74hc4051 schalten. Oder Sie können zwischen zwei internen Referenzen wechseln.

Mit Thermistoren erzielen Sie bessere Ergebnisse, wenn Sie stattdessen eine Konstantstromquelle mit einem stummen Widerstand einrichten. Andererseits würde ein stummer Widerstand, der von einer stabilen Spannungsreferenz gespeist wird, in Ordnung funktionieren.

Stellen Sie bei der Auswahl einer externen Referenz sicher, dass genügend Spannung vorhanden ist, um die Ausfallspannung aufzunehmen, wenn die Batterien mit Strom versorgt werden und die Batterien leer sind. Vref + Vdropout <Vbat-min.

Mäuse
quelle
Vielen Dank für Ihren Kommentar. Dies ist im Grunde der gleiche Kommentar, den ich heute erhalten habe - bauen Sie meine eigene Referenzspannung an der Zenerdiode auf oder holen Sie sich einen speziellen Niederspannungsregler für AREF.
Usov
Warum bessere Ergebnisse mit konstantem Strom und einem Thermistor?
geometrisch
2

Das Fehlen einer stabilen ADC-Referenz ist tatsächlich ein Symptom für ein anderes Problem in Ihrer Schaltung: Sie versorgen die Platine nicht mit einer ausreichend hohen Spannung. 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 der Arduino-Platine hat eine Ausfallspannung 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 bis 1,6 V und sind bei 1,1 V fast leer. Sie müssen die Platine daher mit mindestens 6 AA-Batterien mit Strom versorgen, um eine stabile Leistung über die gesamte Batterielebensdauer zu erzielen.

Bei korrekter Stromversorgung können Sie entweder die interne ADC-Referenz oder die 5-V- oder 3,3-V-Leitungen verwenden. Da der Temperatursensor um etwa 10 mV pro Grad Celsius variiert, können Sie einen Spannungsteiler verwenden, um die Referenzspannung so einzustellen, dass sie der maximal erwarteten Sensorausgangsspannung entspricht (z. B. für 50 ° C). Dies ergibt 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 verknüpfte Beispiel nimmt 1V - 4V und macht 5V. Der Ausgang würde unter Umgehung seines Reglers direkt in den 5-V-Pin des Arduino eingespeist.

Schalten Sie die MCU zwischen den Sensorablesungen in den Ruhezustand, damit die Karte mit Batterien länger läuft. Die Rocketscream Low Power Library 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 allein 10 mA verbraucht!

geometrisch
quelle
1

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

Der ADC verwendet die Referenzspannung für die Umwandlung von analog zu digital. Wenn sich also die Referenzspannung ändert, ändern sich die konvertierten Werte (dh der digitale Wert). Der digitale Wert ist für denselben Analogeingang unterschiedlich, wenn sich die Referenzspannung ändert.

Eine einfache Option ist die Verwendung der internen Referenzspannung im Arduino (dh Atmega-Controller).

Unter dem folgenden Link finden Sie einen Beispielcode für die Verwendung des internen ADC (Arduino-Funktionsname - analogReference (DEFAULT)).

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.

robomon
quelle
Ich bin mir nicht sicher, wie "Hacking Wifi Finder" relevant ist - ich kann dort nichts Relevantes finden. In Bezug auf die interne ADC-Referenz habe ich darüber geschrieben. Es funktioniert nicht, selbst wenn Arduino über USB mit Strom versorgt wird. Und wenn das Board mit einem Handy-Akku (3,7 - 4,5 V) betrieben wird, ist es noch schlimmer.
Usov
Entschuldigung, es ist ein Fehler beim Kopieren / Einfügen. Wird den Link bald korrigieren!
Robomon
@ Usov Link korrigiert!
Robomon
1,1 V interne Geräte können gemäß atmega328-Spezifikation um über 10% schweben. Dies scheint auch keine sehr zuverlässige Referenz zu sein.
Usov