Опубликовано

Термостатический охладитель напитков на модуле Пельтье

Раздел гл. 12 книги “Мейкерство. Arduino и Raspberry Pi” (автор Саймон Монк)

В этом проекте мы добавим термостатическое регулирование к проекту из разд. «Проект: охладитель напитков» главы 11, чтобы напитки могли более точно охлаждаться до нужной температуры (рис. 12.17). В главе 14 проект получит свое дальнейшее развитие — к нему будет добавлен дисплей, показывающий заданную и фактическую температуры.

Термостатический охладитель напитков в сбореРис. 12.17. Термостатический охладитель напитков в сборе

Как уже было сказано, этот проект реализуется с использованием Arduino, но учитывая, что вы уже научились использовать Raspberry Pi совместно с микросхемой DS18B20, у вас не должно возникнуть проблем и по изменению проекта под работу с Raspberry Pi.

Оборудование

Этот проект основывается на проекте из разд. «Проект: охладитель напитков» главы 11, но с добавлением в рабочий цикл платы Arduino и датчика температуры DS18B20, поэтому, если вы еще не проработали тот проект, следуйте инструкциям по его реализации, имеющимся в главе 11.

Комплектующие

В этом проекте для работы с Arduino понадобятся следующие комплектующие (табл. 12.2).

Таблица 12.2. Комплектующие для работы с Arduino в проекте по управлению термостатическим охладителем напитков

Обозначение Компонент схемы Источники
R1 Резистор 4,7 кОм Mouser: 291-4.7k-RC
R2 Резистор 1 кОм Mouser: 291-1k-RC
R3 Резистор 270 Ом Mouser: 291-270-RC
R4 Подстроечный резистор на 10 кОм Adafruit: 356

Sparkfun: COM-09806

Герметичный температурный датчик DS18B20 Adafruit: 381

eBay

Q1 МОП-транзистор FQP30N06L Mouser: 512-FQP30N06L
LED1 Зеленый светодиод Adafruit: 298

Sparkfun: COM-09650

Термоэлектрическое охлаждающее устройство на элементах Пельтье с двумя вентиляторами и с током потребления не более 4 А eBay
Переходник с круглым гнездом и винтовыми зажимами Adafruit: 368
Источник питания (12 В 5 A) Adafruit: 352
Двунаправленная клеммная колодка Магазин строительных или электротоваров
Большая емкость из-под молока или сока Б/у

Герметичный температурный датчик DS18B20 содержит точно такую же микросхему, что использовалась в экспериментах из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?» и из разд. «Эксперимент: термостатический ПИД-регулятор», за исключением того, что он поставляется в удобной водонепроницаемой капсуле с длинными проводами, которые могут быть подключены непосредственно к макетной плате.

Если потребуется задействовать более мощный элемент Пельтье, чем тот, что указан в табл. 12.2, следует воспользоваться более мощным блоком питания, чтобы его максимально допустимый ток наверняка превышал ток, потребляемый элементом. Предусмотрите, как минимум, превышение в половину ампера для вентиляторов и еще в половину ампера на всякий случай.

Схема проекта

Принципиальная схема этого проекта показана на рис. 12.18. В левой части схемы показан подстроечный резистор R4, который также называют потенциометром (см. далее врезку «Потенциометры»). Подвижный контакт потенциометра подключен к контакту A0, представляющему собой аналоговый вход Arduino (см. разд. «Аналоговые входы» главы 2). Положением ручки потенциометра на контакте A0 устанавливается напряжение, которое замеряется Arduino, а затем используется для установки нужной температуры охладителя.

Потенциометры

Компонент под названием потенциометр должен быть вам известен по регуляторам громкости радиоприемника или усилителя. У него есть ручка, вращающаяся почти на полный оборот.

Область на рис. 12.18 вокруг R4, показывает, как потенциометр используется в качестве устройства ввода данных в Arduino: верхний контакт потенциометра подключен к линии 5 В, а нижний — к заземлению, при этом на среднем контакте потенциометра напряжение в зависимости от положения ручки будет изменяться в диапазоне от 0 до 5 В.

Правая часть схемы на рис. 12.18 очень похожа на схему эксперимента из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?», за исключением того, что вместо маломощного транзистора MPSA14 используется мощный МОП-транзистор FQP30N06L. Этот транзистор способен коммутировать подводимый к охладителю ток силой 4 А и более, при этом степень его нагрева позволяет обойтись без радиатора.

Принципиальная схема термостатического охладителяРис. 12.18. Принципиальная схема термостатического охладителя

Сборка проекта

