Добрый день. Заканчиваю проект отопления частного дома на базе ARDUINO MEGA 2560.
Коротко о главном! Есть 9 комнат в которых установлены инфракрасные теплые полы, которые служат основным отоплением во всем доме. Датчиками проверяем температуру и решаем надо ли включить отопление или можно его выключить.
Из дополнительных обвесов LCD 2004, приёмопередатчик 2,4ГГц.
Ну а теперь обо всем по порядку и с разъяснениями.
Датчики и их подключение
В качестве датчиков я использовал старый проверенный терморезистор на 150 кОм советского образца. НА вопрос почему могу ответить просто и бескомпромиссно — цена! 15р. за штуку меня вполне устроило! Выглядит он примерно вот так:
Немного пришлось повозиться с его взаимоотношением с Ардуино но результат в итоге оказался стабильнее и надежнее при низкой цене монтажа. Тут главное не забывать что до каждого датчика от 5 до 150 метров провода.
К ардуинке датчик подключаем с помощью делителя напряжения, где А(n) это аналоговые входы МЕГИ. Датчиков у нас 9 по этому задействуем входы с А1 по А9.
Схема отличается от классической наличием конденсатора. Это маленькая хитрость про которую я не нашёл информации в сети, по этому пришлось доходить своим мозгом.
Так зачем он нужен? Провода для датчиков спрятаны в кабель канал вместе с нагрузкой в 220 вольт. При работе получается что ток в проводе дает очень большие помехи примерно в 0,5-1,5 вольта. Сами понимаете что ни о какой точности показаний речь не идет. И тут приходит на помощь конденсатор. Он просто сглаживает все помехи, но для его зарядки нужно в начале программы добавить задержку в 2-3 секунды. В сборе у меня получилось вот так:
Далее делаем такое же соединение для всех датчиков + один, чтобы прокрутить датчик для улицы. В процессе сделаем привязку в температуре за бортом. Наше устройство должно думать про свои задачи быстрее чем его владельцы. Так же для каждого датчика я делал отдельное подключение, что оказалось достаточно дорого, но надежно. Проще провод оторвать, чем соединение разомкнуть. Выглядит оно следующим образом:
Теперь что касается питания датчиков. Я не стал снимать 5 вольт с Ардуино(хотя тоже можно). Предпочитаю делать отдельное питание для таких нагрузок, все-таки провода длинные их сопротивление тоже надо учитывать. Все детали далее.
Блок питания
В качестве питания я использовал блок от старого компьютера. Он выдает 380 Вт, чего более чем достаточно, и напряжение он выдает такое, какое нужно для всего проекта.
Внутри корпуса нужно спаять зеленый и любой из черных проводов, чтобы он включался сразу при подаче електричества. К стати, совсем забыл, нашему устройуству необходим отдельны автомат на 16А. желательно с УЗО.
От него мы отрезаем все провода кроме 3-х на 5 вольт(для тех кто не в курсе это красные) и 1 на 3,3 вольта(это оранжевый), ну и по одному черному на каждый(это земля или минус, кому как нравиться). Остальное отрезаем и изолируем, за ненадобностью.
Теперь распишем по проводам какой куда нам нужен:
1 — красный, питание Ардуино,
2 — красный, датчики,
3 — красный, LCD2004,
4 — оранжевый, приёмопередатчик 2,4ГГц
Я запитал ардуино от 5 вольт. Этого в принципе достаточно для работы МК и установки необходимого напряжения на цифровых пинах, но при таком подключении мощности для LCD не хватит. По этому я вывел для него отдельное питание, так оно надежнее.
LCD 2004
Как подключать LCD рассказывать не буду. Вот тут все вполне понятно написано. Только 5 В не с ардуино, а с блока питания.
Приёмопередатчик 2,4ГГц
Про передачу данных и свой опыт работы с ней я буду описывать в следующей статье. Здесь мы рассмотрим автономную работу устройства. Далее будем делать передачу статистики на сайт и изменение настроек через интернет.
Исполнительные устройства
В качестве реле для исполнительных устройств настоятельно рекомендую использовать твердотельное реле:
У меня получилось смонтировать примерно вот так:
На словах схема подключения достаточно проста. 3 пин подключаем в цифровому выводу ардуино, который будем программно включать и выключать. 4 пин на GND ардуино. 1 пин Фаза 220 вольт. 2 пин к исполнительному устройству. Ноль от исполнителей соединяем в общую кучу и на ноль автоматического выключателя.
Использовать модули реле такого плана не советую. В общем я изначально на них и собрал, после чего пришлось выбросить. Не удосужился рассчитать нагрузки. При нормальной работе эти реле самым банальным образом залипают.
Аруино Мега и Скетч
Перейдем к работе с МК и написанию скетча.
Подключаем библиотеку LCD2004.
//подключение библиотеки LCD-экрана #include <LiquidCrystal.h> //указываем пины LCD LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
Пины отличаются от статьи, по этому подключите все правильно.
Объявляем переменные и константы:
//переменная выбора комнаты byte RoomNomber = 0; //колличество подключенных комнат byte RoomNomberEnd = 9; //выходы реле отопления цыфровые выходы byte pinOutputRoom[9] = {22,23,24,25,26,27,28,29,30}; //аналоговые входы датчиков byte pinInputTemp[9] = {1,2,3,4,5,6,7,8,9}; //индекс счетчика byte i=1;
Переменные для работы с температурой. Тут нужно пояснение у каждого эти показания будут свои в зависимости от резисторов и конденсатора. В моем случае показания 310 были на аналоговом входе при темперауре терморезистора 30 градусов цельсия. У вас они могут отличаться. И эти параметры мы будем менять с сайта.
//Температура пола int tempEtalon[9] = {310,310,310,310,310,310,310,310,310}; //Коэффициент включения и выключения byte deltaTemp = 10; // температура пола int temp=0;
Далее объявляем переменные для позиционирования на экране
//расположение элементов на LCD X для setup byte PX[3] = {0,7,13}; //расположение элементов на LCD Y для setup byte PY[3] = {1,2,3}; //расположение элементов на LCD X для программы byte PosX[9] = {2,9,15,2,9,15,2,9,15}; //расположение элементов на LCD Y для программы byte PosY[9] = {1,1,1,2,2,2,3,3,3};
Следующим шагом прописываем в setup подключение экрана и расположение элементов на нём:
Serial.begin(9600); //вкуючение LCD lcd.begin(20,4); lcd.setCursor(5,0); lcd.print("Hot Floor"); //расположение елементов на экране for(iy=0; iy<3; iy++){ for(ix=0; ix<3; ix++){ lcd.setCursor(PX[ix],PY[iy]); lcd.print(i); lcd.print(":"); i++; delay(100); } } i=0; Serial.println("LCD2004 On"); //Задержка для конденсаторов датчики температуры delay(2000);
Так же в setup объявляем цифровые выходы для реле
//объявляем цифровые выходы для реле нагрузки for (RoomNomber=0; RoomNomberС настройками закончили. Теперь текст самой программы:
//сброс индекса комнаты по завершению цикла if (RoomNomber==RoomNomberEnd){ RoomNomber = 0; //задержка цикла на 1 секунду delay(1000); }Сама программа работает как классический термостат. Код приведен ниже:
temp = analogRead(pinInputTemp[RoomNomber]); lcd.setCursor(PosX[RoomNomber],PosY[RoomNomber]); if (temp<(tempEtalon[RoomNomber]-deltaTemp)){ //включаем реле digitalWrite (pinOutputRoom[RoomNomber],HIGH); //выводим информацию на LCD lcd.setCursor(PosX[RoomNomber],PosY[RoomNomber]); lcd.print("ON "); //выводим сообщение в серийный порт Serial.print("Room"); Serial.print(RoomNomber+1); Serial.println(" ON"); } if (temp>(tempEtalon[RoomNomber]+deltaTemp)){ //отключаем реле digitalWrite (pinOutputRoom[RoomNomber],LOW); //выводим информацию на LCD lcd.setCursor(PosX[RoomNomber],PosY[RoomNomber]); lcd.print("OFF"); //выводим сообщение в серийный порт Serial.print("Room"); Serial.print(RoomNomber+1); Serial.println(" OFF"); } RoomNomber++;На этом первая статья закончена. Продолжение следует...