Системы автоматизация дома (системы "умного дома") всегда волновали многих любителей электроники. Ведь дистанционно, не вставая с кровати, включать различные устройства, работающие от сети переменного тока, для многих является очевидным достижением в деле повышения комфорта своего жилища. Всего лет 20 тому назад создание систем для "умного дома" было достаточно сложным занятием и было уделом лишь избранным. А сейчас, с появлениям таким замечательных модулей как ESP8266, простейшую систему автоматизации дома может сконструировать любой начинающий радиолюбитель.
В данной статье мы рассмотрим создание умной распределительной коробки (Junction Box) на основе модуля ESP8266, переключателями в которой можно будет управлять дистанционно, с использованием смартфона или компьютера, имеющего выход в сеть Интернет. Наша распределительная коробка сможет управлять включением/выключением двух устройств переменного тока, чей ток потребления не превышает 5A, соответственно, потребляемая мощность этих устройств не должна превышать 800 Вт. В дальнейшем вы можете усовершенствовать данный проект – количество управляемых устройств можно увеличить с помощью использования более "продвинутого" (с большим количеством контактов) модуля ESP, а потребляемую нагрузкой мощность можно увеличить используя более мощные реле.
В данном проекте мы будем программировать модуль ESP8266 с помощью Arduino IDE. Также вы можете прочитать статью про начало работы с модулем ESP8266 если вы начинающий в этих вопросах.
Если вас заинтересовала тематика "умного" дома, то на нашем сайте вы можете посмотреть все проекты, посвященные автоматизации дома. На момент написания данной статьи наиболее популярными из этих проектов были следующие:
- автоматизация дома на Raspberry Pi с управлением с веб-страницы;
- управление светом в доме с помощью сенсорного датчика и Arduino;
- автоматическая регулировка температуры в доме с помощью терморезистора и Arduino;
- автоматизация дома на Arduino под управлением смартфона.
Необходимые компоненты
- Модуль ESP8266 (купить на AliExpress).
- Плата FTDI (для программирования модуля) (купить на AliExpress).
- Реле на 3V 5A – 2 шт.
- Модуль преобразования AC-DC 5V/700mA или более.
- Транзистор BC547 – 2 шт. (купить на AliExpress).
- Регулятор напряжения LM317 (купить на AliExpress).
- Резисторы 220 и 360 Ом (купить на AliExpress).
- Конденсаторы 0,1 мкФ (купить на AliExpress) и 10 мкФ (купить на AliExpress).
- Диод 1N007 – 2 шт.
- Распределительная коробка.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема умной распределительной коробки на основе модуля ESP8266 представлена на следующем рисунке.
В представленной схеме модуль преобразователя напряжения (AC to DC converter module) используется для преобразования переменного напряжения 220 В в постоянное напряжение 5 В. Модуль должен выдерживать ток не менее 700mA. Поскольку наш модуль ESP8266 работает от 3.3V, нам необходимо преобразовать напряжение 5V в напряжение 3.3V. В нашей схеме эту задачу выполняет микросхема регулятора напряжения LM317. Для управления нагрузкой переменного тока в нашей схеме используются электромагнитные реле, для управления которыми достаточно напряжения 3V, а управлять они могут потребителями переменного тока и выдерживают ток до 5A. Для управления самими реле мы использовали NPN транзисторы BC547, состояние которых переключается с контактов модуля ESP8266.
Поскольку модуль ESP8266 имеет в составе контакты ввода/вывода общего назначения (GPIO), то с их помощью достаточно легко управлять состоянием подключенных к ним транзисторам. Но при этом необходимо учитывать следующие особенности работы с модулями ESP8266:
- Модуль ESP8266-01 имеет два контакта GPIO, которые имеют обозначение GPIO0 и GPIO2 соответственно.
- Максимальный входной ток для контактов GPIO модуля равен 12mA.
- Максимальный выходной ток для контактов GPIO модуля равен 20mA.
- Из-за малой величины тока на контактах GPIO модуля с них нельзя непосредственно управлять реле, обязательно нужна дополнительная схема управления (в нашем случае на транзисторе).
- Во время подачи питания на модуль к контактам GPIO не должно быть подключено никакой нагрузки, иначе модуль может зациклиться на петле сброса (reset loop).
- Слишком большой ток на контактах GPIO может повредить модуль, будьте осторожны.
Для преодоления отмеченных недостатков модуля ESP8266 мы использовали транзисторы BC547 чтобы с их помощью управлять реле с контактов модуля. Мы использовали переключатель между землей (ground) и эмиттером транзистора BC547. Данный переключатель должен находиться в разомкнутом состоянии когда мы подаем питание на модуль ESP8266, затем его можно замкнуть и оставить в таком состоянии.
Автор проекта (ссылка на оригинал приведена в конце статьи) спаял схему проекта на куске перфорированной платы, вы можете использовать любую другую плату, однако убедитесь в том, что конструкция вашего проекта поместится внутри распределительной коробки.
Преобразователь AC-DC
Для работы нашего проекта необходим преобразователь переменного тока в постоянный (AC-DC converter), его выходное напряжение должно составлять 5V, он должен выдерживать в течение длительного времени ток 700mA и пиковый ток 800mA. Такой преобразователь сейчас достаточно просто купить в готовом виде, например, на Aliexpress.
После сборки схемы проекты на перфорированной плате у вас должна получиться конструкция примерно следующего вида.
Как вы могли уже, наверное, заметить, автор проекта использовал контактные колодки с 2 (3) выводами. Один из этих выводов подключается к контакту +V преобразователя AC-DC, а другие 2 вывода используются для подключения потребителей переменного тока к реле.
Наша распределительная коробка имеет 3 вывода (точек подключения). Один из этих выводов (правый) используется для подачи питания на модуль преобразователя AC-DC, а два других – для подключения потребителей переменного тока. Как вы можете видеть, нейтральный провод (черного цвета) подключен ко всем 3-м точкам подключения. Но фазовый провод (желтого цвета) оставлен свободным. Фазовые концы двух других точек подключения (провода красного цвета) также оставлены свободными.
Перфорированная плата, на которой автор собрал схему проекта, точно поместилась внутрь распределительной коробки, он надеется, что и у вас все получится аналогичным образом. После того как все соединения в схеме сделаны, можно загружать программу в модуль ESP, закреплять его на перфорированной плате и скреплять распределительную коробку болтами.
Объяснение программы для модуля ESP8266
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Программа написана и загружена в модуль с помощью среды Arduino IDE.
Модуль ESP8266 в нашем проекте будет работать как станция и как точка доступа. Когда он будет работать как станция (Station) ему необходимо будет подключаться к роутеру. В следующих строчках кода задаются SSID (сетевой идентификатор) и password (пароль) для нашего роутера. Измените эти строки в соответствии с используемым вами роутером.
1 2 3 |
const char* ssid = "BPAS home"; //Enter you Wifi SSID here const char* password = "cracksun"; //Enter your password here |
Когда мы будем подключаться к IP адресу модуля, на экране нашего устройства (смартфон или компьютер) будет отображаться веб-страница, написанная на HTML. Код этой страницы формируется с помощью кода нашей программы, написанной в Arduino IDE. Чтобы проверить корректность формируемого HTML кода (для целей отладки) вы можете скопировать и вставить его в текстовый файл и открыть его как HTML файл.
1 2 3 4 5 |
mainPage += "<h1 align=\"center\">Smart Junction Box</h1><h2 align=\"center\">by CircuitDigest</h2><h1 align=\"center\"><p>Switch 1 <a href=\"switch1On\"><button>ON</button></a> <a href=\"switch1Off\"><button>OFF</button> </a></p>"; mainPage += "<p>Switch 2 <a href=\"switch2On\"><button>ON</button></a> <a href=\"switch2Off\"><button>OFF</button> </a></p>"; feedback = "<h3 align=\"center\">Both Switch 1 and switch 2 are OFF</h3>"; |
Также мы будем использовать монитор последовательного порта (Serial monitor) для тестирования работы нашей программы. Мы будем выводить в окно монитора последовательной связи символы “.” до тех пока модуль ESP8266 не установит соединение с роутером. Когда соединение с роутером будет установлено, мы получим IP адрес нашего веб-сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); |
Когда мы будем знать IP адрес, мы сможем получить доступ к HTML коду страницы используя наш браузер. Когда на открывшейся в нашем браузере веб-странице мы будем нажимать какую-нибудь кнопку, то соответствующий запрос будет передаваться модулю ESP8266 как клиенту. На основе этого клиентского запроса модуль будет формировать свой ответ. К примеру, если модуль получит клиентский запрос “/switchOn”, то он будет обновлять HTML код веб-страницы, передавать его клиенту и подавать на контакт GPIO напряжение высокого уровня (HIGH). Для каждого выполняемого действия в нашей программе запрограммирована функция server.on().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server.on("/switch1On", [](){ feedback = "<h3 align=\"center\">Switch 1 turned ON</h3>"; currentPage=mainPage+feedback; server.send(200, "text/html", currentPage); currentPage=""; digitalWrite(GPIO_0, HIGH); delay(1000); }); |
Тестирование работы проекта
Когда аппаратная и программная части проекта будут готовы, вы можете приступать к его тестированию. Загрузите программу проекта в модуль ESP8266 и откройте монитор последовательной связи (serial monitor) в Arduino IDE. Если вы указали в программе правильные SSID и пароль для роутера, то в окне монитора последовательной связи вы должны увидеть следующую картину:
Запишите IP адрес, который вы увидите в окне монитора последовательной связи. Нам необходимо будет вводить этот IP адрес в браузере чтобы получить доступ к веб-странице, формируемой модулем ESP8266. В нашем случае мы получили IP адрес http://192.168.2.103/.
После этого вы можете поместить модуль ESP8266 на перфорированную плату и затем поместить всю конструкцию проекта внутрь распределительной коробки. Если все работает так, как надо, то после ввода IP адреса в своем браузере вы на его экране должны увидеть следующую картину:
После этого на данной странице вы можете включать/выключать (ON/OFF) необходимый вам переключатель (switch) и это будет вызывать изменения в работе проекта. Для того, чтобы таким образом дистанционно включать/выключать необходимые вам потребители переменного тока, вам необходимо просто подключить их к точкам подключения на распределительной коробке.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Также на нашем сайте вы можете посмотреть продолжение данного проекта, в который добавлена возможность голосового управления домашними устройствами.
Исходный код программы (скетча)
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/*Program for : Smart Junction box for Home Automation * Program by :Aswinth Raj * Published on : circuitdigest.com * Dated:11-05-2017 */ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> MDNSResponder mdns; const char* ssid = "BPAS home"; //Enter you Wifi SSID here (введите ваш идентификатор) const char* password = "cracksun"; //Enter your password here (введите ваш пароль) ESP8266WebServer server(80); String mainPage = ""; //The default page (страница по умолчанию) String feedback = ""; //Gives staus of the switch (состояние переключателя) String currentPage = ""; //Combines main and feedback page (объединяем главную и страницу с ответом) int GPIO_0 = 0; //Pin defanition int GPIO_2 = 2; //Pin defanition void setup(void){ mainPage += "<h1 align=\"center\">Smart Junction Box</h1><h2 align=\"center\">by CircuitDigest</h2><h1 align=\"center\"><p>Switch 1 <a href=\"switch1On\"><button>ON</button></a> <a href=\"switch1Off\"><button>OFF</button> </a></p>"; mainPage += "<p>Switch 2 <a href=\"switch2On\"><button>ON</button></a> <a href=\"switch2Off\"><button>OFF</button> </a></p>"; feedback = "<h3 align=\"center\">Both Switch 1 and switch 2 are OFF</h3>"; currentPage = mainPage+feedback; // preparing GPIOs (подготавливаем контакты) pinMode(GPIO_0, OUTPUT); digitalWrite(GPIO_0, LOW); pinMode(GPIO_2, OUTPUT); digitalWrite(GPIO_2, LOW); delay(1000); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection (ждем соединения) while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (mdns.begin("esp8266", WiFi.localIP())) { Serial.println("MDNS responder started"); } server.on("/", [](){ currentPage = mainPage+feedback; server.send(200, "text/html", currentPage); currentPage = ""; }); server.on("/switch1On", [](){ feedback = "<h3 align=\"center\">Switch 1 turned ON</h3>"; currentPage=mainPage+feedback; server.send(200, "text/html", currentPage); currentPage=""; digitalWrite(GPIO_0, HIGH); delay(1000); }); server.on("/switch1Off", [](){ feedback = "<h3 align=\"center\">Switch 1 turned OFF</h3>"; currentPage=mainPage+feedback; server.send(200, "text/html", currentPage); currentPage=""; digitalWrite(GPIO_0, LOW); delay(1000); }); server.on("/switch2On", [](){ feedback = "<h3 align=\"center\">Switch 2 turned ON</h3>"; currentPage=mainPage+feedback; server.send(200, "text/html", currentPage); currentPage=""; digitalWrite(GPIO_2, HIGH); delay(1000); }); server.on("/switch2Off", [](){ feedback = "<h3 align=\"center\">Switch 2 turned OFF</h3>"; currentPage=mainPage+feedback; server.send(200, "text/html", currentPage); currentPage=""; digitalWrite(GPIO_2, LOW); delay(1000); }); server.begin(); Serial.println("Smart Junction Box is up and running"); } void loop(void){ server.handleClient(); } |