Коммутатор WiFi для бытовой техники с ESP8266 (умный дом) - Своими руками
Своими руками

Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)

>

Из этой статьи мы с вами узнаем, как сделать собственный коммутатор WiFi с модулем ESP и как управлять любым устройством с его помощью.
В настоящее время мы живем в эпоху Интернета вещей, и коммутаторы Wi-Fi являются его основой. Это устройства, которые могут включать, выключать бытовую технику, такую как освещение, вентиляторы и т. д. Удаленно или автономно, управляемые мобильными телефонами, голосом, температурой в помещении или даже прогнозами погоды.
Их работа основана на беспроводной связи (обычно известной как Wi-Fi), которая позволяет им подключаться к Интернету и обрабатывать данные, чтобы они могли принимать меры в соответствии с определенными условиями, установленными пользователем.
Инструменты и материалы:-Модуль ESP8266 (ESP-01);
-Печатная плата;
-Макетная плата;-Провода;-Ардуино нано;-Три резистора по 1 кОм 1/4 Вт;-Два резистора по 470 Ом 1/2 Вт;
-Двухрядный гнездовой разъем (U3);
-MOC3010 (опто-симистор);
-Симистор BTA24;
-Конденсатор 100нФ 400В;
-Источник питания 3,3 В;
-Клеммная колодка 2p;
-Клеммная колодка 3p;
Шаг первый: схема и печатная плата
Печатную плату можно делать самостоятельно или заказать на специализированном сайте.
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Шаг второй: устройство Ubidots и создание переменных
Ubidots – это конструктор приложений Интернета вещей (IoT) с аналитикой и визуализацией данных. Для работы устройства необходимо создать на сервисе учетную запись.

После регистрации переходим в раздел «Устройство» учетной записи Ubidots и создаем новое устройство под названием «wifiswitch».
Внутри вашего устройства “wifiswitch” создаем переменную с именем “light”.
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Шаг третий: создание панели инструментов и виджета Ubidots
После того, как устройство и переменная созданы, нужно создать информационную панель и виджет для управления светом с веб-панели или мобильной панели управления. Чтобы создать новую информационную панель, нажимаем «Данные> Информационная панель». Затем нажимаем значок плюса и завершаем настройку приборной панели по своему желанию.

Теперь создаем виджет управления, чтобы установить состояние лампочки, связанной с переменной «свет». Чтобы создать виджет управления, выбираем значок плюса, расположенный в правом верхнем углу страницы. Затем нажимаем «Переключить». В качестве типа виджета, выбираем переменную, которой нужно управлять, и завершаем настройку виджета по своему желанию.
Теперь все готово для программирования и тестирования проекта.
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Шаг четвертый: программирование с помощью 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.
Загружаем код:
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом) Показать / Скрыть текст/****************************************

* 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;

}
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Шаг шестой: настройка голосовых команд с помощью 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}
Наконец, нажимаем “Готово”.
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Шаг седьмой: тестирование
Согласно схеме, показанной на рисунке, правильно подключаем модуль к устройству переменного тока.
Линия —> L
Нейтральный —> N
Световая линия ‘—> B
Добавляем желаемую кнопку мгновенного действия в клеммную колодку под названием SW.
Определяем линейный, нейтральный и световой провода.
Делаем монтаж, устанавливаем выключатель.
Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Коммутатор WiFi для бытовой техники с ESP8266 (умный дом)Все готово. Из этого руководства мы только что узнали, как создать коммутатор Wi-Fi, которым можно управлять через Интернет с помощью голоса, приложения для мобильного телефона или ПК. Это устройство можно применять для управления множеством различных устройств, таких как вентиляторы, двигатели, шторы, фонари, светодиодные ленты и многое другое.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.