В данной статье мы рассмотрим проект автоматизации (умного) дома на модуле ESP12 в лучших традициях концепции интернета вещей (IoT) - с компьютерным зрением и управлением жестами. В этом проекте мы использовали для компьютерного зрения наш персональный компьютер ввиду ограниченности бюджета на проект, но чтобы сделать проект более совершенным, для этой цели можно использовать, например, одноплатный компьютер NVIDIA Jetson Nano.
Ранее на нашем сайте мы уже рассматривали достаточно много различных проектов автоматизации дома на основе различных микроконтроллеров (плат), наиболее популярными среди которых являются следующие:
- автоматизация дома на Raspberry Pi с управлением с веб-страницы;
- управление светом в доме с помощью сенсорного датчика и Arduino;
- автоматическая регулировка температуры в доме с помощью терморезистора и Arduino;
- автоматизация дома на Arduino под управлением смартфона.
На следующих рисунках показан внешний вид различных компонентов нашего проекта.
Необходимые компоненты
Аппаратное обеспечение
- Модуль ESP8266 (ESP12) (купить на AliExpress),
- Реле,
- SMD диоды,
- SMD резисторы,
- SMD кнопки,
- Регулятор напряжения 3.3V AMS1117 (купить на AliExpress - можно купить не в виде модуля, а в виде отдельной микросхемы (от 5 до 7 рублей за штуку), но на момент публикации данной статьи не нашел на алиэкспрессе магазина с дешевой доставкой данной микросхемы),
- светодиоды 3mm,
- Hi-link 5v/5w,
- 2-контактные разъемы,
- Dummy переключатели,
- Соединительные провода,
- Компьютер для реализации функций искусственного интеллекта (AI Virtual Assistance),
- Вебкамера для компьютерного зрения (AI Vision).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Программное обеспечение
- Arduino IDE,
- PyCharm,
- Python 3.7.6,
- Blynk Cloud server,
- Mit App Inverter,
- EasyEDA PCB Designer.
Выбор аппаратного и программного обеспечения проекта
ESP12-E: Этот небольшой приемопередатчик WIFI со встроенным микроконтроллером является идеальным решением для домашней автоматизации и приложений Интернета вещей. Модуль ESP-12 является одним из наиболее полных в семействе ESP, поскольку позволяет использовать наибольшее количество контактов из всех модулей данной серии. Вы можете запрограммировать этот модуль для автономной работы с Arduino IDE или с LUA в качестве NodeMCU. В нашем случае мы имеем систему на основе ESP8266, основными характеристиками которой являются энергосберегающий VoIP, быстрое переключение между режимами сна/бодрствования, адаптивное радиосмещение с низким энергопотреблением и функции внешней обработки сигналов.
Hi-Link 5 В/5 Вт: этот модуль питания заменяет множество деталей традиционного источника питания, таких как диоды, стабилизаторы напряжения и трансформаторы. Таким образом, у этих модулей есть много преимуществ, таких как низкий рост температуры, малое энергопотребление, высокая эффективность, высокая надежность, надежная изоляция и т. д.
Медная оболочка: Мы использовали медную оболочку для изготовления самодельной печатной платы, поскольку она очень дешева для одиночной печатной платы.
Компоненты SMD: Мы использовали в нашем проекте компоненты smd, потому что они позволяют уменьшить размер печатной платы. А для питания модуля Wi-Fi в нашей схеме используется регулятор напряжения AMS 1117 3,3 В. Это микросхема SMD. И в нашей схеме мы использовали множество smd-резисторов, микросхем питания, кнопок, диодов и т. д.
Вилка и заглушка электрического щита: В нашем проекте мы использовали обычную вилку для питания бытовой техники, выходной сигнал которой будет поступать от нашей сети Wi-Fi. Также мы использовали заглушку для настройки сенсорного датчика.
Arduino IDE: Это отличная IDE для программирования встраиваемых систем. Arduino IDE проста в освоении, а ее код достаточно легко понять. Еще одна причина, по которой Arduino IDE так популярна, заключается в том, что ее использует множество людей, а это значит, что существует множество примеров ее использования и исправления возможных неполадок (если они у вас появятся.
EasyEDA: Мы использовали программное обеспечение EasyEDA для проектирования печатной платы. Это онлайн-программное обеспечение, и его можно использовать где угодно, используя сеть Интернет. И все компоненты достаточно просто найти в этом программном обеспечении. EasyEDA — это очень функциональная онлайн-платформа EDA, которая предоставляет пользователям доступ ко всем основным функциям и инструментам, необходимым для проектирования печатных плат и схем для различных приложений. Оно также имеет большой набор инновационных функций, которых до недавнего времени не было даже в некоторых платных программах EDA.
PyCharm: Для создания Ai Assistance (реализации функций ИИ (искусственного интеллекта)) мы использовали PyCharm IDE для компиляции нашего кода. PyCharm обеспечивает интеллектуальное завершение кода, проверки кода, оперативное выделение ошибок и быстрые исправления, а также автоматический рефакторинг кода и богатые возможности навигации.
Mediapipe: Mediapipe — это кроссплатформенная библиотека, разработанная Google, которая предоставляет потрясающие готовые к использованию решения машинного обучения для задач компьютерного зрения. Библиотека OpenCV на Python — это библиотека компьютерного зрения, которая широко используется для анализа изображений, их обработки, обнаружения, распознавания и т. д.
OpenCV-Python: — OpenCV используется для всех видов анализа изображений и видео, таких как распознавание и обнаружение лиц, считывание номерных знаков, редактирование фотографий, расширенное роботизированное зрение, оптическое распознавание символов и многое другое.
MIT App Inventor: Это облачный инструмент, позволяющий создавать приложения для устройств Android или iOS прямо в веб-браузере. Этот веб-сайт предлагает всю необходимую поддержку, чтобы научиться создавать собственные приложения.
Requests: Библиотека запросов является фактическим стандартом для выполнения HTTP-запросов в Python. Она абстрагирует сложности выполнения запросов с помощью красивого и простого API, чтобы вы могли сосредоточиться на взаимодействии со службами и использовании данных в своем приложении.
Blynk: Это самая популярная платформа Интернета вещей для подключения ваших устройств к облаку. Он хорошо известен тем, что позволяет пользователям создавать приложения для управления своими устройствами Интернета вещей, анализировать данные телеметрии и управлять развернутыми продуктами в любом масштабе. Более подробно про работу с Blynk можно прочитать в этой статье.
Схема проекта
Схема проекта умного дома на ESP12 с управлением жестами и компьютерном зрении представлена на следующем рисунке.
В нашей схеме мы использовали модуль Esp12-e и для его программирования мы использовали контакт RX/TX. Затем мы подключили 3 контакта модуля Esp12-e к реле, а остальные 3 контакта оставлены для входа сенсорного датчика. Для питания всей схемы мы использовали блок питания Hi-Link. Также мы применили 2-контактные разъемы для подключения проводов платы.
Также в схеме мы использовали несколько подтягивающих резисторов для ряда контактов модуля Esp12-e. Светодиоды в нашей схеме будут индицировать о том, включена или выключена вилка. Также в схеме есть источник питания 220 В.
Исходный код программы
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp8266.h> BlynkTimer timer; #define RELAY_PIN_1 13 #define RELAY_PIN_2 12 #define RELAY_PIN_3 14 #define TOUCH_BUTTON_1 4 #define TOUCH_BUTTON_2 5 #define TOUCH_BUTTON_3 15 int MODE = 0; int relay1State = LOW; int relay2State = LOW; int relay3State = LOW; int TOUCHButton1State = HIGH; int TOUCHButton2State = HIGH; int TOUCHButton3State = HIGH; // Your WiFi credentials. // Set password to "" for open networks. #define AUTH "nm84INtLwBwMXiyoBcIilNWLPwFSBU" #define WIFI_SSID "ANAND" #define WIFI_PASS "22102003A" BLYNK_WRITE(V1) { relay1State = param.asInt(); // assigning incoming value from pin V1 to a variable digitalWrite(RELAY_PIN_1, relay1State); // process received value } BLYNK_WRITE(V2) { relay2State = param.asInt(); // assigning incoming value from pin V2 to a variable digitalWrite(RELAY_PIN_2, relay2State); // process received value } BLYNK_WRITE(V3) { relay3State = param.asInt(); // assigning incoming value from pin V3 to a variable digitalWrite(RELAY_PIN_3, relay3State); // process received value } void with_internet() { if (digitalRead(TOUCH_BUTTON_1) == LOW) { if (TOUCHButton1State != LOW) { relay1State = !relay1State; digitalWrite(RELAY_PIN_1, relay1State); Blynk.virtualWrite(V1, relay1State); } TOUCHButton1State = LOW; } else { TOUCHButton1State = HIGH; } if (digitalRead(TOUCH_BUTTON_2) == LOW) { if (TOUCHButton2State != LOW) { relay2State = !relay2State; digitalWrite(RELAY_PIN_2, relay2State); Blynk.virtualWrite(V2, relay2State); } TOUCHButton2State = LOW; } else { TOUCHButton2State = HIGH; } if (digitalRead(TOUCH_BUTTON_3) == LOW) { if (TOUCHButton3State != LOW) { relay3State = !relay3State; digitalWrite(RELAY_PIN_3, relay3State); Blynk.virtualWrite(V3, relay3State); } TOUCHButton3State = LOW; } else { TOUCHButton3State = HIGH; } } void without_internet() { if (digitalRead(TOUCH_BUTTON_1) == LOW) { if (TOUCHButton1State != LOW) { relay1State = !relay1State; digitalWrite(RELAY_PIN_1, relay1State); } TOUCHButton1State = LOW; } else { TOUCHButton1State = HIGH; } if (digitalRead(TOUCH_BUTTON_2) == LOW) { if (TOUCHButton2State != LOW) { relay2State = !relay2State; digitalWrite(RELAY_PIN_2, relay2State); } TOUCHButton2State = LOW; } else { TOUCHButton2State = HIGH; } if (digitalRead(TOUCH_BUTTON_3) == LOW) { if (TOUCHButton3State != LOW) { relay3State = !relay3State; digitalWrite(RELAY_PIN_3, relay3State); } TOUCHButton3State = LOW; } else { TOUCHButton3State = HIGH; } } void checkBlynk() { // called every 3 seconds by SimpleTimer bool isconnected = Blynk.connected(); if (isconnected == false) { MODE = 1; } if (isconnected == true) { MODE = 0; } } void setup() { // Debug console Serial.begin(9600); pinMode(15,OUTPUT); delay (5000); digitalWrite(15,HIGH); pinMode(TOUCH_BUTTON_1, INPUT); pinMode(RELAY_PIN_1, OUTPUT); pinMode(TOUCH_BUTTON_2, INPUT); pinMode(RELAY_PIN_2, OUTPUT); pinMode(TOUCH_BUTTON_3, INPUT); pinMode(RELAY_PIN_3, OUTPUT); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } timer.setInterval(3000L, checkBlynk); Blynk.config(AUTH);// check if connected to Blynk server every 3 seconds //, ssid, pass); } void loop() { if (WiFi.status() != WL_CONNECTED) { WiFi.begin(WIFI_SSID, WIFI_PASS); } else { Serial.println(" Connected"); Blynk.run(); } timer.run(); // Initiates SimpleTimer if (MODE == 0) with_internet(); else without_internet(); } |