Präzisions-Temperaturcontainer für Probenversand mit PT100 & Arduino UNO
Komponenten & Zubehör
| Bauteil | Anzahl | Hinweise |
|---|---|---|
| PT100 Temperatursensor (RTD) | 1 | |
| Arduino UNO | 1 | |
| Lithium-Ionen-Akku | 1 | 10.400 mAh |
| Polystyrol-Box (Isolierbox) | 1 | Recycelt, ca. 250×250×250 mm, Wandstärke 45 mm |
| Kupferblöcke | 2 | ca. 80×50×10 mm, für Kühlkörper & Peltier-Aufnahme, mit Bohrungen für Heatpipes |
| Einstellbares Boost-Netzteil-Modul (ULS) | 1 | |
| Heatpipe-Kühler (CPU-Kühler) | 1 | |
| Digitalpotentiometer (MCP41100) | 1 | 100 kΩ |
| „Magic Gel“ (therm. Leitgel) | 1 | Für besseren Wärmeübergang zu den Proben |
| DC-DC-Wandler (XL6019 Step-Up) | 1 | |
| Peltier-Modul (TEC) | 1 | 3,9 A / 7,6 V max. |
| Kondensator 3,3 µF | 1 | |
| Heatpipes | 3 | Kupfer, für Wärmeableitung nach außen |
| Netzteil für Netzstrom | 1 | 12 V DC |
| DC-Verteiler (Splitter) | 1 | |
| Adafruit RGB LCD Shield (16×2) | 1 | Mit Tasten |
| Heizmatte | 1 | Zum Heizen der Proben |
| Klemmblöcke (3- & 5-polig) | je 1 | |
| Hook & Loop DualLock Klettband | 1 | |
| Adafruit Proto-Screwshield | 1 | Für sichere Schraubklemmen am Arduino |
| Adafruit Li-Ion USB-Ladegerät | 1 | |
| Adafruit MAX31865 PT100 Verstärker | 1 | Für 4-Leiter-Messung |
| Schalter (4-polig, 2-polig) | je 1 | Für Betriebsart (Heizen/Kühlen) & Stromquelle (Netz/Akku) |
| Gehäuse (Kunststoff) für Elektronik | 1 | Extern |
| Panel-Mount DC-Buchse | 1 |
Benötigte Werkzeuge
- Lötkolben
- Dremel 4000 (oder ähnliche Fräse)
- Schraubstock
- Bohrmaschine
- Abisolierzange, Zangen, Seitenschneider
- Handfräse (für Kupferbearbeitung)
Software & Bibliotheken
- Arduino IDE
- GitHub:
sleemanjBibliothek für MCP41100 Digitalpotentiometer - Adafruit Bibliotheken:
Adafruit_MAX31865,Adafruit_RGBLCDShield,Adafruit_MCP23017
Projektübersicht: „Mr ThermoParcel“
Ziel: Entwicklung eines temperaturgeführten Containers für den sicheren Versand temperatursensibler biologischer Proben (z. B. Blutproben für Malariaforschung) per Standard-Postdienst. Der Prototyp hält Temperaturen von 4–37 °C und kann über Netzteil, internen Akku oder 12 V Quellen (Kfz-Zigarettenanzünder, Laptop-Netzteil) betrieben werden.
Hintergrund
Der Versand gefrorener Proben ist teuer, erfordert spezielle Kuriere und das Auftauen beschädigt die Proben. Zudem kommen Pakete an Universitäten oft verspätet und unter ungeeigneten Bedingungen an. „Mr ThermoParcel“ löst dieses Problem durch aktive Temperaturregelung in einer Standard-Polystyrolbox.
Designkonzept
- Kühlung: Peltier-Element (kalte Seite nach innen an Kupferplatte, heiße Seite nach außen an Heatpipes + CPU-Kühler).
- Heizung: Heizmatte im Inneren der Probenbox.
- Sensorik: PT100 (RTD) direkt an den Proben, ausgelesen via MAX31865.
- Regelung: Arduino UNO mit PID-Regler (im Betrieb zeigte sich der P-Anteil als ausreichend; I- & D-Anteile wurden entfernt).
- Leistungsstellglied: PTN78020W Step-Down-Regler (7–36 V Ein, 2,5–12,6 V Aus), gesteuert über Digitalpotentiometer MCP41100.
- Stromversorgung: 12 V Netzteil (max. Peltier-Leistung) oder 3,7 V Li-Ion-Akku + XL6019 Step-Up auf 10–12 V (begrenzt durch Akku-Entladestrom auf ca. 7 A → reduzierte Kühlleistung im Akkubetrieb).
- Bedienung: LCD-Shield mit Tasten für Sollwert, Betriebsart (Heizen/Kühlen) & Stromquelle.
Mechanischer Aufbau
Die äußere Polystyrolbox (250³ mm, 45 mm Wand) enthält eine innere Kunststoffbox (125×70×40 mm) mit zwei 50 ml Zentrifugenröhrchen als Sekundärverpackung (UN3373 konform). Primärproben: sechs 2 ml Eppendorf-Röhrchen, getrennt durch Saugvlies. Zur Verbesserung der thermischen Kopplung und Gleichmäßigkeit wird das Innere mit elektrisch isolierendem, aushärtendem Gel („Magic Gel“) aufgefüllt, in das die Proben, der PT100-Sensor und die Heizmatte eingebettet sind.
Elektronik & Verdrahtung
Kühl-/Heizregelung
Der PTN78020W regelt die Spannung für Peltier (Kühlung) bzw. Heizmatte (Heizung). Da der Regelbereich des PTN78020W einen Widerstandsbereich > 1 MΩ erfordert, das MCP41100 aber nur 100 kΩ bietet, kann der Peltier nicht rein über das Potentiometer abgeschaltet werden – ein Hardware-Schalter (Toggle) trennt die Last physisch (Peltier vs. Heizmatte). Die Software unterscheidet entsprechend zwischen Heiz- und Kühlmodus (Vorzeichen der PID-Ausgabe).
Stromversorgung
- Netzbetrieb: 12 V DC → PTN78020W → bis 10 V Ausgang (Volllast Peltier).
- Akkubetrieb: 3,7 V / 10,4 Ah Li-Ion → XL6019 Step-Up → 10–12 V → PTN78020W. Begrenzung auf ca. 120/255 PWM (Software), um Akku-Überlastschutz nicht auszulösen.
Arduino-Verdrahtung
- Stromversorgung: über DC-Buchse (12 V extern oder Step-Up-Ausgang).
- Digitalpotentiometer (MCP41100) im Variabler-Widerstand-Modus an SPI-Pins (CS=Pin 10).
- MAX31865 (PT100) im Software-SPI (CS=2, DI=3, DO=4, CLK=5), 4-Leiter-Messung, Rref=430 Ω.
- RGB LCD Shield via I²C (Adafruit_MCP23017).
- Physische Schalter für Power-Mode (Netz/Akku) & Operation-Mode (Cool/Heat) werden im Code ausgelesen (bzw. per Tasten am LCD umgeschaltet).
Software (PID-Regler)
Der Arduino-Sketch (PID_LCD_controller_v03) initialisiert alle Module, liest zyklisch die Temperatur (ca. alle 1 s), berechnet den PID-Wert (nur P-Anteil, kp=500), begrenzt die Ausgabe je nach Stromquelle (Akku: max 120, Netz: max 255) und steuert das Digitalpotentiometer. Über die LCD-Tasten kann der Sollwert (1 °C Schritte), der Betriebsmodus (Heizen/Kühlen) und die Stromquelle umgeschaltet werden. Serielle Debug-Ausgaben dokumentieren alle Größen.
Leistung & Ergebnisse
| Betriebsart | Kühlung auf 4 °C (von 21–23 °C) | Heizung auf 37 °C (von RT) | Genauigkeit |
|---|---|---|---|
| Netzbetrieb | ~1 h (8–10 °C in 20 min) | ~10 min | ±0,5 °C |
| Akkubetrieb | ~1,5–2 h (nur bis ~10 °C möglich) | 40–60 min | ±0,5 °C (bei reduzierter Leistung) |
Die Limitation im Akkubetrieb resultiert aus dem maximalen Entladestrom (7 A @ 3,7 V) und dem Wirkungsgrad des Step-Up-Wandlers. Ein 3S-Li-Ion-Akku (11,1 V) würde das Problem lösen und den Step-Up überflüssig machen.
Zukünftige Erweiterungen
- Ersetzung des CPU-Kühlers durch passives Kühlsystem → versandfähig (95 kPa Sekundärverpackung).
- Temperaturprotokollierung (lokal oder per GSM/SMS).
- GPS-Tracking für eigenständige Paketverfolgung.
Arduino-Code (PID_LCD_controller_v03)
#include <Adafruit_MAX31865.h>
#include <MCP41_Simple.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
#include <Wire.h>
MCP41_Simple digitalPotentiometer;
const uint8_t digitalPotentiometer_CS = 10;
Adafruit_MAX31865 PT100amplifier = Adafruit_MAX31865(2, 3, 4, 5);
#define RREF 430.0
#define RNOMINAL 100.0
Adafruit_RGBLCDShield LCD_shield = Adafruit_RGBLCDShield();
int powerMode = 1; // 1 = Battery, -1 = Mains
int operationMode = 1; // 1 = Cooling, -1 = Heating
float PT100ratio;
uint8_t buttonsPressed = 0;
float kp = 500.0;
float PID_p = 0.0;
float Tmeasured = -1.0;
float Tsetpoint = 22.0;
float PID_error = 5;
float PID_value = 0;
static char TsetpointString[3];
static char TmeasuredString[4];
void setup() {
Serial.begin(115200);
Serial.println("Mr ThermoParcel, starting operation...");
PT100amplifier.begin(MAX31865_4WIRE);
digitalPotentiometer.begin(digitalPotentiometer_CS);
digitalPotentiometer.setWiper(200);
LCD_shield.begin(16, 2);
LCD_shield.print("Tsetpoint: C");
LCD_shield.setCursor(0, 1);
LCD_shield.print("Tsample: C");
}
void print_Tsetpoint(int T) {
LCD_shield.setCursor(10, 0);
dtostrf(T, 3, 0, TsetpointString);
LCD_shield.print(TsetpointString);
}
void print_Tmeasured(float T) {
LCD_shield.setCursor(8, 1);
dtostrf(T, 5, 1, TmeasuredString);
LCD_shield.print(TmeasuredString);
}
void print_powerMode() {
LCD_shield.setCursor(15, 0);
LCD_shield.print(powerMode == 1 ? "B" : "M");
}
void print_operationMode() {
LCD_shield.setCursor(15, 1);
LCD_shield.print(operationMode == 1 ? "C" : "H");
}
void loop() {
uint16_t rtd = PT100amplifier.readRTD();
PT100ratio = rtd / 32768.0;
Tmeasured = PT100amplifier.temperature(RNOMINAL, RREF);
Serial.print("Setpoint Temperature = "); Serial.println(Tsetpoint);
Serial.print("Temperature = "); Serial.println(Tmeasured);
print_Tsetpoint((int)Tsetpoint);
print_Tmeasured(Tmeasured);
print_powerMode();
print_operationMode();
PID_error = Tmeasured - Tsetpoint;
PID_p = operationMode * kp * PID_error;
PID_value = PID_p;
if (powerMode == 1) { // Battery
PID_value = constrain(PID_value, 0, 120);
} else { // Mains
PID_value = constrain(PID_value, 0, 255);
}
digitalPotentiometer.setWiper(255 - (int)PID_value);
delay(1000);
buttonsPressed = LCD_shield.readButtons();
if (buttonsPressed & BUTTON_SELECT) {
LCD_shield.setCursor(14, 0);
LCD_shield.blink();
delay(1000);
buttonsPressed = 0;
while (!(buttonsPressed & BUTTON_SELECT)) {
buttonsPressed = LCD_shield.readButtons();
if (buttonsPressed & BUTTON_UP) Tsetpoint += 1;
if (buttonsPressed & BUTTON_DOWN) Tsetpoint -= 1;
if (buttonsPressed & BUTTON_RIGHT) { powerMode *= -1; print_powerMode(); }
if (buttonsPressed & BUTTON_LEFT) { operationMode *= -1; print_operationMode(); }
print_Tsetpoint((int)Tsetpoint);
LCD_shield.setCursor(14, 0);
delay(500);
}
LCD_shield.noBlink();
}
Serial.println();
}
Schaltpläne
Im Repository finden Sie:
- Gesamtschaltbild aller Hauptkomponenten.
- Detaillierter Verdrahtungsplan („ugly“, aber funktional).
- Potentiometer-Verdrahtung im Detail.
Herstellungsprozess
- Temperaturgesteuerter Lüfter: DIY Relais-System für Medienmöbel-Kühlung
- DIY Heimbrau-Temperaturregelung: Überwachen & Steuern mit Arduino
- Präzise Thermoelement-Messung & Logging für Labor & Wissenschaftsexperimente
- Top wärmeleitende Metalle & ihre Anwendungen – Ein praktischer Leitfaden
- Wärmeableitung von Frequenzumrichtern (VFD) präzise berechnen
- High-Temperature PCB-Laminate wählen für zuverlässige Performance
- Umfassender Leitfaden zum PCB-Temperaturmanagement
- Präzisions-Wärmebehandlung für Aluminiumguss: Festigkeit & Duktilität steigern
- Legierung 36 (Invar®): Präzisions-Nickel-Eisen-Legierung mit Nahezu Nullexpansion
- Wärmebehandlung für CNC-gefertigte Metallkomponenten optimieren