Arduino Thermistor --- analog PIN zu Temperatur?
Hallo,
Ich arbeite momentan daran mit dem Arduino einen Thermometer zu bauen. Jedoch bekomme ich es nicht her, die richtigen Werte herauszubringen. Ich verwende einen Spannungsteiler. Auf der einen Seite ein Thermistor - ist verbunden mit A0 und 3.3V und dann ein 1000 Ohm Widerstand mit Verbindungen zu A0 und GND. Ich habe einen Arduino UNO R3 und ein MF52D3950 Thermistor. Was stimmt mit meinem Code nicht? Der Widerstand des Thermistors (im Code R2) sollte ca. 9200 Ohm betragen, ist aber immer zwischen 118 und 120. An was liegt das? Ich bin da schon 5 Stunden dran. Also BITTE helft mir.
Vielen Dank im Voraus!
LG
//www.elegoo.com
//2016.12.9
#include <math.h>
#include <LiquidCrystal.h>
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
}
// This is OK
int analogPin= 0;
int raw= 0;
int Vin= 3.3; //volts input
float Vout= 0; // unknown voltage, we have to measure
float R2= 0; // Unknown resistance, we have to measure
float T1 = 26 + 273.15; //reference temperature
float R1 = 9040; //reference resistance
float T2 = 0; //searched temperature
float B = 3950; //B value resistor
float R_REF = 1000; //reference resistor Spannungsteiler Wert
void loop() {
raw = analogRead(analogPin); //liest BIT-Wert für Spannung aus, welcher zum feststellen der Temperatur nötig ist
Vout= (raw * 5)/(1024.0);
R2 = R_REF / ((Vin / Vout) - 1);
T2 = (B*T1*(-1))/(T1*log(R1/R2)-B)-273.15; //berechnet Temperatur
Serial.print("raw:");
Serial.println(raw);
Serial.print("Vout:");
Serial.println(Vout);
Serial.print("R2:");
Serial.println(R2);
Serial.print("T2:");
Serial.println(T2);
}
3 Antworten
int Vin= 3.3; //volts input
int sind Ganzzahlen, da gehen keine Kommazahlen... Rechne einfach mit mV, also 3300 oder 5000, dann brauchst Du keine Rücksicht auf ein Komma nehmen.
Vout= (raw * 5)/(1024.0);
Teile durch 1023, Wert0 entspricht ja 0V am AnalgoRead. Die restlichen Werte sind nur 1023, auf die sich die Spannung aufteilt... Und natürlich 3300mV, wenn Du deine Schaltung an 3,3V betreibst...
Welche Werte spuckt Dir dein Analogeingang aus?
R2 = R_REF / ((Vin / Vout) - 1);
Das kann auch nicht passen... Du willst ja wissen, wie groß dein Wert vom Thermistor ist, dann musst Du das etwas anders rechnen...
R2=R_REF/Vout*(Vin-Vout);
Die willst Vout messen, aber errechnest es stattdessen? Wo kommt die 5 her, ich dachte du würdest nach 3.3 V gehen? entspricht die 1024 einer 10 bit ADC Auflösung, oder wo kommt die her? So ja, lassen sich floats oft, beinahe immer vermeiden, wenn du zum Skalieren erst multiplizierst, und danach erst dividierst.
Ohne da jetzt eintauchen zu wollen, würde ich diesen Ansatz wählen:
// Spannung über R, dem 1k-Widerstand verhält sich zu Spannung über beiden
// Widerständen, 3.3V, wie 1k Widerstand zu Summe beider Widerstände:
Ur / Utot = R/Rtot
// also ist, nach Ur aufgelöst:
Ur = R*Utot/Rtot
// und damit Uth, Spannung über dem Thermistors, gleich
Uth = Utot-Ur
zur Kontrolle setze ich für Widerstand des Thermistors die Werte 0, 1000 und unendlich ein:
Rth Ur = R*Utot/Rtot Uth
0 3300/1000 3.3-3.3 -> 0V
1000 3300/2000 3.3-1,65 -> 1.65V
unendlch 3300/unendlich 3.3-0 -> 3.3V
Jetzt statt Volt milliVolt zur Berechnung verwenden, und du brauchst dafür gar keine floats mehr.
Ich hab das hier mal in ein ... "Programm" ... gepackt. Die eigentliche Berechnung findet sich auf der Zeile, die mit ": R1" beginnt. Obendrüber steht, was ich da rechne, und darunter das erzeugt nur die Kontrollausgabe rechts. Das wesentliche dürfte für dich der Rechenweg oben sein, der Rest dient eher zur Bestätigung, dass das auch funktioniert:
Hallo,
aalso..dein NTC sollte bei 25°C 10KOhm haben
datenblatt:
https://www.gotronic.fr/pj2-mf52type-1554.pdf
wieso nutzt du nur einen 1K Widerstand für spannungsteiler? und wieso nur 3,3V?
der arduino hat auch 5V tolerante Pins..also..10Kohm dran und an die 5V.
dann teste mal diesen code hier:
https://www.circuitbasics.com/arduino-thermistor-temperature-sensor-tutorial/
vielleicht kommst du damit weiter.
ich selbst habe eher PT100 oder PT1000 als analoge sensoren da..aber hierzu braucht man eine Wheatstonesche Messbrücke. Ist etwas komplexer als nur einfacher Spannungsteiler.