爱迪生声控木灯。 发行价$ 5

图片

这就是SONOFF WiFi中继(来自ITEAD)的价格,这是该设备的核心。

“我没有失败。 我刚刚发现了上万种无效的方法”-托马斯·阿尔瓦·爱迪生(Thomas Alva Edison)。

这是令人难以置信的,在这么遥远的过去,学校里的人们用羽毛写字。 如今,每个人都有一块装有图片的魔术砖,使您可以访问来自世界各地的信息。 向地球上的任何人发送即时消息。 就像人们所说的那样,我们拥有语音控制,面部识别功能,以及人工智能方面对全人类的威胁。 最近,这些技术似乎是不可想象的小说。 但是,今天,我将向您展示具有基本的编程技能的人人都可以使用语音控制。 因此,让我们开始吧!

注意!!! 在高电压下工作。 小心你做什么! 本文的作者不对您采取的措施以及由于使用本文中的信息而可能造成的任何物质或物理损失负责! 如果您不确定某件事,请请经验丰富的人来帮助您。

设备的主要方案。

图片

由于电话一次只能连接到一个WiFi接入点,因此我们将通过路由器进行工作。 通常,当所有智能设备都位于同一网络上时,这很方便,并且您可以轻松管理它们,而不必不断地重新连接每个智能设备。 这样做的缺点是,所有设备都取决于一台路由器的运行状况。

1-我们需要重新编程Sonoff WiFi中继


为此,您需要拆卸继电器并将触点焊接到其上以进行闪烁。 默认情况下,它配置为通过中文服务器工作。 就我个人而言,这不是很清楚,为什么马桶上的灯需要通过中东王国的服务器打开。

图片


图片


现在,我们可以连接Silicon Labs的cp2102模块进行Sonoff刷新。 我仍将其用于arduino mini。

图片

图片

警告!!! 重新编程时,请勿将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 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nTest 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 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nInvalid request"; s += "</html>\n"; client.print(s); client.stop(); return; } client.flush(); // Response formation String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO set OK"; s += "</html>\n"; // Send the response to the client client.print(s); delay(1); Serial.println("Client disonnected"); } 

您将需要指定灯泡的访问点名称(路由器/路由器),密码和静态IP地址。 继电器控制位于引脚12上。请确保在IDE中将闪存大小设置为1 MB。

按住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("http://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”关闭灯泡。 您可以添加所需的任何支票,从服务器接收响应等。 p 我为自己创建了两个程序。 第一个是语音控制小部件,它位于桌面上并且始终在手边。 第二个是一个简单的应用程序,只需按一下按钮即可打开/关闭灯泡。

图片

我想您已经厌倦了阅读各种文本,所以建议您看一段有关它的视频。


正如爱因斯坦(Albert Einstein)所说:“您的可能性仅受您的想象力的限制。”

祝您有美好的一天,只有智能设备!

Source: https://habr.com/ru/post/zh-CN432990/


All Articles