Деревянная Лампа Эдисона с голосовым управлением. Цена вопроса 5$

в 22:12, , рубрики: DIY, diy или сделай сам, esp8266, IoT, Sonoff, голосовое управление, домашняя автоматизация, умный дом
image

Именно столько стоит WiFi реле SONOFF (от компании ITEAD) которое являеться сердцем данного устройства.

«У меня не было неудач. Я всего лишь нашёл 10 тысяч способов, которые не работают» — Томас Альва Эдисон.

Это невероятно, еще не в таком далеком прошлом люди в школах перьями писали. А сегодня у каждого в кармане есть волшебный кирпич с картинками, который позволяет получить доступ к информации со всего мира. Отправлять мгновенные сообщения любому человеку на планете. У нас есть голосовое управление, распознавание лиц и, как люди говорят, угроза всему человечеству со стороны искусственного интеллекта. Совсем недавно эти технологии казались невообразимой фантастикой. Однако сегдня я вам покажу как, имея базовые навыки программирования, абсолютно каждый может использовать голосовое управление. Итак, давайте начнем!

ВНИМАНИЕ!!! Работа с высоким напряжением. Будьте осторожны во всем, что вы делаете! Автор статьи не несет ответственности за совершаемые Вами действия и любой материальный или физический ущерб, который может возникнуть в результате использования информации из этой статьи! Если Вы в чем-то не уверены, попросите Вам помочь более опытного человека.

Главная схема работы устройства.

image

Так как телефон в один момент времени может быть подключен только к одной WiFi точке доступа, будем работать через роутер. В целом, это удобно, когда все ваши интеллектуальные устройства находятся в одной сети, и вы можете легко управлять ими без необходимости постоянного повторного подключения к каждому из них. Недостатком этого является то, что все ваши устройства зависят от работоспособности одного маршрутизатора.

1 — нам необходимо перепрограммировать WiFi реле Sonoff

Для этого необходимо разобрать реле и припаять к нему контакты для перепрошивки. По умолчанию он настроен на работу через китайский сервер. Лично мне не шибко понятно почему лампочку в туалете необходимо включать аж через сервер из Поднебесной.

image
image

Теперь мы можем подключить модуль cp2102 от Silicon Labs для перепрошивки Sonoff. Я его еще использую для работы с arduino mini.

image

image

ПРЕДУПРЕЖДЕНИЕ!!! При перепрограммировании не подключайте WiFi реле к сети 220/110 вольт!

Перепрограммировать реле очень просто. Это обычный модуль esp8266. Я взял стандартный скетч сервера точки доступа из Arduino IDE и немного его изменил.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
 
// name and password from WiFi network
const char* ssid = "Your access point (router) name";
const char* password = "router password";


IPAddress ip(192,168,1,112); // enter static ip
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

 
// Создаем сервер и порт для прослушки 80
 
WiFiServer server(80);
 
void setup() {
 Serial.begin(115200);
 delay(100);
 
 //preparing GPIO

 pinMode(12, OUTPUT);
 digitalWrite(12, 1);

 pinMode(13, OUTPUT);
 digitalWrite(13, 1);


 
 // connecting to WiFi
 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 WiFi.config(ip, gateway, subnet);
 
 // waiting for connection
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 // run server
 server.begin();
 Serial.println("Server started");
 
 // show ip
 Serial.println(WiFi.localIP());
}
 
