Eine beheizte Druckplatte ist kein Luxus, sondern fast schon Pflicht, wenn man sauber, zuverlässig und stressfrei drucken möchte. Gerade bei Materialien wie ABS, PETG oder Nylon entscheidet die Hotplate oft darüber, ob ein Druck perfekt hält – oder sich schon nach den ersten Layern in die berühmte „Banane“ verwandelt.

Das Nachrüsten einer Hotplate ist dabei überraschend einfach und vor allem günstig. Mit einem überschaubaren Budget von rund 56 € lässt sich ein bestehender 3D-Drucker deutlich aufwerten – und das merkt man bei jedem Druck.

Warum eine Hotplate?

  • Bessere Haftung: Der erste Layer hält deutlich zuverlässiger.
  • Weniger Warping: Ecken bleiben dort, wo sie hingehören.
  • Mehr Materialvielfalt: Auch anspruchsvollere Filamente sind kein Problem mehr.
  • Konstantere Druckqualität: Weniger Fehldrucke = weniger Frust.

Die Bauteile im Überblick

Das Setup ist bewusst simpel gehalten und besteht aus leicht verfügbaren Standardkomponenten:

  • Heizplatte 24V / 200W mit NTC (20,00 €)
    Sorgt für schnelles Aufheizen und stabile Temperaturen.
  • Netzteil 24V / 250W (20,00 €)
    Genug Reserve, um die Heizplatte sicher zu versorgen.
  • DC-DC Converter (2,50 €)
    Versorgt Elektronik und Display zuverlässig mit der passenden Spannung.
  • Arduino Uno oder Nano (5,00 €)
    Das Gehirn der Steuerung – flexibel, günstig und gut dokumentiert.
  • OLED Display (3,50 €)
    Zeigt Ist- und Soll-Temperatur sowie den aktuellen Status an.
  • 10 kΩ Poti (2,00 €)
    Für die einfache Einstellung der gewünschten Temperatur.
  • Relais Modul (1,00 €)
    Schaltet die Heizplatte sicher ein und aus.
  • Kaltgeräte-Buchse mit Schalter (2,00 €)
    Saubere, sichere Stromzufuhr mit Hauptschalter.

Fazit

Für wenig Geld bekommt man ein echtes Upgrade, das den 3D-Druck spürbar verbessert. Die Kombination aus Arduino-Steuerung, Display und Potentiometer macht die Hotplate flexibel, übersichtlich und leicht bedienbar.
Kurz gesagt: Mehr Haftung, weniger Ausschuss, mehr Spaß am Drucken

Nachrüstung Dremel 3D40

Details zum Nachbauen inkl. Software:

/******************************************************************
Project     :  3D Drucker HOTPLATE CONTROL (Arduino + NTC + Relais + OLED)
CPU         :  UNO oder Nano

Funktion:
  - Poti (A1) bestimmt die Soll-Temperatur (20°C – 300°C)
  - NTC (A0) misst die Ist-Temperatur (berechnet über Beta-Gleichung)
  - Relais (D3) schaltet die 24V-Heizplatte EIN/AUS
  - OLED zeigt IST, SOLL und Status an

  Hinweis:
  - Das Relais wird per Hysterese geschaltet, damit es nicht "flattert".
  - Alternative: MOSFET Schalter statt klickendes Relais.

Autor       :  Matthias Drinkmann (2020–25) 

Public Domain – ohne Gewähr.
******************************************************************/

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ---- Display ----
// OLED-Auflösung (meist 128x64 Pixel bei SSD1306)
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// Display-Objekt erzeugen: nutzt I2C (Wire), Reset-Pin = -1 (kein Reset-Pin genutzt)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// ---- Pins laut Schaltplan ----
// Analoge Pins lesen Spannungen 0..5V (bei UNO/Nano) als 0..1023
const int pinNTC    = A0;  // Temperaturfühler (NTC Spannungsteiler)
const int pinPoti   = A1;  // Sollwert-Einstellung (Poti als Spannungsteiler)
const int pinRelais = 3;   // Digitalpin fürs Relais-Modul (HOTPLATE)

// ---- NTC Parameter ----
// Diese Werte müssen zu deinem NTC und deinem Spannungsteiler passen!
// Typischer Aufbau: 10k Festwiderstand + 10k NTC (bei 25°C)
const float SERIES_RESISTOR      = 10000.0; // Festwiderstand im Teiler (z.B. 10k)
const float NOMINAL_RESISTANCE   = 10000.0; // NTC Nennwiderstand @ 25°C (10k)
const float NOMINAL_TEMPERATURE  = 25.0;    // Referenztemperatur (°C)
const float BETA                 = 3950.0;  // Beta-Wert des NTC (häufig 3950)

// ---- Hysterese ----
// Schaltband, damit das Relais nicht ständig EIN/AUS schaltet.
// Beispiel: Soll=60°C, Hyst=2°C:
//  - EIN wenn Ist < 58°C
//  - AUS wenn Ist > 60°C
float hysterese = 2.0; // °C

// Merker, ob die Heizung aktuell EIN ist.
// WICHTIG: Damit der Zustand zwischen loop()-Durchläufen erhalten bleibt.

bool heizungEin = false;

