米家 + arduino + 自定義服務器


無聊突然想把米家的一些功能鏈接到我自己的服務器上,查了一下資料發現,木有開放的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秒沒試過)

結束

然后就成功啦。每次從外面開門,我的服務器都可以收到一條信息啦。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM