1.材料清單
ESP8266開發板、SG90 9克舵機、microUSB數據線、導線及麪包板。
2.電路連接
3.Arduino代碼
程序中,WiFi需要改爲自己家的WiFi名稱和密碼,開關燈的舵機角度需要根據自己製作的外殼進行調整。
/*
* nodemcu引腳對應數字:
* 16=D0;
* 4=D2;
* 0=D3;
* 2=D4;
* 14=D5;
* 12=D6;
* 13=D7;
* 15=D8;
* 3=D9;
* 1=D10;
* 舵機 ->D2--模擬輸出
*/
#include <ESP8266WiFi.h>
#include <Servo.h>
#ifndef STASSID
#define STASSID "此處填WiFi名稱" //WiFi名稱
#define STAPSK "此處填WiFi密碼" //WiFi密碼
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
int angle = 110;//上電置空時舵機角度
Servo myservo; //創造一個servo結構體
//創建服務器實例,指定要監聽的端口爲80端口
WiFiServer server(80);
void setup() {
Serial.begin(115200);
myservo.attach(4); //舵機信號線,接analogIn腳
//連接WiFi
Serial.println();
Serial.println();
Serial.print(F("WiFi正在連接 "));//用F函數將會把字符串放入RAM中,輸出至串口
Serial.println(ssid);
WiFi.mode(WIFI_STA);//設置爲接收WiFi模式
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(F("."));
}
Serial.println();
Serial.println(F("WiFi已連接!"));
//開啓模塊的服務器
server.begin();
Serial.println(F("模塊服務端已開啓!"));
//打印模塊的IP地址
Serial.println(WiFi.localIP());
}
void loop() {
//監測客戶端是否連接
WiFiClient client = server.available();
if (!client) {
return;//如果未連接就重新循環監測
}
// Serial.println(F("new client"));
client.setTimeout(5000); // default is 1000
//讀取請求內容的第一行
String req = client.readStringUntil('\r');
Serial.println(F("請求: "));
Serial.println(req);
//匹配 請求-->信號變量
if (req.indexOf(F("/gpio/0")) != -1) {
angle = 76; // 如果/gpio/0在請求內容中,發出開燈的信號
} else if (req.indexOf(F("/gpio/1")) != -1) {
angle = 153;// 關燈角度
} else {
Serial.println(F("無效請求"));
}
//根據請求內容設置燈的狀態
myservo.write(angle);// 0~180°
Serial.print("當前值:");
Serial.println(angle);
//讀取或忽略餘下的請求內容
while (client.available()) {
client.read();
}
//向客戶端發送回答,HTML網頁代碼內容
//nagle算法會將它們分組爲一個數據包
client.print(F("<!DOCTYPE html>\r\n<html xmlns='http://www.w3.org/1999/xhtml'>\r\n"));
client.print(F("<head>\r\n<meta charset='utf-8'/>\r\n<title>智能臥室燈</title>\r\n"));
client.print(F("<style type='text/css'>.state{text-align:center;font-size:80px;}"));
client.print(F(".on{text-align:center;font-size:200px;alink='#1a9e5f'}.off{text-align:center;font-size:200px;alink='#da4f43'}"));
client.print(F("</style><body><div class='state'>燈狀態:"));
client.print((angle>140) ? F("關</div>") : F("開</div>"));
client.print(F("<br><br><div class='on'><a href='http://"));//<br>換行
client.print(WiFi.localIP());
client.print(F("/gpio/0'>開</a></div><br><br><div class='off'><a href='http://"));
client.print(WiFi.localIP());
client.print(F("/gpio/1'>關</a></div></body></html>"));
// 客戶端實際上將被“刷新”,然後斷開連接
// 當函數返回並且“客戶端”對象被銷燬時
// 刷新=確保書面數據被服務端接收
Serial.println(F("客戶端已掛起!"));
}
4.實現效果
通過串口獲取到路由器分配給NodeMCU的IP地址,即可通過訪問網址來控制開/關燈 。
比如筆者這裏讀取到的IP爲192.168.0.105,那麼開燈時手機上訪問的網址爲http://192.168.0.105/gpio/0;關燈時手機上訪問的網址爲http://192.168.0.105/gpio/1。(手機需要和NodeMCU在同一個路由器下,即連接的是同一個WiFi)