CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Теплый пол во всем доме

Добрый день. Заканчиваю проект отопления частного дома на базе 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<RoomNomberEnd; RoomNomber++){
  //Пин комнаты объявляем как вывод
  pinMode(pinOutputRoom[RoomNomber],OUTPUT);
  //задаем низкий уровень (отключаем реле)
  digitalWrite(pinOutputRoom[RoomNomber],LOW);
  Serial.print("digitalPin ");
  Serial.print(pinOutputRoom[RoomNomber]); 
  Serial.println(" - OUTPUT config OFF");
  }
RoomNomber=0;

С настройками закончили. Теперь текст самой программы:

//сброс индекса комнаты по завершению цикла
  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++;


На этом первая статья закончена. Продолжение следует…
  • 0
  • 27 марта 2017, 20:25
  • Ficha

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.