自從租房之後,生活環境發生了很大的變化。其實大部分的變化我尚且還算滿意,但每當晚上躺在床上玩手機的時候,當困意襲來時,心裡總是非常鬱悶:我在這邊,燈的開關在床的那邊。沒辦法,只得再度下床關燈,再摸黑爬上床 —— 此時睡意早已消失(大哭
於是,我想到了關燈神器 —— 遠程操控開關關燈。
方案設計#
因為只是想做一個解放雙手的小玩具,自然沒有打算做得非常複雜。鑑於家裡的開關設計(如下圖),只需要一個可以通電左右搖擺的舵機即可,給予一定的電信號,就物理控制開關上下撥動
方案很簡單,只需要一塊單片機和一個舵機就可以,考慮到撥動開關所需的強度,如果開關很硬可以考慮提供額外的電源供電來保持舵機輸出功率。好在家裡的開關還算聽話(勉強剛剛好,鬼知道我調整了多少次角度和高度),這次就不額外添加配件了。
參考 B 站的諸多 "關燈神器"視頻,這裡單片機選用了 esp8266,類似下圖
舵機則是使用了sg90
:
總成本不到 20 元...
(Ps: 網上淘寶現成的開關神器換個馬甲,多裝個模塊就能賣百來塊... 可見其中的利潤空間,咱們理工男可不能被這種騙了錢去~)
剩下就是控制方案
常見的必然是手機 app 控制,這裡必須借助第三方提供,自己寫 app 也不是不可以,主要是不想徒增學習成本(說白了還是懶😂),連接方法有藍牙、WiFi,這裡可以看自己的開發板需求。
具體實現#
既然搞定了方案,接下來進行實踐環節!
硬件實現#
硬件方面很簡單,注意看賣家給的引腳圖不要插錯即可。
注意觀察,如果發現線序不對,可能需要自己拆下舵機的線材固定器更改線序。運氣很好,我買的不需要,就直接插上連 PC 就行了
軟件實現#
這裡需要用到軟件和安裝包如下
- 8266 開發板的配置包
- 開發板開發軟件
- blink 電燈科技第三方應用的適配庫文件
- COM 串口驅動
安裝 arduino#
首先安裝 arduino,直接無腦 next 即可
安裝完成後打開 arduino,界面如圖:
導入 ESP8266 配置包#
首先打開 Arduino IDE 菜單 > 文件 > 首選項,在 附加開發板管理器網址 輸入框中,填入以下網址:https://www.arduino.cn/package_esp8266com_index.json
然後點擊文件夾中的配置包:
導入配置。
安裝三方庫文件#
添加庫中添加blinker-library-0.3.80210803.zip
配置開發板#
接下來新建文件 -> 保存一下 -> 如下圖配置開發板信息
如果沒有8266
開發選項,如下圖,搜索8266
,安裝上圖對應module
接下來就是編寫代碼,這邊已經提供好了一個模板
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>
#include <Servo.h>
Servo myservo;//定義舵機
char auth[] = "xxxxxxxx"; //點燈Key
char ssid[] = "SELF-WIFI"; //wifi名稱
char pswd[] = "password"; //wifi密碼
// 新建組件對象,注意這裡的名稱要和電燈科技app裡保持一致
BlinkerButton Button1("test");
int counter = 0;
//注意如果接入小愛同學,其監聽的就是這個電源事件
void miotPowerState(const String & state)//電源類操作
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
myservo.write(150);//收到“on”的指令後舵機旋轉150度
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();//反饋狀態
delay(1000);//延時1秒
myservo.write(90);//舵機歸零,回到垂直狀態
}
else if (state == BLINKER_CMD_OFF) {
myservo.write(30); //舵機偏轉30°
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
delay(1000);
myservo.write(90);
}
}
// 按下按鍵即會執行該函數
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
if (state=="on")
{
myservo.write(170);//收到“on”的指令後舵機旋轉150
delay(1000);//延時
myservo.write(90);//舵機歸零垂直
} else if(state=="press"||state=="tap")
{
myservo.write(10);//長按開關按鍵後舵機旋轉10
delay(1000);//延時
myservo.write(90);//舵機歸零垂直(90度)
}
}
// 如果未綁定的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化舵機
myservo.attach(2);//舵機的IO口,nodemcu的D4口
myservo.write(90);//上電時舵機歸零垂直
BlinkerMIOT.attachPowerState(miotPowerState);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
BLINKER_LOG("Blinked running...");
Blinker.run();
}
接下來,只需要點擊左上角編譯通過就完成了。
如果編譯沒有問題,接下來就需要將程序上傳到開發板上。首先注意下圖端口,經過之前安裝 com 端口驅動,理論上這邊端口可以正常顯示
如果不能,查看設備管理器看是否端口正常顯示。
安裝 APP#
還記得代碼裡的key
嗎?接下來就是下載電燈科技 APP 並申請key
一般應用市場都有,如果沒有的話可以去官網下。
註冊設備#
下載並註冊點燈科技賬號之後,在右上角加號 -> 獨立設備 -> 網絡接入
一般推薦阿里雲 接入,但是我目前的版本只能接入點燈科技服務,實測無論是控制還是接入小愛同學都沒有影響,這裡就看大家選擇。
完成設備註冊後如上圖所示,這時你會獲取一個key
,填入代碼中即可。
開發界面#
這裡大家就可以按照代碼中發信指引自己製作開關界面。我這邊在網上找到一份簡單的界面配置文件
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fad fa-lightbulb-on¨¨mode¨Ê¨t0¨¨開燈¨¨t1¨¨文本2¨¨bg¨Ì¨cols¨Í¨rows¨Í¨key¨¨test¨´x´Ë´y´Ì¨speech¨|÷¨cus¨¨on¨¨lstyle¨Ë¨clr¨¨#076EEF¨}{ßAßBßC¨fad fa-lightbulb¨ßEÉßF¨關燈¨ßHßIßJÌßKÍßLÍßMßN´x´Ë´y´ÑßO|÷ßRËßSßT}{ßA¨deb¨ßEÉßJÉßKÑßLÌßM¨debug¨´x´É´y´¤D}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡ßQ¨打開?name¨¨off¨¨關閉?name¨—÷¨triggers¨|{¨source¨ßa¨source_zh¨¨開關狀態¨¨state¨|ßQßd÷¨state_zh¨|¨打開¨¨關閉¨÷}÷}
將這份文件導入到配置信息即可。(上面的亂碼是真的(汗))
導入後配置如下:
接下來就可以自己操控查看配置情況了。
接入小愛同學#
接入小愛同學其實很簡單,就看第三方服務方提不提供支持
米家 -> 接入其他設備 -> 點燈科技 -> 同步配置即可
設備安裝#
這一步在實際操作中反倒是最難的,因為每個人情況不同,按鈕的強度也不一樣,我一開始還是非常擔心舵機的功率可能不足以撥動開關的。實際上確實在嘗試了很多角度之後總是無法成功實現。
曾經嘗試過給舵機扇葉進行延長增大接觸面積,但是這些方案最終沒有一個很好的實現。最後我嘗試回歸起點,通過墊高舵機,使得扇葉和開關產生一定的間隔,這樣在扇葉旋轉的時候,會有一個慣性輔助用力。接著使用紙板和 502 將舵機固定,並用透明膠在外層進行二次輔助固定,最終總算實現了開關的正常撥動(雖然有的時候還是不太靈敏)
最終實現圖如下:
效果#
這裡給出一個鏈接