Из этой статьи мы с вами узнаем, как сделать собственный коммутатор WiFi с модулем ESP и как управлять любым устройством с его помощью.
В настоящее время мы живем в эпоху Интернета вещей, и коммутаторы Wi-Fi являются его основой. Это устройства, которые могут включать, выключать бытовую технику, такую как освещение, вентиляторы и т. д. Удаленно или автономно, управляемые мобильными телефонами, голосом, температурой в помещении или даже прогнозами погоды.
Их работа основана на беспроводной связи (обычно известной как Wi-Fi), которая позволяет им подключаться к Интернету и обрабатывать данные, чтобы они могли принимать меры в соответствии с определенными условиями, установленными пользователем.
Инструменты и материалы:-Модуль ESP8266 (ESP-01);
-Печатная плата;
-Макетная плата;-Провода;-Ардуино нано;-Три резистора по 1 кОм 1/4 Вт;-Два резистора по 470 Ом 1/2 Вт;
-Двухрядный гнездовой разъем (U3);
-MOC3010 (опто-симистор);
-Симистор BTA24;
-Конденсатор 100нФ 400В;
-Источник питания 3,3 В;
-Клеммная колодка 2p;
-Клеммная колодка 3p;
Шаг первый: схема и печатная плата
Печатную плату можно делать самостоятельно или заказать на специализированном сайте.Шаг второй: устройство Ubidots и создание переменных
Ubidots — это конструктор приложений Интернета вещей (IoT) с аналитикой и визуализацией данных. Для работы устройства необходимо создать на сервисе учетную запись.
После регистрации переходим в раздел «Устройство» учетной записи Ubidots и создаем новое устройство под названием «wifiswitch».
Внутри вашего устройства «wifiswitch» создаем переменную с именем «light».Шаг третий: создание панели инструментов и виджета Ubidots
После того, как устройство и переменная созданы, нужно создать информационную панель и виджет для управления светом с веб-панели или мобильной панели управления. Чтобы создать новую информационную панель, нажимаем «Данные> Информационная панель». Затем нажимаем значок плюса и завершаем настройку приборной панели по своему желанию.
Теперь создаем виджет управления, чтобы установить состояние лампочки, связанной с переменной «свет». Чтобы создать виджет управления, выбираем значок плюса, расположенный в правом верхнем углу страницы. Затем нажимаем «Переключить». В качестве типа виджета, выбираем переменную, которой нужно управлять, и завершаем настройку виджета по своему желанию.
Теперь все готово для программирования и тестирования проекта.Шаг четвертый: программирование с помощью Arduino IDE
Загружаем Arduino IDE.
Открываем IDE Arduino и выбираем Файлы -> Настройки.
Добавляем приведенный ниже URL-адрес в поле Дополнительные URL-адреса Board Manager. Можно добавить несколько URL-адресов, разделив их запятыми.
http://arduino.esp8266.com/stable/package_esp8266…
Открываем и устанавливаем плату ESP8266 в диспетчере плат: Инструменты -> Плата -> Диспетчер плат.
Быстро найти плату можно набрав «ESP8266» в строке поиска.
Дальше выбираем Generic ESP8266 board в меню Инструменты -> Платы.
Переходим в Инструменты -> Порт: -> Выберите порт.
Убеждаемся, что скорость загрузки IDE составляет 115200, перейдя в Инструменты -> Скорость загрузки -> 115200
Загружаем библиотеку UbidotsESPMQTT. Кликаем Эскиз –> Включить библиотеку –>> Добавить .ZIP — библиотеку и выбираем библиотеку Ubidots ESP8266 MQTT.
Перегружаем Arduino IDE.
Шаг пятый: программирование ESP8266
После того, как ESP8266 настроен, можно начать публикацию и подписку данных от / на Ubidots для управления коммутатором Wi-Fi.
Копируем и вставляем следующий код в среду разработки Arduino. Настраиваем SSID и пароль Wi-Fi, а также свой токен Ubidots.
Загружаем код:




