Точный термостатируемый контейнер для перевозки образцов с датчиком PT-100 и Arduino UNO
Компоненты и материалы
- Датчик температуры PT100 (RTD) — 1 шт.
- Arduino UNO — 1 шт.
- Литий-ионный аккумулятор 10400 мАч (3,7 В) — 1 шт.
- Полистироловый короб (250×250×250 мм, стенки 45 мм) — 1 шт. (вторичная упаковка UN3373)
- Два медных блока (80×50×10 мм) под радиаторы и тепловые трубы — 1 компл.
- Регулируемый понижающий DC-DC преобразователь PTN78020W — 1 шт.
- Тепловые трубы (heat pipes) — 1 компл.
- Цифровой потенциометр MCP41100 (100 кОм) — 1 шт.
- Термопроводящий гель (Magic Gel) — 1 шт.
- DC-DC повышающий преобразователь XL6019 — 1 шт.
- Пелтье-элемент (TEC) — 1 шт. (3,9 А, 7,6 В макс.)
- Конденсатор 3,3 мкФ — 1 шт.
- Блок питания от сети 12 В — 1 шт.
- Разъемы DC (разъем питания, сплиттер) — 1 компл.
- Экран Adafruit RGB LCD Shield 16×2 — 1 шт.
- Нагревательный коврик — 1 шт.
- Клеммники 3 и 5pin — по 1 шт.
- Переключатели: 4-полюсный двухпозиционный, 1-полюсный двухпозиционный — по 1 шт.
- Пластиковые корпуса для электроники (внутренний и внешний) — по 1 шт.
- Двусторонняя липучка DualLock — 1 шт.
- Adafruit Proto-ScrewShield — 1 шт.
- Зарядное устройство Adafruit Li-ion USB — 1 шт.
- Усилитель PT100 Adafruit MAX31865 — 1 шт.
Инструменты
- Паяльник
- Дремель 4000
- Шуруп
- Дрель
- Инструмент для стрижки кабелей, плоскогубцы, кусачки
- Ручная фрезерка (для обработки меди)
Программное обеспечение и библиотеки
- Arduino IDE
- GitHub: библиотека MCP41100 (sleemanj), библиотеки Adafruit для MAX31865, RGB LCD Shield, MCP23017
О проекте: Mr ThermoParcel
Цель: создание контейнера для безопасной перевозки температурно-чувствительных биологических образцов (крови, клеток, ферментов) обычной почтовой службой. Рабочий диапазон: 4–37 °C. Питание: сеть 12 В, встроенный аккумулятор или автомобильная зарядка (сигаретная зажигалка).
История проекта
Проблема: доставка редких образцов крови для исследования малярии. Заморозка повреждает образцы, курьерские службы дороги и ненадежны (задержки на складе). Решение — автономный термостатируемый контейнер.
Концепция
Полистироловый короб с внутренним пластиковым блоком (два фалькона 50 мл как вторичная упаковка). Охлаждение — Пелтье-элемент: холодная сторона контактирует с медной пластиной внутри камеры, горячая — через тепловые трубы с внешним радиатором (CPU cooler). Нагрев — нагревательный коврик внутри камеры. Температура контролируется PT100-датчиком в контакте с образцами. PID-регулятор на Arduino управляет мощностью Пелтье/нагрева через цифровой потенциометр, задающий опорное напряжение на PTN78020W.
Реализация
Конструкция контейнера
Внутренний корпус 125×70×40 мм вмещает два фалькона 50 мл с пробирками Эппендорфа 2 мл. Образцы разделены впитывающим материалом. Для улучшения термоконтакта и равномерности температуры пространство заполнено твердеющим диэлектрическим гелем.
Система охлаждения и нагрева
PT100 в 4-проводной схеме подключен к MAX31865. Пелтье управляется через PTN78020W: выходное напряжение (2,5–12,6 В) задается сопротивлением между пинами регулирования. MCP41100 (SPI) меняет это сопротивление по команде Arduino. Нагревательный коврик — просто резистивная нагрузка, питание которой регулируется тем же способом. Переключение режима охлаждение/нагрев — механическим тумблером.
Электроника и питание
- От сети: 12 В → PTN78020W → Пелтье/нагреватель. Arduino питание от Vin (12 В).
- От аккумулятора: 3,7 В → XL6019 (boost до 10–12 В) → PTN78020W. Arduino питание от выхода XL6019 через джек.
- Цифровой потенциометр MCP41100 подключен по SPI (CS=10). MAX31865 — по программному SPI (CS=2, DI=3, DO=4, CLK=5). LCD Shield — по I2C.
Программное обеспечение
PID-регулятор с только P-составляющей (kp=500). I и D исключены из-за большой теплоемкости системы (скорость изменения ~0,02 °C/с). Уставка задается кнопками LCD Shield. Режим питания (батарея/сеть) и режим работы (охлаждение/нагрев) переключаются кнопками LEFT/RIGHT в меню редактирования (SELECT). В батарейном режиме PID ограничен 120 из 255 для защиты аккумулятора от перетока.
Результаты
- От сети: охлаждение до 4 °C за ~1 ч (20 °C за 20 мин), нагрев до 37 °C за ~10 мин. Стабильность ±0,5 °C.
- От аккумулятора: мин. ~10 °C за 1,5–2 ч, нагрев до 37 °C за 40–60 мин. Ограничение по току разряда (7 А макс. на 3,7 В).
Перспективы
Замена активного радиатора на пассивный, 95 кПа упаковка для авиаперевозок, логирование температуры (SD/GSM), GPS-трекинг.
Код (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=батарея, -1=сеть
int operationMode = 1; // 1=охлаждение, -1=нагрев
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);
PID_error = Tmeasured - Tsetpoint;
PID_p = operationMode * kp * PID_error;
PID_value = (int)PID_p;
if (powerMode == 1) {
PID_value = constrain(PID_value, 0, 120);
} else {
PID_value = constrain(PID_value, 0, 255);
}
digitalPotentiometer.setWiper(255 - (int)PID_value);
print_Tsetpoint((int)Tsetpoint);
print_Tmeasured(Tmeasured);
print_powerMode();
print_operationMode();
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();
buttonsPressed = 0;
}
Serial.println();
}
Схемы
Основная принципиальная схема и разводка проводов (две фотографии) доступны в разделе Schematics оригинала. Вторая схема — «рабочая» разводка, может быть полезна для понимания реальных соединений.
Производственный процесс
- Температурно-управляемый вентилятор: DIY релейная система охлаждения мебели для медиа
- Самодельная система термостатирования для домашнего пивоварения: мониторинг и регулирование на Arduino
- Точное измерение и логирование термопар для лабораторных и научных экспериментов
- Топ теплопроводящих металлов и их применения — практическое руководство
- Как точно рассчитать тепловыделение для ЧРП (VFD)
- Выбор высокотемпературных ламинатов PCB для надежной производительности
- Подробное руководство по управлению температурой печатных плат
- Точная термическая обработка алюминиевых литьев: повышение прочности и пластичности
- Сплав 36 (Invar®): никельно-железный сплав с почти нулевым тепловым расширением
- Оптимизация термической обработки для CNC-обработанных металлических компонентов