void setup() {
  // Relais-Pin als Ausgang konfigurieren
  pinMode(pinRelais, OUTPUT);

  // Heizung zu Beginn AUS (je nach Relais-Modul evtl. invertiert!)
  // Manche Module schalten bei LOW ein -> dann hier entsprechend anpassen.
  digitalWrite(pinRelais, LOW);

  // OLED initialisieren (I2C-Adresse häufig 0x3C, manchmal 0x3D)
  // SSD1306_SWITCHCAPVCC: interner Spannungswandler aktiv
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  // Display löschen und Text-Settings setzen
  display.clearDisplay();
  display.setTextSize(1);              // kleine Schrift
  display.setTextColor(SSD1306_WHITE); // weiße Pixel

  // Startscreen
  display.setCursor(0, 0);
  display.println("HOTPLATE CONTROL");
  display.display();
  delay(800);
}

void loop() {

  // -------------------------------------------------------
  // 1) SOLL-Temperatur über Poti bestimmen (20°C – 300°C)
  // -------------------------------------------------------
  // Rohwert des Potis: 0..1023
  int potiRaw = analogRead(pinPoti);

  // Umrechnung Rohwert -> Temperaturbereich
  // Wenn du feinere Auflösung willst: eigene lineare Berechnung mit float.
  float tempSoll = map(potiRaw, 0, 1023, 20, 300);

  // -------------------------------------------------------
  // 2) IST-Temperatur aus NTC berechnen
  // -------------------------------------------------------
  // Rohwert des NTC: 0..1023
  // Vorsicht: Wenn ntcRaw = 0, gibt es Division durch 0.
  // In der Praxis kommt 0 selten vor, aber wir sichern trotzdem ab.
  int ntcRaw = analogRead(pinNTC);
  if (ntcRaw < 1) ntcRaw = 1;          // Schutz gegen 0
  if (ntcRaw > 1022) ntcRaw = 1022;    // Schutz gegen 1023 (sonst ebenfalls Probleme)

  /*
    Spannungsteiler-Formel:
    - Angenommen: SERIES_RESISTOR ist gegen VCC und NTC gegen GND (oder umgekehrt).
    - Diese Formel hier entspricht dem Fall:
        Vout = Vcc * (NTC / (SERIES + NTC))
      => NTC = SERIES / ( (Vcc/Vout) - 1 )

    analogRead liefert proportional zu Vout:
      Vout/Vcc = ntcRaw/1023

    => NTC = SERIES / ( (1023/ntcRaw) - 1 )
  */
  float resistance = SERIES_RESISTOR / (1023.0 / ntcRaw - 1.0);

  /*
    Beta-Gleichung / vereinfachte Steinhart-Hart:
    1/T = 1/T0 + (1/B) * ln(R/R0)

    T  in Kelvin
    T0 in Kelvin (25°C = 298.15K)
    R  gemessener Widerstand
    R0 Nennwiderstand bei T0
    B  Beta-Wert
  */
  float steinhart;
  steinhart  = resistance / NOMINAL_RESISTANCE;            // (R/R0)
  steinhart  = log(steinhart);                             // ln(R/R0)
  steinhart /= BETA;                                       // (1/B)*ln(...)
  steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15);       // + 1/T0
  steinhart  = 1.0 / steinhart;                            // invertieren -> T(K)

  float tempIst = steinhart - 273.15;                      // Kelvin -> °C

  // -------------------------------------------------------
  // 3) Steuerung der Heizplatte (Hysterese-Schaltung)
  // -------------------------------------------------------
  // Wir arbeiten mit einem "Zustandsautomaten":
  // - Wenn Ist deutlich unter Soll (Soll - Hysterese) -> Heizung EIN
  // - Wenn Ist über Soll -> Heizung AUS
  //
  // Vorteil: stabile Regelung ohne dauerndes Relaisklackern.
  if (tempIst < tempSoll - hysterese) {
    heizungEin = true;
  } else if (tempIst > tempSoll) {
    heizungEin = false;
  }
  // Hinweis: Zwischen (Soll - Hysterese) und (Soll) bleibt der Zustand erhalten.

  // Relais entsprechend schalten
  // Achtung: Je nach Relais-Modul kann HIGH=EIN oder LOW=EIN sein.
  digitalWrite(pinRelais, heizungEin ? HIGH : LOW);

  // -------------------------------------------------------
  // 4) Display-Ausgabe
  // -------------------------------------------------------
  display.clearDisplay();
  display.setCursor(0, 0);

  // IST Temperatur anzeigen
  display.print("IST:  ");
  display.print(tempIst, 1);     // 1 Nachkommastelle
  display.println(" C");

  // SOLL Temperatur anzeigen
  display.print("SOLL: ");
  display.print(tempSoll, 1);
  display.println(" C");

  // Leerzeile
  display.println("");

  // Status anzeigen
  display.print("STATUS: ");
  if (heizungEin) display.println("HOTPLATE ON");
  else            display.println("HOTPLATE OFF");

  // Ausgabe auf Display "flushen"
  display.display();

  // Kurze Pause (Display-Update + Regelintervall)
  delay(300);
}

Simulation der Schaltung und Software (YouTube)


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert