Temperatursteuerung mit NTC 3950 100k an ESP 8266

Hallo zusammen,
Ich versuche eine Temperatursteuerung mit folgenden Komponenten zu realisieren:
1x NodeMCU ESP 8266
2x Taster zur regulierung
1x NTC 3950 mit 100k
1x 10k Widerstand
1x 16x2 i2c LCD

Leider habe ich das Problem dass ich der angezeigten Temperatur nicht vertrauen kann.
ich habe eine Wiederstandstabelle für den NTC anhand derer ich mit Multimeter kontrollieren kann ob bei z.B. angezeigten 100°C auch wirklich der richtige Widerstandswert messbar ist.
Leider stimmt der gemessene Wert nicht mit meiner Temperatur überein.

z.B. Angezeigt werden 100°C allerdings messe ich einen Wiederstand von 7,43k
Laut meiner Tabelle sollten aber 6,71 messbar sein.

bei 200°C sollten 0,582k messbar sein, allerdings messe ich 1,3k

Ich messe auch nicht in die Schaltung hinein sondern habe einen 2.NTC an dem ich messen kann.

Hier mein Anschlussplan:

Und hier der Sketch:

// Pin-Definitionen
const int tempSensorPin = A0;
const int incTempPin = D3;
const int decTempPin = D4;
const int outputPin = D5;

// Konstanten zur Umrechnung des ADC-Werts in Temperatur
const float beta = 3950; // NTC3950 Beta-Wert
const float r0 = 100000; // NTC3950 Widerstand bei 25°C
const float t0 = 25; // Referenztemperatur 
const float rSeries = 10000; // Serienwiderstand des Spannungsteilers!!!!!

// Variablen für die Temperatursteuerung
float targetTemp = 20.0;
float currentTemp = 0.0;
unsigned long incTempButtonPressedTime = 0;
unsigned long decTempButtonPressedTime = 0;


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
// Initialisierung der seriellen Schnittstelle
Serial.begin(9600);

  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();

  lcd.setCursor(3,0);
  lcd.print("Willkommen");
  delay(1500);
  lcd.clear();

  lcd.setCursor(1,0);
  lcd.print("FILAMAKER V1.3");
  lcd.setCursor(3,1);
  lcd.print("By Hahniii");
  delay(3000);
  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print("Aktuell:");
  lcd.setCursor(3,1);
  lcd.print("Ziel:");


// Konfiguration der Pins
pinMode(incTempPin, INPUT_PULLUP);
pinMode(decTempPin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
}

void loop() {
// Temperatur auslesen und berechnen
int adcValue = analogRead(tempSensorPin);
float rThermistor = rSeries * (1023.0 / adcValue - 1.0);
float temperature = 1.0 / (1.0 / (t0 + 273.15) + log(rThermistor / r0) / beta) - 273.15;
currentTemp = temperature;

// Überprüfen, ob die Zieltemperatur geändert werden soll
if (digitalRead(incTempPin) == LOW) {
if (millis() - incTempButtonPressedTime >= 3000) {
// Taster wurde länger als 3 Sekunden gedrückt gehalten
targetTemp += 10.0;
if (targetTemp > 300.0) {
targetTemp = 300.0;
}
Serial.print("Neue Zieltemperatur: ");
Serial.println(targetTemp);
} else if (millis() - incTempButtonPressedTime >= 1000) {
// Taster wurde zwischen 1 und 3 Sekunden gedrückt gehalten
targetTemp += 1.0;
if (targetTemp > 300.0) {
targetTemp = 300.0;
}
Serial.print("Neue Zieltemperatur: ");
Serial.println(targetTemp);
} else {
// Taster wurde kurz (< 1 Sekunde) gedrückt
incTempButtonPressedTime = millis();
}
} else {
incTempButtonPressedTime = 0;
}

if (digitalRead(decTempPin) == LOW) {
if (millis() - decTempButtonPressedTime >= 3000) {
// Taster wurde länger als 3 Sekunden gedrückt gehalten
targetTemp -= 10.0;
if (targetTemp < 0.0) {
targetTemp = 0.0;
}
Serial.print("Neue Zieltemperatur: ");
Serial.println(targetTemp);
} else if (millis() - decTempButtonPressedTime >= 1000) {
// Taster wurde zwischen 1 und 3 Sekunden gedrückt gehhalten
targetTemp -= 1.0;
if (targetTemp < 0.0) {
targetTemp = 0.0;
}
Serial.print("Neue Zieltemperatur: ");
Serial.println(targetTemp);
} else {
// Taster wurde kurz (< 1 Sekunde) gedrückt
decTempButtonPressedTime = millis();
}
} else {
decTempButtonPressedTime = 0;
}

// Zieltemperatur mit aktueller Temperatur vergleichen und Ausgang setzen
if (currentTemp < targetTemp) {
digitalWrite(outputPin, HIGH);
} else {
digitalWrite(outputPin, LOW);
}

// Temperatur und Zieltemperatur an den seriellen Monitor senden
Serial.print("Aktuelle Temperatur: ");
Serial.print(currentTemp);
Serial.print(" Zieltemperatur: ");
Serial.println(targetTemp);

  lcd.setCursor(12,0);
  lcd.print(currentTemp);

  lcd.setCursor(12,1);
  lcd.print(targetTemp);

  

// Warten für eine kurze Zeit, um den seriellen Monitor nicht zu überfluten
delay(300);
}

