В этой статье мы рассмотрим систему управления домашней автоматикой (умный дом) по Wi-Fi и голосом на основе платы NodeMCU ESP8266 и смартфона на операционной системе Android. Мы разработаем наше собственное приложение на Android-смартфоне для управления нашими домашними устройствами локально (с помощью кнопок или голоса).
В этом проекте мы будем с помощью 4-канального реле и модуля NodeMCU ESP8266 12E Wifi управлять 4 различными светодиодами. Эти 4 различных светодиода похожи на 4 различных бытовых прибора. Мы будем использовать приложение Android с 5+5 кнопками ВКЛ+ВЫКЛ для отправки сигнала на NodeMCU с целью управления выходом реле. У каждого NodeMCU есть определенный IP-адрес. Мы назначим этот IP-адрес приложению Android для управления доступом. Аналогично, NodeMCU необходимо подключить к локальной Wi-Fi точке доступа.
Ранее на нашем сайте мы уже рассматривали достаточно много различных проектов автоматизации дома на основе различных микроконтроллеров (плат), наиболее популярными среди которых являются следующие:
- автоматизация дома на Raspberry Pi с управлением с веб-страницы;
- управление светом в доме с помощью сенсорного датчика и Arduino;
- автоматическая регулировка температуры в доме с помощью терморезистора и Arduino;
- автоматизация дома на Arduino под управлением смартфона.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- 4-канальный релейный модуль.
- Светодиод 5 мм – 4 шт. (купить на AliExpress).
- Резистор 220 Ом – 4 шт.
- Блок питания 5 В.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Блок-схема проекта
Вот блок-схема для этого проекта «Wi-Fi и голосовое управление домашней автоматикой с использованием NodeMCU ESP8266». Она проста и понятна.
NodeMCU сопряжен с 4-канальным реле с помощью контактов GPIO NodeMCU. Выходной контакт NodeMCU подключен к 4 различным светодиодам через резистор 220 Ом. NodeMCU подключен к локальному Wi-Fi и способен принимать сигнал через Интернет.
На Android-устройстве установлено приложение Android «Home Automation Control». Для управления входом/выходом NodeMCU IP-адрес NodeMCU вводится в поле IP-адрес приложения Android.
После завершения настройки вы сможете управлять приложением Android, находясь в любой точке мира. Ваш телефон Android выступает в качестве пульта дистанционного управления, а NodeMCU — в качестве приемника, а сигнал передается через Интернет.
Принципиальная схема проекта
Схема домашней автоматизации с управлением через Wi-Fi и голосом на NodeMCU ESP8266 и Android представлена на следующем рисунке.
Мы будем использовать 4-канальный релейный модуль для управления 4 светодиодами, имитируя 4 домашних устройства.
Подключите входные контакты реле к NodeMCU следующим образом.
1 2 3 4 |
NodeMCU GPIO Pin 1 - Relay Input Pin 1 NodeMCU GPIO Pin 3 - Relay Input Pin 2 NodeMCU GPIO Pin 12 - Relay Input Pin 3 NodeMCU GPIO Pin 14 - Relay Input Pin 4 |
Аналогично подключите 4 выхода к 4 разным светодиодам через 4 резистора, как показано на рисунке выше.
Печатная плата для проекта
Если вы не хотите собирать схему на макетной плате, а хотите печатную плату для проекта, то вот печатная плата для вас. Печатная плата для проекта домашней автоматизации разработана с использованием онлайн-инструмента проектирования схем и печатных плат EasyEDA. Передняя и задняя стороны печатной платы показаны ниже.
Файл Gerber для изготовления данной печатной платы вы можете скачать по следующей ссылке.
Приложение Android для нашего проекта
Приложение Android отправит строку, которая должна быть интерпретирована кодом для активации каждого из реле, определенных следующим образом:
Реле1:
Включение: «r1on»;
Выключение: «r1off»;
Реле2:
Включение: «r2on»;
Выключение: «r2off»
Реле3:
Включение: «r3on»;
Выключение: «r3off»
Реле4:
Включение: «r4on»;
Выключение: «r4off»
Если приложение Android отправляет команду: «r1on», Relay1 должен быть включен. Мы также определили «групповые команды» для включения («allon») и выключения («all off») всех устройств одновременно. Аналогично, также дается изображение голосового ввода, при нажатии на которое появляется всплывающее окно для Google Assistant, чтобы принять голосовую команду.
Создание приложения для Android с использованием MIT App Inventor
Этот шаг необязателен. Я дал ссылку ниже для прямой загрузки приложения Android. Я также добавил ссылку .aia, которую можно напрямую загрузить и изменить в соответствии с вашими потребностями.
Чтобы создать приложение для Android, посетите http://ai2.appinventor.mit.edu/ и создайте проект. На нашем сайте вы также можете более подробно узнать как создать собственное приложение Android для проекта Arduino с помощью MIT App Inventor.
Основные компоненты на экране показаны на рисунке выше:
Внутренняя кнопка содержит переключатель включения-выключения для реле, а также голосовую команду ввода, как показано на рисунке ниже. Вы можете посмотреть видео ниже для получения более подробной информации.
Ссылка для скачивания приложения для Android
Если вы новичок и не хотите создавать приложение для Android, вы можете просто скачать приложение по ссылке ниже.
Код для определения IP-адреса устройства
Просто скопируйте этот код и загрузите его в Arduino IDE. После загрузки кода просто откройте Serial Monitor (окно монитора последовательной связи) и получите IP адрес платы. Скопируйте этот IP, так как он требуется для вашего приложения Android.
ПРИМЕЧАНИЕ: во время загрузки кода отсоедините контакт питания реле.
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 |
#include <ESP8266WiFi.h> WiFiClient client; WiFiServer server(80); const char* ssid = "how2electronics"; const char* password = "12345678"; void setup() { Serial.begin(115200); connectWiFi(); server.begin(); } void loop() { } /* connecting WiFi */ void connectWiFi() { Serial.println("Connecting to WIFI"); WiFi.begin(ssid, password); while ((!(WiFi.status() == WL_CONNECTED))) { delay(300); Serial.print(".."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("NodeMCU Local IP is : "); Serial.print((WiFi.localIP())); } |
Исходный код основной программы
Скомпилируйте и загрузите этот код на плату NodeMCU.
ПРИМЕЧАНИЕ: во время загрузки кода отсоедините контакт питания реле.
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 96 97 98 99 100 101 102 |
#include <ESP8266WiFi.h> WiFiClient client; WiFiServer server(80); const char* ssid = "how2electronics"; const char* password = "alhabibi"; String command =""; // Command received from Android device // Set Relay Pins int relay1 = 1; int relay2 = 3; int relay3 = 12; int relay4 = 14; void setup() { Serial.begin(115200); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); digitalWrite(relay1,HIGH); digitalWrite(relay2,HIGH); digitalWrite(relay3,HIGH); digitalWrite(relay4,HIGH); connectWiFi(); server.begin(); } void loop() { client = server.available(); if (!client) return; command = checkClient (); if (command == "r1on" || command == "turn on relay 1" || command == "relay 1 on") digitalWrite(relay1,0); else if (command == "r1off" || command == "turn off relay 1" || command == "relay 1 off") digitalWrite(relay1,1); else if (command == "r2on" || command == "turn on relay 2" || command == "relay 2 on") digitalWrite(relay2,0); else if (command == "r2off" || command == "turn off relay 2" || command == "relay 2 off") digitalWrite(relay2,1); else if (command == "r3on" || command == "turn on relay 3" || command == "relay 3 on") digitalWrite(relay3,0); else if (command == "r3off" || command == "turn off relay 3" || command == "relay 3 off") digitalWrite(relay3,1); else if (command == "r4on" || command == "turn on relay 4" || command == "relay 4 on") digitalWrite(relay4,0); else if (command == "r4off" || command == "turn off relay 4" || command == "relay 4 off") digitalWrite(relay4,1); else if (command == "allon" || command == "Turn on all devices" || command == "all on") { digitalWrite(relay1,LOW); digitalWrite(relay2,LOW); digitalWrite(relay3,LOW); digitalWrite(relay4,LOW); } else if (command == "alloff" || command == "Turn off all devices" || command == "all off") { digitalWrite(relay1,HIGH); digitalWrite(relay2,HIGH); digitalWrite(relay3,HIGH); digitalWrite(relay4,HIGH); } sendBackEcho(command); // send command echo back to android device command = ""; } /* connecting WiFi */ void connectWiFi() { Serial.println("Connecting to WIFI"); WiFi.begin(ssid, password); while ((!(WiFi.status() == WL_CONNECTED))) { delay(300); Serial.print(".."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("NodeMCU Local IP is : "); Serial.print((WiFi.localIP())); } /* check command received from Android Device */ String checkClient (void) { while(!client.available()) delay(1); String request = client.readStringUntil('\r'); request.remove(0, 5); request.remove(request.length()-9,9); return request; } /* send command echo back to android device */ void sendBackEcho(String echo) { client.println("HTTP/1.1 200 OK "); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println(echo); client.println("</html>"); client.stop(); delay(1); } |