1. Arduino IDE配置ESP8266環境
參考:https://www.jianshu.com/p/cb0274d612b5
首先從 Arduino 官網 下載最新版本的 Arduino IDE 軟體並安裝。
安裝完成以後,進入首選項(Preferences),找到附加開發板管理器地址(Additional Board Manager URLs),並在其後新增如下資訊:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
再點選確定(OK);
之後點選工具 - 開發板 - 開發板管理器,進入開發板管理器介面:
輸入esp, 找到 esp8266 並安裝;
筆者在安裝過程中發現下載速度太慢,於是去esp8266 arduino的github頁面(https://github.com/esp8266/Arduino/releases)下載了壓縮包(筆者用的2.6.0),再放進C盤就可以了,下面是詳細步驟:
https://github.com/earlephilhower/esp-quick-toolchain/releases?after=3.0.0-gnu5
筆者將這6個壓縮包放至了百度網盤,解壓後放進這個資料夾;
連結:https://pan.baidu.com/s/1hX45SsujWOyPKyntA6fDkQ
提取碼:8266
然後在開發板管理器上,輸入esp, 找到 esp8266 即可快速安裝~
2. 燒寫程式方法
參考:http://www.elecfans.com/dianzichangshi/20171123584883.html
將ESP8266與USB-TTL按照下面的接線圖進行連線。最好使用下面這種免冷啟動的。
UTXD—–RXD
URXD—–TXD
CH_PD—-3.3v
VCC——-3.3V
GND——GND
GPIO0—–GND
將連線好ESP8266的USB-TTL插在電腦上,對IDE進行如下設定:
你可以上傳ESP8266WIFI的相關程式了。
注意事項
1.esp8266-01板對電壓的要求很高,燒寫時電源一定要採用3.3V左右。
2.如果程式碼無法上傳,並顯示警告,請檢查USB-TTL是否良好(某些USB-TTL燒寫時無法開啟串列埠,導致上傳失敗)。
3.ESP8266與USB-TTL需要RX,TX交叉連線。
4.CH_PD這個引腳無論是燒程式也好,燒完程式應用也好,都要接3.3V。
5.GPIO0這個引腳在燒程式的時候必須接GND(接低電平),燒完程式後想要進行應用的話,必須將這個引腳拉高或者懸空。
3. WiFi控制舵機程式
/*
* nodemcu引腳對應數字:
* 16=D0;
* 4=D2;
* 0=D3;
* 2=D4;
* 14=D5;
* 12=D6;
* 13=D7;
* 15=D8;
* 3=D9;
* 1=D10;
* ESP-01引腳對應數字:
* GPIO2 --2 舵機 ->模擬輸出
* GPIO16--16
*/
#include <ESP8266WiFi.h> #include <Servo.h> #ifndef STASSID #define STASSID "填寫你的WiFi名稱" //WiFi名稱 #define STAPSK "填寫你的WiFi密碼" //WiFi密碼 #endif #define ANGLE_ON 76 //開燈時的舵機角度 #define ANGLE_OFF 153 //關燈時的舵機角度 #define ANGLE_NONE 110 //置空時的舵機角度 const char* ssid = STASSID; const char* password = STAPSK; int angle=ANGLE_NONE;//舵機角度 Servo myservo; //創造一個servo結構體 //建立伺服器例項,指定要監聽的埠為80埠 WiFiServer server(80); void setup() { Serial.begin(115200); myservo.attach(16); //舵機訊號線,接analogIn腳 myservo.write(angle);// 0~180° //連線WiFi Serial.println(); Serial.println(); Serial.print(F("WiFi start connect "));//用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(1000); // default is 1000 //讀取請求內容的第一行 String req = client.readStringUntil('\r'); Serial.println(F("請求: ")); Serial.println(req); //匹配 請求-->訊號變數 if (req.indexOf(F("/gpio/0")) != -1) { angle = ANGLE_ON;//如果/gpio/0在請求內容中,發出開燈的訊號 myservo.write(angle);// 0~180° delay(1000); myservo.write(ANGLE_NONE);//將舵機重新置空,以免一直受力損壞 } else if (req.indexOf(F("/gpio/1")) != -1) { angle = ANGLE_OFF; myservo.write(angle);// 0~180° delay(1000); myservo.write(ANGLE_NONE);//將舵機重新置空,以免一直受力損壞 } else { Serial.println(F("無效請求")); } //讀取或忽略餘下的請求內容 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>ANGLE_NONE) ? 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("客戶端已掛起!")); }
通過串列埠監視器(115200波特率)獲取到路由器分配給NodeMCU的IP地址,即可通過訪問網址來控制開/關燈 。
比如筆者這裡讀取到的IP為192.168.0.143,那麼
開燈時手機上訪問的網址為http://192.168.0.143/gpio/0;
關燈時手機上訪問的網址為http://192.168.0.143/gpio/1。
(手機需要和NodeMCU在同一個路由器下,即連線的是同一個WiFi)
需要注意的是ESP8266可能連不上手機熱點和5GWiFi,WiFi名字也最好不要帶中文。