/**************************************** * Libraries ****************************************/ #include "UbidotsESPMQTT.h" /**************************************** * Define constants ****************************************/ #define TOKEN "..........................." // Your Ubidots TOKEN #define WIFINAME "........." //Your SSID #define WIFIPASS "........." // Your Wifi Pass #define DEVICE_LABEL "wifiswitch" // Name of the device #define VARIABLE_LABEL1 "light" // Name of the Ubidots variable const int ERROR_VALUE = 65535; // Error value const uint8_t NUMBER_OF_VARIABLES = 2; // Cantidad de variables a las que el programa se va a suscribir char * variable_labels[NUMBER_OF_VARIABLES] = {"light"}; // Variables names #define luz 0 #define boton 2 int seguro=0; int ledState = LOW; // the current state of the output pin int buttonState; // the current reading from the input pin int lastButtonState = HIGH; // the previous reading from the input pin int reading; unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; float estadoluz; // Variable to be used in the code float value; // Variable to store input data uint8_t variable; // To use with the switch case Ubidots ubiClient(TOKEN); WiFiClient client; /**************************************** * Auxiliar functions ****************************************/ void callback(char* topic, byte* payload, unsigned int length) { char* variable_label = (char *) malloc(sizeof(char) * 30); get_variable_label_topic(topic, variable_label); value = btof(payload, length); set_state(variable_label); execute_cases(); free(variable_label); /////////////////Light//////////////////// digitalWrite(luz, estadoluz); /////////////////Light//////////////////// } // Parse topic to extract the variable label which changed value void get_variable_label_topic(char * topic, char * variable_label) { Serial.print("topic:"); Serial.println(topic); sprintf(variable_label, ""); for (int i = 0; i < NUMBER_OF_VARIABLES; i++) { char * result_lv = strstr(topic, variable_labels[i]); if (result_lv != NULL) { uint8_t len = strlen(result_lv); char result[100]; uint8_t i = 0; for (i = 0; i < len - 3; i++) { result[i] = result_lv[i]; } result[i] = ''; Serial.print("Label is: "); Serial.println(result); sprintf(variable_label, "%s", result); break; } } } // cast from an array of chars to float value. float btof(byte * payload, unsigned int length) { char * demo = (char *) malloc(sizeof(char) * 10); for (int i = 0; i < length; i++) { demo[i] = payload[i]; } float value = atof(demo); free(demo); return value; } // State machine to use switch case void set_state(char* variable_label) { variable = 0; for (uint8_t i = 0; i < NUMBER_OF_VARIABLES; i++) { if (strcmp(variable_label, variable_labels[i]) == 0) { break; } variable++; } if (variable >= NUMBER_OF_VARIABLES) variable = ERROR_VALUE; // Not valid } // Function with switch case to determine which variable changed and assigned the value accordingly to the code variable void execute_cases() { switch (variable) { case 0: estadoluz = value; Serial.print("Luz: "); Serial.println(estadoluz); Serial.println(); break; case ERROR_VALUE: Serial.println("error"); Serial.println(); break; default: Serial.println("default"); Serial.println(); } } /**************************************** * Funcion principal ****************************************/ void setup() { // put your setup code here, to run once: pinMode(luz, OUTPUT); pinMode(boton, INPUT); ubiClient.ubidotsSetBroker("industrial.api.ubidots.com"); // Sets the broker properly for the business account ubiClient.setDebug(true); // Pass a true or false bool value to activate debug messages Serial.begin(115200); ubiClient.wifiConnection(WIFINAME, WIFIPASS); ubiClient.begin(callback); if(!ubiClient.connected()){ ubiClient.reconnect(); } char* deviceStatus = getUbidotsDevice(DEVICE_LABEL); if (strcmp(deviceStatus, "404") == 0) { ubiClient.add("light", 0); //Insert your variable Labels and the value to be sent ubiClient.ubidotsPublish(DEVICE_LABEL); ubiClient.loop(); } ubiClient.ubidotsSubscribe(DEVICE_LABEL,VARIABLE_LABEL1); //Insert the Device and Variable's Labels Serial.println(variable_labels[1]); } void loop() { // put your main code here, to run repeatedly: if(!ubiClient.connected()){ ubiClient.reconnect(); ubiClient.ubidotsSubscribe(DEVICE_LABEL,VARIABLE_LABEL1); //Insert the Device and Variable's Labels } ubiClient.loop(); Read(); Debounce(); // save the reading. Next time through the loop, it'll be the lastButtonState: lastButtonState = reading; } void Read(){ // read the state of the switch into a local variable: reading = digitalRead(boton); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } } void Debounce(){ if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; Toggle(); } } } void Toggle(){ // only toggle the LED if the new button state is LOW if (buttonState == LOW) { ledState = !ledState; // set the LED: digitalWrite(luz, ledState); ubiClient.add("light", ledState); //Insert your variable Labels and the value to be sent ubiClient.ubidotsPublish(DEVICE_LABEL); } } char* getUbidotsDevice(char* deviceLabel) { char* data = (char *) malloc(sizeof(char) * 700); char* response = (char *) malloc(sizeof(char) * 400); sprintf(data, "GET /api/v1.6/devices/%s/", deviceLabel); sprintf(data, "%s HTTP/1.1rn", data); sprintf(data, "%sHost: industrial.api.ubidots.comrnUser-Agent:wifiswitch/1.0rn", data); sprintf(data, "%sX-Auth-Token: %srnConnection: closernrn", data, TOKEN); char* data1 = data; free(data); if (client.connect("industrial.api.ubidots.com", 80)) { client.println(data1); } else { free(data); return "e"; } int timeout = 0; while(!client.available() && timeout < 5000) { timeout++; if (timeout >= 4999){ free(data); return "e"; } delay(1); } int i = 0; while (client.available()) { response[i++] = (char)client.read(); if (i >= 399){ break; } } char * pch; char * statusCode; int j = 0; pch = strtok (response, " "); while (pch != NULL) { if (j == 1 ) { statusCode = pch; } pch = strtok (NULL, " "); j++; } free(response); return statusCode; }
Шаг шестой: настройка голосовых команд с помощью Google Assistant
Чтобы управлять «коммутатором WiFi» с помощью Google Home, сначала нужно настроить промежуточную платформу под названием IFTTT. Это позволит связать коммутатор с Google Assistant. Для правильной настройки нужно выполнить следующие действия:
Если нет учетной записи, нужно зарегистрироваться.
Кликаем «Мои апплеты». Затем «Новый апплет».
Кликаем «+ this», чтобы настроить триггер.
Находим службу «Google Ассистент» и кликаем на нее.
Кликаем «Произнесите простую фразу».
Заполняем поля триггера фразами, которые мы хотим использовать для управления светом, затем нажимаем «Создать триггер».
Нажимаем “+that”, чтобы настроить действие.
Находим службу действий «Webhooks».
Кликаем «Сделать веб-запрос».
Заполняем поля:
URL—-> http://things.ubidots.com/api/v1.6/devices/wifisw… goes your Ubidots Token)
Method—-> POST
Content Type—-> application/json
Body—-> To turn on {“light”:1}, to turn off {“light”:0}
Наконец, нажимаем «Готово».Шаг седьмой: тестирование
Согласно схеме, показанной на рисунке, правильно подключаем модуль к устройству переменного тока.
Линия —> L
Нейтральный —> N
Световая линия ‘—> B
Добавляем желаемую кнопку мгновенного действия в клеммную колодку под названием SW.
Определяем линейный, нейтральный и световой провода.
Делаем монтаж, устанавливаем выключатель.Все готово. Из этого руководства мы только что узнали, как создать коммутатор Wi-Fi, которым можно управлять через Интернет с помощью голоса, приложения для мобильного телефона или ПК. Это устройство можно применять для управления множеством различных устройств, таких как вентиляторы, двигатели, шторы, фонари, светодиодные ленты и многое другое.

