В этом проекте мы добавим термостатическое регулирование к проекту из разд. «Проект: охладитель напитков» главы 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; // >750 OneWire oneWire(tempPin); DallasTemperature sensors(&oneWire); double setTemp = 0.0; double measuredTemp = 0.0; double outputPower = 0.0; long lastSampleTime = 0; PID myPID(&measuredTemp, &outputPower, &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 > 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) < 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); } |
Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
- Диапазон температур, задаваемых с помощью потенциометра, устанавливается двумя константами: minTemp и maxTemp. Переменная tempOKMargin определяет значение выше или ниже заданной температуры, которое может иметь фактическая температура до того, как погаснет зеленый светодиод.
- Для kp установлено довольно высокое значение, чтобы включение и выключение охладителя происходило более четко. Сделано это в основном с тем, чтобы избавиться от унылого звучания моторов вентиляторов, когда они питаются в режиме низкого уровня выходной мощности. Вместо этого вентиляторы можно запитать отдельно, чтобы они постоянно работали, и заниматься только регулировкой мощности на элементе Пельтье.
- Определение дополнительных контактов для светодиода и потенциометра.
- ПИД-регулятор инициализируется в режиме REVERSE, а не DIRECT (как ранее), поскольку добавление выходной мощности будет снижать, а не повышать температуру.
- В основном цикле проверяется истечение секундного интервала, после чего для включения и выключения охладителя по мере надобности вызывается функция checkTemperature.
- При каждом прохождении цикла (которое должно осуществляться несколько раз в секунду), для установки значения переменной setTemp на основании позиции ручки потенциометра вызывается функция readSetTempFromPot.
- Функция checkTemperature производит измерение температуры, считывает полученные данные, а затем производит обновление ПИД-контроллера. Эта функция также записывает прочитанные данные в окно монитора порта, позволяя настроить охладитель или отследить его работу. Arduino не нуждается в подключении через порт USB, поскольку получает электропитание через свой контакт Vin, но если его подключить через порт USB, выводимые данные можно будет увидеть на экране в окне монитора порта.
- Остальная часть этой функции включает светодиод, если измеренная температура находится в пределах допустимого отклонения от заданной температуры, определяемого с помощью константы tempOKMargin. Функция abs (абсолютное значение) удаляет знак минуса перед числом.
- Код превращения позиции потенциометра в значение между 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.
Вам могут понадобиться
-
Теплоизоляционная хлопковая прокладка для термоэлектрического охладителя Пельтье TEC1-12706
20₽16₽ -
Термоэлектрический охладитель Пельтье TEC1-12703 12V3A 12 В 30*30 мм
280₽224₽ -
Термоэлектрический охладитель Пельтье TEC1-12706 12В 6А 40 х 40 мм
250₽200₽ -
Датчик температуры и влажности воздуха DHT11
120₽96₽