无聊突然想把米家的一些功能链接到我自己的服务器上,查了一下资料发现,木有开放的api。然后,我想到一个黑操作。
整体思路
通过米家app中的“智能”功能,可以触发开关米家台灯(这里我只有米家台灯感觉合适),然后通过硬件(光敏电阻),获取灯光是否打开,就可以通过自己的硬件,把指定的内容发送到服务器咯。我真棒!
购买硬件
最早想买一个树莓派来玩,不过价格让我有点不开心···
然后,我找到了Arduino。
开发
接下来就是开发咯。
服务器
我自己有一台阿里云的服务器,所以,开搞。
这里使用了Python3。 https://github.com/LunaGao/arduino-server 代码我上传到了git。
其实就是简单的一个数据展示。 数据库是我白嫖MongoDB的。嘿嘿。
硬件
硬件开发对我这种新手来说,有点困难···主要是从来没搞过···然后,硬着头皮搞了一下,咦,真香···
从开始的硬件串口都找不到(其实是使用的数据线有问题),到最终出成果,包括焊接,大约花费6个小时。
焊接硬件
当时忘记拍照了,很久之前改造大方摄像头的时候买了电焊台(当然最终以大方摄像头报废,电焊台吃灰结束),这次正好派上用场。
焊接技术简直渣到不行···
![](https://img.maomishen.com/Fl1OyoQaoGO4uQNynuPyBZqp2k5y)
光敏电阻的电源接的是3.3v,然后这里有个坑,光敏电阻的宝贝说明上,给我的是一个数字信号接口,但是板子上其实在低电平一直也可以接收到电压,不过真的是低电压,但是板子认为这个高电压,所以一直有信号。后来我改成接模拟信号接口才搞定。所以光敏电阻的D0接口,我接到了板子的A0上。(很有可能我搞错了)
代码编写
写代码这个就相对简单一些
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
|
#include <Arduino.h>
#include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
const char* ssid = "你的wifi名"; const char* password = "你的wifi密码";
bool isSent = false; bool isFirst = true; bool isDark = false;
void setup() {
Serial.begin(19200); Serial.setDebugOutput(true);
Serial.println(); Serial.println(); Serial.println();
WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); }
void loop() { // wait for WiFi connection if ((WiFi.status() == WL_CONNECTED)) { int lightValue = analogRead(0); // 1024 is dark if (lightValue > 1000) { // dark mode if (isDark) { isSent = true; } else { isSent = false; } isDark = true; } else { // light mode isDark = false; } if (isFirst) { // If is first start // do nothing isSent = false; isFirst = false; } if (!isSent) { // is sent value to server isSent = true; sendToServer(); } } delay(1000); }
void sendToServer() { WiFiClient client;
HTTPClient http;
Serial.print("[HTTP] begin...\n"); if (http.begin(client, "这里是你的服务器地址")) { // HTTP
Serial.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET();
// httpCode will be negative on error if (httpCode > 0) { // HTTP header has been send and Server response header has been handled Serial.print("[HTTP] GET... code: \n"); // file found at server if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { String payload = http.getString(); Serial.print(payload); Serial.println(); } } else { Serial.print("error start"); Serial.print(http.errorToString(httpCode).c_str()); Serial.print("error end"); }
http.end(); } else { Serial.print("[HTTP} Unable to connect\n"); } }
|
硬件改造
由于使用光敏电阻来判断,肯定要黑暗的环境哦,所以,我机智的把光敏电阻和台灯关在了盒子里。
![](https://img.maomishen.com/Fm2avDjap1DjvtJ5gFLSONPuI6JL)
![](https://img.maomishen.com/FmXTWQe0DV796zDco2r6k6pHrSWu)
米家App设置
在米家app中,设置一个智能,当某个动作执行时(我这里使用了门锁),让灯打开然后再关闭,这样就可以发送数据啦。
![](https://img.maomishen.com/FpOWvfMnBgGQLZbjiTNEdhOT20gL)
这里要注意的是,这个间隔1秒好像没啥用···灯没关···我设置到了3秒,正常。(2秒没试过)
结束
然后就成功啦。每次从外面开门,我的服务器都可以收到一条信息啦。
![](https://img.maomishen.com/Fr5BgXpp4szfi5B01ACMV9sEYJOZ)
第一条是测试数据,第二条和第三条是真实数据。哇咔咔