無聊突然想把米家的一些功能鏈接到我自己的服務器上,查了一下資料發現,木有開放的api。然后,我想到一個黑操作。
整體思路
通過米家app中的“智能”功能,可以觸發開關米家台燈(這里我只有米家台燈感覺合適),然后通過硬件(光敏電阻),獲取燈光是否打開,就可以通過自己的硬件,把指定的內容發送到服務器咯。我真棒!
購買硬件
最早想買一個樹莓派來玩,不過價格讓我有點不開心···
然后,我找到了Arduino。
開發
接下來就是開發咯。
服務器
我自己有一台阿里雲的服務器,所以,開搞。
這里使用了Python3。 https://github.com/LunaGao/arduino-server 代碼我上傳到了git。
其實就是簡單的一個數據展示。 數據庫是我白嫖MongoDB的。嘿嘿。
硬件
硬件開發對我這種新手來說,有點困難···主要是從來沒搞過···然后,硬着頭皮搞了一下,咦,真香···
從開始的硬件串口都找不到(其實是使用的數據線有問題),到最終出成果,包括焊接,大約花費6個小時。
焊接硬件
當時忘記拍照了,很久之前改造大方攝像頭的時候買了電焊台(當然最終以大方攝像頭報廢,電焊台吃灰結束),這次正好派上用場。
焊接技術簡直渣到不行···

光敏電阻的電源接的是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"); } }
|
硬件改造
由於使用光敏電阻來判斷,肯定要黑暗的環境哦,所以,我機智的把光敏電阻和台燈關在了盒子里。


米家App設置
在米家app中,設置一個智能,當某個動作執行時(我這里使用了門鎖),讓燈打開然后再關閉,這樣就可以發送數據啦。

這里要注意的是,這個間隔1秒好像沒啥用···燈沒關···我設置到了3秒,正常。(2秒沒試過)
結束
然后就成功啦。每次從外面開門,我的服務器都可以收到一條信息啦。

第一條是測試數據,第二條和第三條是真實數據。哇咔咔