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燈。)