Предполагая, что вы уже реализовали проект из разд. «Проект: охладитель напитков» главы 11, для реализации этого проекта нужно выполнить лишь следующие дополнительные действия.

Шаг 1. Добавление температурного датчика

Физическая конструкция охладителя остается точно такой же, что и в проекте из разд. «Проект: охладитель напитков» главы 11, но теперь к ней добавляется температурный датчик, который следует разместить на дне контейнера — под ставящиеся на него охлаждаемые стаканы или бутылки (рис. 12.19). В данном случае я просто прикрепил датчик ко дну контейнера клейкой лентой, но лучше его все же основательно приклеить.

Добавление температурного датчикаРис. 12.19. Добавление температурного датчика

Шаг 2. Сборка схемы на макетной плате

На рис. 12.20 показана собранная на макетной плате схема, используемая для проекта, а также показаны соединения различных деталей проекта.

Схема проекта, собранная на макетной платеРис. 12.20. Схема проекта, собранная на макетной плате

Расположите компоненты на макетной плате, убедившись в правильном подключении МОП-транзистора и светодиода. Температурный датчик имеет в своем кабеле четыре провода. Провода с красной и черной изоляцией подключаются соответственно к общей линии питания (VCC) и к заземлению (GND), а провод с желтой изоляцией является цифровым выходом зонда. Четвертый провод никуда подключать не нужно.

На ручку потенциометра я наколол небольшой клочок бумаги, соорудив из него примитивную шкалу с рисками, позволяющими увидеть задаваемую температуру охладителя.

Шаг 3. Подключение охладителя

У охладителя имеются три пары проводов: две — для вентиляторов, и одна — для самого элемента Пельтье. Чтобы упростить подключение охладителя, используется двунаправленная клеммная колодка, позволяющая подключить охладитель к макетной плате всего двумя проводами (рис. 12.21).

Подключение охладителяРис. 12.21. Подключение охладителя

Шаг 4. Подключение блока питания

Переходник с круглым гнездом и винтовыми зажимами, конечно, может быть подключен к макетной плате перемычками «папа-папа». С этим вариантом можно согласиться в случае использования высококачественных проводов-перемычек относительно большого поперечного сечения, однако многие соединительные провода содержат слишком тонкие проводники, которые могут сильно нагреваться от проходящего по ним тока силой в несколько ампер. Само по себе это не создает проблем до тех пор, пока эти провода не станут сильно греться, вместо того, чтобы быть просто теплыми. Но это означает, что из 12 В на элемент Пельтье станет попадать не все напряжение, и на то, чтобы войти в рабочий режим, охладителю потребуется больше времени.

Для подключения макетной платы к переходнику питания можно вместо простых соединительных проводов-перемычек воспользоваться каким-нибудь одножильным изолированным проводом большого сечения. То же самое касается и соединительных проводов, подводимых к охладителю.

Программа для Arduino

Использование ПИД-регулятора для охладителя напитков можно посчитать излишеством. Но вопрос в данном случае упирается только в программу, поэтому на использование «крутого» алгоритма поддержки напитков в охлажденном состоянии дополнительных затрат не предвидится.

Программа этого проекта во многом похожа на ту, что использовалась в экспериментах из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?» и из разд. «Эксперимент: термостатический ПИД-регулятор», включая весь код для создания интерфейса с температурным датчиком DS18B20, поэтому, чтобы разобраться в этом коде, следует вернуться к описанию упомянутых экспериментов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
const double minTemp = 0.0; //<strong> 1</strong>
const double maxTemp = 20.0;
const float tempOKMargin = 0.5;
double kp = 1500; //<strong> 2</strong>
double ki = 50.0;
double kd = 0.0;
const int tempPin = 2;
const int coolPin = 9;
const int ledPin = 10; //<strong> 3</strong>
const int potPin = A0;
const long period = 1000; // &gt;750
OneWire oneWire(tempPin);
DallasTemperature sensors(&amp;oneWire);
double setTemp = 0.0;
double measuredTemp = 0.0;
double outputPower = 0.0;
long lastSampleTime = 0;
PID myPID(&amp;measuredTemp, &amp;outputPower,
&amp;setTemp, kp, ki, kd, REVERSE); //<strong> 4</strong>
 
