WiFi控制燈泡(ESP8266+Arduino+舵機)

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)

控制效果視頻見B站  https://www.bilibili.com/video/av94678103/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章