Ich hoffe mir kann jemand helfen.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Dankeschön :slight_smile:

Ändere bitte noch deinen Titel.
Einen ESP8622 gibt es nicht.

1 Like

Lol entschuldige.
Danke für den Hinweis

Dann passt die Tabelle nicht zum Widerstand, oder dein Multimeter (oder dein Thermometer) lügt.
Immerhin scheint es ein NTC-Verhalten zu sein: Je höher die Temperatur, desto niedriger der Widerstand.
Jetzt kommt es noch drauf an, was dein Multimeter zum 10k Referenzwiderstand sagt, bzw. welchen Messwert du bei welcher Temperatur an A0 erhältst.

Wenn du dann noch drauf vertrauen kannst, dass bei gleicher Temperatur und wiederholter Messung ein sehr ähnliches Ergebnis rauskommt, ist der Widerstand prinzipiell verwendbar.
Aber 100k ist schon recht hochohmig, hier wird Glättung mit Kondensator und Mehrfachmessung (multisampling) empfohlen.

Ob du eine Library verwendest und ggfls. den B-Faktor anpasst,
oder die Umrechnung Messwert -> Temp gleich per Tabellen-interpolation machst, wird in dem Link auch behandelt.

Hi,

hast Du mal geprüft, ob Dein ESP8266 auch die Spannung einigermaßen genau misst. Der ADC des ESP8266 gilt eher als Schätzeisen. Also mal Vergleichsmessungen mit einem Messgerät machen, in dem Bereich den Du auch brauchst.
Gibt es zum NTC ein Datenblatt, bitte als Link oder Anhang. Du kannst zum berechnen auch die Steinhart-Hart-Gleichung nehmen, wenn Du vorher die drei Koeffizienten erstellst. Diese ist genauer ...

Gruß André

Wieso subtrahierst Du 1 ADC?
Welchen NTC hast Du?
Verträgt der 200°C?

Grüße Uwe

Einfach um den gemessenen NTC Wiederstand bischen zu "Filtern".

Zu dem NTC hab ich nix spezielles die wurden über Amazon mit 40w Heizpatronen im Set gekauft.

Amazon Zeugs

Angeblich kann der -40 bis +300

OK, die Dinger (NTC) kommen aus China und kosten heute dort 10-15cent das Stück. Die von Dir genannte Abweichung sind bei +100C nicht ganz 5C ... also fast perfekt :wink:
Mache einen 3 Punkt-Abgleich, erstelle die 3 Koeffizienten für die Steinhart-Hart-Gleichung und gut ist ...

Gruß André

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.