void loop() {
 
 // connection check
 WiFiClient client = server.available();
 if (!client) {
 return;
 }
 
 // Waiting for data
 Serial.println("new client");
 while (!client.available()) {
 delay(1);
 }
 
 // Reading the first line of the query
 String req = client.readStringUntil('r');
 Serial.println(req);
 client.flush();

 // works with GPIO
 if (req.indexOf("/12/0") != -1)
 digitalWrite(12, 0);
 else if (req.indexOf("/12/1") != -1){
 digitalWrite(12, 1);
 Serial.println("TEST OK");
 String s = "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html>rnTest OK. Uptime: ";


 // UpTime
 int Sec = (millis() / 1000UL) % 60;
 int Min = ((millis() / 1000UL) / 60UL) % 60;
 int Hours = ((millis() / 1000UL) / 3600UL) % 24;
 int Day = ((millis() / 1000UL) / 3600UL / 24UL);
 s += Day;
 s += "d ";
 s += Hours;
 s += ":";
 s += Min;
 s += ":";
 s += Sec;
 s += "</html>n";
 client.print(s);
 client.stop();
 return;
 }
 else
 // If an invalid query write error
 {
 Serial.println("invalid request");
 String s = "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html>rnInvalid request";
 s += "</html>n";
 client.print(s);
 client.stop();
 return;
 }
 
 client.flush();
 
 
 // Response formation
 String s = "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html>rnGPIO set OK";
 s += "</html>n";
 
 // Send the response to the client
 client.print(s);
 delay(1);
 Serial.println("Client disonnected");
 
}

Вам нужно будет указать название вашей точки доступа (маршрутизатора/роутера), пароль и статический IP-адрес для лампочки. Управление реле находится на выводе 12. Обязательно установите размер флэш-памяти на 1 МБ в IDE.

Нажмите и удерживайте кнопку на плате Sonoff. Вставьте конвертер cp2102 USB в компьютер (удерживая нажатой кнопку). Через 2–3 секунды отпустите кнопку. Теперь реле в режиме программирования. Загрузите файл скетча из Arduino IDE. Нажмите на Подтвердить / Компилировать. После того, как вы его перепрограммируете, перезагрузите модуль.

2 — теперь давайте создадим мобильное приложение, чтобы управлять этим реле через Wi-Fi. (Android)

Я приведу только основные фрагменты кода. Затем вы можете использовать их для реализации в своих приложениях. Google предоставляет очень простой и удобный интерфейс для распознавания голоса. Вот код, который позволяет преобразовать голос в текст и сохранить его в обычную строку.

// Main code to start speech recognition.
// You can put it's execution, on some button in your app.

Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak please");
startActivityForResult(speechIntent, RESULT_SPEECH_TO_TEXT);


// Then on onAcivityResult we will get result
@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == RESULT_SPEECH_TO_TEXT && resultCode == RESULT_OK) {

  ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

        if (!matches.isEmpty()) {

                String result_recognition_string = matches.get(0);

          // convert to lower case, since google speech recognition
          // returns "different" results. For example: youtube defines as YouTube
            result_recognition_string = result_recognition_string.toLowerCase(Locale.getDefault());

          if (result_recognition_string.contains("lamp on") ) {
			// lamp on 
			new LightOn().execute();
                }
             }
    }
}

Затем вы можете сравнить его с командами, которые вы хотите реализовать.

Это код для работы с Wi-Fi. Отправка сообщения на сервер.

public class LightOn extends AsyncTask<Void,Void,Void> {

    private static final String LOG_TAG = "MyLog";

    @Override
    protected Void doInBackground(Void... params) {

        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL("https://192.168.1.112/12/1"); // "0" to turn off 

            urlConnection = (HttpURLConnection) url
                    .openConnection();

            InputStream in = urlConnection.getInputStream();

            InputStreamReader isw = new InputStreamReader(in);

            int data = isw.read();
            while (data != -1) {
                char current = (char) data;
                data = isw.read();
                System.out.print(current);
                Log.e(LOG_TAG, "Reply from server - " + current);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }

        return null;
    }
}

// run it
new LightOn().execute();

Это очень просто. «1» включить лампочку, «0» выключить лампочку. Вы можете добавлять по желанию любые проверки, получать ответ от сервера и тд. тп. Я для себя создал две программы. Первая — это виджет голосового управления, который находится на рабочем столе и всегда под рукой. Вторая — это простое приложение для включения / выключения лампочки нажатием кнопки.

image

Предполагаю, что вы уже устали читать всевозможные тексты, поэтому предлагаю вам узреть видео о том, как это было.

Как сказал Альберт Эйнштейн: «ваши возможности ограничены только вашим воображением».

Желаю хорошего Вам дня и только умных устройств!

Автор: Kybernetiks

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js