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.