1. 程式人生 > >ESP8266學習筆記(3):手機發送資料經WiFi模組透傳控制Arduino開發板上的led燈

ESP8266學習筆記(3):手機發送資料經WiFi模組透傳控制Arduino開發板上的led燈

需要注意的事情就是,ESP-01模組需要和手機連線在同一個區域網內。

Arduino IDE需要下載支援ESP的開發板,我們的模組是ESP-01這裡選用NodeMCU 0.9 下載開發板的方法可參考:
基於esp8266的智慧家居控制系統-基礎篇1介紹arduino ide for esp8266
附上:已經可以直接使用的Arduino IDE下載方式
這裡寫圖片描述
走到這一步說明我們前面的準備工作都做完了,接下來附上需上傳到ESP-01模組的程式碼:

#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 3   //最大同時聯接數,即你想要接入的裝置數量,8266tcpserver只能接入五個,哎
const char *ssid = "WIFI"; ////這裡是我的wifi,你使用時修改為你要連線的wifi ssid const char *password = "1234567890"; //你要連線的wifi密碼 WiFiServer server(8266);//你要的埠號,隨意修改,範圍0-65535 WiFiClient serverClients[MAX_SRV_CLIENTS]; void setup() { Serial.begin(115200); delay(10); pinMode(16, OUTPUT); digitalWrite(16, 0); WiFi.begin(ssid, password); while
(WiFi.status() != WL_CONNECTED) { delay(500); } server.begin(); server.setNoDelay(true); //加上後才正常些 } void loop() { blink(); uint8_t i; if (server.hasClient()) { for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (!serverClients[i] || !serverClients[i].connected()) { if
(serverClients[i]) serverClients[i].stop();//未聯接,就釋放 serverClients[i] = server.available();//分配新的 continue; } } WiFiClient serverClient = server.available(); serverClient.stop(); } for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (serverClients[i] && serverClients[i].connected()) { digitalWrite(16, 0);//有連結存在,就一直長亮 if (serverClients[i].available()) { while (serverClients[i].available()) Serial.write(serverClients[i].read()); } } } if (Serial.available()) { size_t len = Serial.available(); uint8_t sbuf[len]; Serial.readBytes(sbuf, len); //push UART data to all connected telnet clients for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (serverClients[i] && serverClients[i].connected()) { serverClients[i].write(sbuf, len); //向所有客戶端傳送資料 delay(1); } } } } void blink() { static long previousMillis = 0; static int currstate = 0; if (millis() - previousMillis > 200) //200ms { previousMillis = millis(); currstate = 1 - currstate; digitalWrite(16, currstate); } }

點選Arduino IDE左上角的“√”號進行編譯,成功後點擊右邊的“→”進行上傳。(不懂如何進入燒錄模式的看這裡: ESP8266-01學習筆記01:如何使用USB轉串列埠對ESP-01進行入門除錯、燒錄韌體?
一定要注意獨立供電,檢查好杜邦線的連線。另外需要斷電後再次上電才能進入燒錄模式。注意波特率是否和你的埠屬性設定的一致。
另外:不建議直接複製程式碼進去,可以先把程式碼複製到Notepad裡面再複製進Arduino IDE(否則容易出現問題)

燒錄成功後,重新上電進入執行模式。會發現ESP-01已經連線上你的WIFI了。
下面附上客戶端,這裡我們可以自己下載一個網路除錯助手,開啟TCP client,輸入ESP-01的IP和埠號(我們設定的8266)IP如何查詢?開啟192.168.1.1檢視路由器的設定介面找到IP。沒有路由器的,咱們用電腦開一個WIFI共享大師,然後電腦開啟CMD,輸入IPconfig,就可以查看了。
然後開啟ArduinoIDE 的串列埠監視器
這裡寫圖片描述
手機端傳送資料就可在串列埠監視器收到資訊了。

這裡我附上一個手機端(安卓)開發原始碼:client

下載之後找到bin 資料夾下的apk檔案,安裝手機上即可直接使用。

趁熱打鐵,我們將ESP-01模組和Arduino連線,使用手機通過ESP控制Arduino上面的led燈。(ESP也就是透傳)
參考文章:手機通過ESP8266控制Arduino上的LED燈(燒寫方式)

接線方式:

ESP-01 Arduino Mega 2560
VCC 3v3
GND GND
RX RX
TX TX
CH_PD 3V3

上傳到Arduino的程式碼:

int led_pin = 13;
//定義一個10位元組的整型資料變數cmd作為命令,這裡可以修改為不同的數字。此處設定為10是為了有更好的相容性。
char cmd[10];
//判斷收到的cmd是否有內容
bool valid_cmd = false;

void setup()
{
//定義連線led的引腳為輸出訊號
pinMode(led_pin, OUTPUT);
Serial.begin(115200);
}
void loop()
{
/*以下部分是串列埠資訊處理過程*/
//定義一個整數型變數i
int i;
//如果串列埠收到有資料
if (Serial.available() > 0)
{
//變數i最大為10
for (i = 0; i < 10; i++)
{
//清空快取,存入cmd變數,並以\0作為結束符
cmd[i] = '\0';
}
//此時i只能取前9位,第10位是結束符\0
for (i = 0; i < 9; i++)
{
//再次判斷串列埠如果收到有資料,防止資料丟失
if (Serial.available() > 0)
{
//給變數cmd賦值,取串列埠收到的前9位字元
cmd[i] = Serial.read();
delay(1);
}
else
{
//如果串列埠資料超過9位,後面的字元直接忽略,跳到下一步
break;
}
}
/*以上串列埠資訊處理結束*/

//得到最終變數cmd的有效值
valid_cmd = true;
}

//判斷變數cmd的值,開始處理
if (valid_cmd)
{
//如果變數cmd的前2位的值是on
if (0 == strncmp(cmd, "on", 2))
{
//則連線led的引腳電壓被置高5V,
digitalWrite(led_pin, HIGH);
//串列埠列印返回值ON,表示ON的操作執行成功
Serial.println("ON");
}
else if (0 == strncmp(cmd, "off", 3)) //否則如果變數cmd的前3位的值是off
{
//則連線繼電器的引腳電壓被置低0V,燈的電路被斷開,燈滅
digitalWrite(led_pin, LOW);
//串列埠列印返回值F,表示OFF的操作執行成功
Serial.println("OFF");
}
else //如果以上兩個條件都不成立,前2位不是ON,或者前3位不是OFF,即不正確的命令
{
//僅串列埠列印返回值X,表示指令錯誤。
Serial.println("X");
}
//到此,變數cmd的指令被處理完畢
valid_cmd = false;
}
//延遲10毫秒,返回loop主程式繼續讀取新的串列埠指令
delay(10);

}

然後供電執行,會發現ESP-01接入WIFI,然後找到他的IP,使用網路除錯助手,新建TCPclient,接入服務端,傳送on或者off就可以控制arduino上的led燈了(不需外接led,13口對應arduino上的led燈。)