ESP32控制舵機轉動,使用blinker實現遠程開關宿舍燈/宿舍門
准備
杜邦線若干條(至少3條)
舵機一個,我使用的是SG90,大概扭力為1.4kg/cm
ESP32/ESP8266一塊,我的是樂鑫的,帶WIFI模塊,大概30RMB
USB數據線一條
ESP32使用servo庫會出現編譯問題,架構不匹配,所以我這里直接使用pwm進行舵機的控制,你也可以使用ESP8266直接使用servo庫控制舵機,方便很多,或者使用ESP32的舵機庫(arduino的庫管理器中可以找到)
連線
很多人可能接觸開發板時間不長(比如說我),我就是最開始連線都不知道怎么接,網上給出完整接法的挺少的:
舵機直接連接ESP32:需要准備3條公母杜邦線,
先上一張ESP32引腳圖
我們將黃色接GPIO16,黑色(咖啡色)接地(GND),紅色接5v電源(Vin)
插上數據線連接電腦
手機和開發板通信
通過blinker向開發板發送Json格式的指令,由開發板通過blinker解析后執行相應的callback(回調)函數
下載blinker 的APP,添加設備即可
添加設備並選擇服務器供應商后,會給出設備專屬的密鑰,保存之后有用
完整代碼
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "";//點燈秘鑰
char ssid[] = "";//無線網名稱
char pswd[] = "";//無線網密碼
int freq = 50;
int channel = 8;
int resolution = 8;
const int led = 16;
BlinkerButton Button1("btn-max");
BlinkerButton Button2("btn-min");
int servo_max=180,servo_min=90;
int calculatePWM(int degree)
{
const float deadZone = 6.4;
const float max = 32;
if (degree < 0)
degree = 0;
if (degree > 180)
degree = 180;
return (int)(((max - deadZone) / 180) * degree + deadZone);
}
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", servo_max);
ledcWrite(channel, calculatePWM(180));
Blinker.vibrate();
}
void button2_callback(const String & state)
{
BLINKER_LOG("get button state: ", servo_min);
ledcWrite(channel, calculatePWM(90));
Blinker.vibrate();
}
void setup()
{
Serial.begin(9600);
ledcSetup(channel, freq, resolution); // 設置通道
ledcAttachPin(led, channel); // 將通道與對應的引腳連接
BLINKER_DEBUG.stream(Serial);
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
}
void loop()
{
Blinker.run();
}
上面的三個字符串分別寫入自己的密鑰和WiFi,在宿舍沒WiFi的直接開手機熱點
燒錄程序,別忘了在燒錄之前或之后打開WiFi,燒錄結束我們的開發板就會連接上我們的WiFi
我們在程序中設置了兩個Button,分別為btn-max,btn-min
在blinker的設備中也做相應的配置:
進入自己的設備
點擊右上角可以對布局和按鍵功能等做出配置
配置結束后
我們就可以測試我們的程序:
在確保設備連接上WiFi后(可以在arduino的串口監控中查看具體發來的信息和WiFi連接情況)
現在點擊開燈/關燈,舵機就會隨之轉動
使用它開關等的最簡單方式就是
(🤦♂️)把他綁在宿舍燈開關的旁邊,通過轉動,讓舵機對燈的開關施加壓力實現開關燈
雖然有點撈,但是起碼不用下床開門關燈了,可喜可賀