Двойной термометр на ARDUINO UNO
- Подробности
- Категория: Схемы на Arduino
- Опубликовано: 27.01.2018 11:57
- Просмотров: 2400
Каравкин В.
Жизнь в частном доме имеет свои прелести и недостатки. Например, из недостатков, это самодельный водопровод, который, даже при условии хорошей теплоизоляции, может замерзнуть при температуре ниже минус 15-20 градусов. Сейчас, чтобы такого не произошло, между теплоизоляцией и трубой прокладывают греющий кабель, который питается от электросети и подогревает трубу. Но он все же потребляет электроэнергию, и желательно его включать только по мере необходимости.
Здесь приводится описание двойного термометра с функцией термостата, построенного на основе готового микроконтроллерного модуля ARDUINO UNO. Прибор работает с двумя недорогими аналоговыми термодатчиками LM35, измеряя температуру в доме, и за его пределами. Индикация - на двухстрочном ЖК-индикаторе, причем, в верхней строке индицируется температура за пределами дома (обозначена как «t1»), а в нижней строке - температура в доме (обозначена как «t2»).
Программно введен порог в минус 15 градусов по Цельсию, при опускании t1 ниже которого, включается греющий кабель посредством электромагнитного реле.
Как уже сказано, используются относительно дешевые аналоговые термодатчики LM35, которые представляют собой термозависимые стабилизаторы напряжения, выходное напряжение которых линейно зависит от температуры из расчета 10 mV на градус Цельсия. Датчик может измерять от минус 55 до плюс 150 градусов, но проблема в том, что для измерения отрицательной температуры на его выход через резистор нужно подать отрицательное напряжение. Но, на плате ARDUINO UNO есть только положительное напряжение, поэтому было решено сместить отрицательный вывод питания LM35 вверх на 0,7V (прямое напряжение на диоде КД522), как это показано на схеме на рисунке 1. Теперь для вычисления температуры нужно будет из выходного напряжения датчика программным способом вычитать 0,7V (или другое напряжение, которое будет получено в результате измерения прямого напряжения на диоде VD1 в этой схеме). Например, при температуре плюс 20 градусов на выходе будет 0,7+0,2=0,9V. А при минус 20 градусов на выходе будет 0,7+(-0,2)=0,5V.
Вычитая 0,7V получаем, в первом случае 0,9 - 0,7 = 0,2V. Во втором 0,5-0,7 = (-0.2V). Остается, перевести в градусы, умножив на 100, то есть получаем: 0,2x100=20, (-0,2)х100=(-20).
Это касается первого датчика, который располагается за пределами дома и служит для измерения как положительных, так и отрицательных температур. А вот, датчик, расположенный в доме должен измерять только положительную температуру, поэтому он работает без дополнительного источника напряжения на диоде.
Схема двойного термометра показана на рис. 2. Он предназначен для измерения двух температур, по входу t1 от минус 30 до плюс 150 градусов по Цельсию, и по входу t2 от 0 до 150 градусов по Цельсию.
Как видно из схемы, к цифровым портам D2-D7 платы ARDUINO UNO подключен модуль жидкокристаллического индикатора Н1 типа 1602А. Питается ЖК-индикатор от стабилизатора напряжения 5V, имеющегося на плате стабилизатора напряжения 5V. Напряжения с термодатчиков АТ1 и АТ2 поступают на два аналоговых входа А1 и А2. Всего аналоговых входов шесть, - А0-А5, можно было выбрать любые два из них. В данном случае, выбраны А1 и А2. Для управления греющим кабелем используется цифровой выход D12. С него управляющее напряжение поступает на транзисторный ключ на VT1, в коллекторной цепи которого включена обмотка реле К1. Контакты этого реле (на схеме не показаны) включают греющий кабель, когда на выходе D12 платы ARDUINO UNO логическая единица.
Напряжение на аналоговых входах может быть только положительным и только в пределах от нуля до напряжения питания микроконтроллера, то есть, номинально, до 5V. Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму. Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.
Но нам нужно значение не в единицах вольт, а в градусах по Цельсию. Принимая, что одному градусу соответствует
0,01V, берем деление не на 1024, а на 10,24. То есть, 5x10,24 для входа t2 (датчик АТ2) и 5x10,24-70 для входа t1 (датчик АТ1). Где число «70», это напряжение на диоде VD1, равное 0,7V и умноженное так же, на 100.
Программа на языке C++ приведена в таблице 1.
Для управления ЖК-индикатором решено было использовать порты с D2 по D7 платы ARDUINO UNO. В принципе, можно и другие порты.
Для того чтобы индикатор взаимодействовал с ARDUINO UNO нужно в программу загрузить подпрограмму для его управления. Такие подпрограммы называются «библиотеками», и в программном комплекте для ARDUINO UNO есть много разных «библиотек». Для работы с ЖК-индикатором на основе HD44780 нужна библиотека LiquidCrystal. Поэтому программа (таблица 1) начинается с загрузки этой библиотеки:
#include <LiquidCrystal.h>
Эта строка дает команду загрузить в ARDUINO UNO данную библиотеку. Затем, нужно назначить порты ARDUINO UNO, которые будут работать с ЖК-индикатором. Я выбрал порты с D2 по D7. Можно выбрать другие. Эти порты назначены строкой:
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
После чего, программа переходит собственно к работе вольтметра.
Для измерения температуры решено было использовать аналоговые входы А1 и А2. Эти входы заданы в строках:
int analogInput=1;
int analogInput1=2;
Для чтения данных с аналоговых портов используется функция analogRead
Чтение данных с аналоговых портов происходит в строках:
vout=analogRead(analogInput);
voutl=analogRead(analogInputl);
Затем, производится вычисление фактического значения температуры:
temp=vout*5.0/10.24-70;
templ=voutl*5.0/10.24;
В этих строках число 5.0 - это напряже-ние на выходе стабилизатора платы ARDUINO UNO. В идеале должно быть 5V, но для точной работы термометра это напряжение нужно предварительно измерить. Подключите источник питания и измерьте достаточно точным вольтметром напряжение +5V на разъеме POWER платы. Что будет, то и вводите в эти строки вместо 5.0, например, если будет 4.85V, строки будут выглядеть так:
temp=vout*4.85/10.24-70;
temp1=vout1*4.85/10.24;
В строке temp=vout*4.85/10.24-70; происходит определение температуры с датчика АТ1, который расположен за пределами дома и измеряет как положительную, так и отрицательную температуру. В данной сроке цифра «70» это умноженное на 100 прямое напряжение на диоде VD1. Нужно предварительно измерить фактическое прямое напряжение на VD1 и внести его в эту строку. Например, если фактическое напряжение на VD1 будет равно 0,68V, то в эту строку записываем «68» :
temp=vout*4.85/10.24-68;
Таким образом, в текст программы нужно внести изменения соответственно фактическому напряжению на выходе 5-воль-тового стабилизатора платы ARDUINO UNO и фактическому напряжению на диоде VD1.
После этого прибор будет работать точно и никакого налаживания или калибровки не потребует.
Для управления греющим кабелем используется компараторная функция if В строке:
if(temp < -15)digitalWrite(12, HIGH);
указывается, что при температуре ниже минус 15 градусов по Цельсию на порт 12 пишется логическая единица. А строке:
if(temp > -15)digitalWrite(12, LOW) ;
указывается, что при температуре выше минус 15 градусов по Цельсию на порт 12 пишется логический ноль.
Соответственно, можно задать любое другое значение температуры, при которой включается реле, например, минус 10 градусов, при этом данные строки будут выглядеть так:
if(temp < -10)digitalWrite(12, HIGH);
if(temp > -10)digitalWrite(12, LOW) ;
Далее в программе идет вывод данных на дисплей и задержка в 1 секунду на время индикации.
Датчики АТ1 и АТ2 подключаются к схеме через разъемы Х2 и ХЗ. Они выполнены на кабелях. Датчик АТ1 располагается за пределами дома и поэтому подвержен воздействиям окружающей среды. Чтобы на его работу не влияла влажность его нужно поместить в стеклянную пробирку заполненную сухим (прокаленным) речным песком, и закрыть резиновой пробкой.
Датчик АТ2 располагается внутри помещения, и для его защиты достаточно на его выводы натянуть термоусадочные трубки.
Электромагнитное реле К1 типа RAS-1215 с обмоткой на напряжение 12V и максимальный ток через контакты 15А при переменном напряжении 240V.
Литература:
1. Каравкин В. «Ёлочная мигалка на ARDUINO как средство от боязни микроконтроллеров», ж. Радиоконструктор, №11, 2016г. стр. 25-30.
2. Каравкин В. «Частотомер на ARDUINO». ж. Радиоконструктор, №12, 2016г., стр. 12-15.
3. Каравкин В. «Двойной вольтметр на ARDUINO». ж. Радиоконструктор, №1, 2017г., стр. 16-18.