void setup() {
pinMode(coolPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
sensors.begin();
myPID.SetSampleTime(1000);
myPID.SetMode(AUTOMATIC);
}
 
void loop() { //<strong> 5</strong>
long now = millis();
if (now &gt; lastSampleTime + period) {
checkTemperature();
lastSampleTime = now;
}
setTemp = readSetTempFromPot(); //<strong> 6</strong>
}
 
void checkTemperature() { //<strong> 7</strong>
measuredTemp = readTemp();
Serial.print(measuredTemp);
Serial.print(", ");
Serial.print(setTemp);
Serial.print(", ");
Serial.println(outputPower);
myPID.Compute();
analogWrite(coolPin, outputPower);
float error = setTemp - measuredTemp; //<strong> 8</strong>
if (abs(error) &lt; tempOKMargin) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
double readSetTempFromPot() { //<strong> 9</strong>
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
return temp;
}
double readTemp() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}

Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

  1. Диапазон температур, задаваемых с помощью потенциометра, устанавливается двумя константами: minTemp и maxTemp. Переменная tempOKMargin определяет значение выше или ниже заданной температуры, которое может иметь фактическая температура до того, как погаснет зеленый светодиод.
  2. Для kp установлено довольно высокое значение, чтобы включение и выключение охладителя происходило более четко. Сделано это в основном с тем, чтобы избавиться от унылого звучания моторов вентиляторов, когда они питаются в режиме низкого уровня выходной мощности. Вместо этого вентиляторы можно запитать отдельно, чтобы они постоянно работали, и заниматься только регулировкой мощности на элементе Пельтье.
  3. Определение дополнительных контактов для светодиода и потенциометра.
  4. ПИД-регулятор инициализируется в режиме REVERSE, а не DIRECT (как ранее), поскольку добавление выходной мощности будет снижать, а не повышать температуру.
  5. В основном цикле проверяется истечение секундного интервала, после чего для включения и выключения охладителя по мере надобности вызывается функция checkTemperature.
  6. При каждом прохождении цикла (которое должно осуществляться несколько раз в секунду), для установки значения переменной setTemp на основании позиции ручки потенциометра вызывается функция readSetTempFromPot.
  7. Функция checkTemperature производит измерение температуры, считывает полученные данные, а затем производит обновление ПИД-контроллера. Эта функция также записывает прочитанные данные в окно монитора порта, позволяя настроить охладитель или отследить его работу. Arduino не нуждается в подключении через порт USB, поскольку получает электропитание через свой контакт Vin, но если его подключить через порт USB, выводимые данные можно будет увидеть на экране в окне монитора порта.
  8. Остальная часть этой функции включает светодиод, если измеренная температура находится в пределах допустимого отклонения от заданной температуры, определяемого с помощью константы tempOKMargin. Функция abs (абсолютное значение) удаляет знак минуса перед числом.
  9. Код превращения позиции потенциометра в значение между minTemp и maxTemp. Необработанное аналоговое считывание (значения в диапазоне от 0 до 1023) производится в переменную raw. Затем для преобразования считанного значения в желаемый диапазон температур вызывается функция map (см. далее врезку «Функция map, используемая в Arduino»).

Функция map, используемая в Arduino

При управлении какими-либо устройствами с помощью Arduino или Raspberry Pi часто возникает проблема преобразования числа, имеющего один диапазон значений, в число в каком-нибудь другом диапазоне значений.

Например, на аналоговом входе Arduino установлен диапазон значений от 0 до 1023, и если нужно отобразить этот диапазон на температуру, например, между 0 и 20, можно просто разделить число на 51,15 (то есть, на 1023 / 20). Тогда 1023 превратится в 1023 / 51,15 = 20.

Задача усложняется, если оба диапазона начинаются не с нуля. И тут может пригодиться имеющаяся в Arduino функция map. Как далее показано, она получает пять параметров, которые преобразуют число в диапазоне от 0 до 1023 в число в диапазоне от 20 до 40:

map(value, 0, 1023, 20, 40);

Первый параметр представлен здесь значением, которое нужно преобразовать, второй и третий параметры задают диапазон имеющегося значения, а четвертый и пятый — диапазон, в котором нужно получить соответствующее значение (в данном случае, это диапазон от 20 до 40).

В языке Python отсутствует встроенная функция диапазона, но ее довольно просто создать, а затем использовать в своей программе. Она должна выглядеть примерно так:

1
2
3
4
5
6
7
8
def map(value, from_low, from_high,
to_low, to_high):
from_range = from_high -
from_low
to_range = to_high - to_low
scale_factor = from_range / to_range
return to_low + (value /
scale_factor)

Затем эту функцию на языке Python можно будет вызвать с такими же параметрами, что и у ее двойника в Arduino. Например:

map(510, 0, 1023, 20, 40)

В результате будет возвращено значение 30, которое является средним значением для диапазона от 20 до 40, точно так же, как и значение 510, которое расположено примерно посредине между значениями в диапазоне от 0 до 1023.

Добавить комментарий