基於arduino UNO R3+ESP8266控制LED燈的開關(無USB轉TTL工具實現)

   最近因爲項目要求,須要開發物聯網雲平臺,而本人對硬件和通訊技術一竅不通,故而選擇arduino這一簡單單片機來實現學習掌握基礎的硬件和通訊技術。git

   下面就是本人經過查閱大佬資料作的一個整合版本的經過手機APP來控制LED開關的實驗:編程

第一步:連線使用軟串口方式,利用arduino來對ESP8266進行AT命令操做。緩存

連線參考圖以下:markdown


連線完後,利用串口調試工具和Arduino IDE 軟件進行編程,實現對ESP8266的軟串口指令下達:網絡

#include <SoftwareSerial.h>工具

SoftwareSerial mySerial(10, 11); // RX, TXoop

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");學習

// set the data rate for the SoftwareSerial port
mySerial.begin(115200);
mySerial.println("Hello, world?");
}ui

void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}spa

==程序效果==

打開串口,設置波特率爲115200,串口顯示:

Goodnight moon!
Hello, world?

ERROR

表示已經進入AT模式,若是隻有Goodnight moon!,說明沒有進入AT模式。

發送AT,反饋OK。

第二步:利用AT命令來對ESP8266進行設置,使其鏈接到和手機在同一wifi網絡中。

1:發送AT+RST(執行指令)

指令:AT+RST

反饋:OK

說明:剛上電能夠不發送該指令,有些廠家生產的ESP8266模塊,沒法即時重啓復位,致使串口無響應,如已發送,則從新開關串口按鈕便可。

2:發送AT+CWMODE=3或AT+CWMODE=2(設置指令)

指令:AT+CWMODE=<MODE>

說明:<MODE>:1爲Station模式,2爲AP模式,3爲Station兼AP模式

反饋:OK

3:發送AT+CWJAP=「long」,」12345678」(選擇你所要加入的路由器名稱和密碼進入)

指令:AT+CWJAP=<ssid>,<pwd>

<ssid>:字符串參數,ESP8266WIFI名字

<pwd>:字符串參數,WIFI密碼,最長64字節,ASCII

具體內容以下:

//設置WiFi應用模式爲Station
AT+CWMODE=3
//鏈接到WiFi路由器,請將SSID替換爲路由器名稱,Password替換爲路由器WiFi密碼
AT+CWJAP="SSID","Password"
//鏈接單連模式
AT+CIPMUX=0
//設置爲透傳模式
AT+CIPMODE=1
//進入透傳模式,並保存(進入後模塊就一直爲透傳模式,須要退出則取消發送新行,發送+++)
IP地址爲遠端設備地址,例:我用手機控制,那麼個人手機在路由器WIFI上的IP地址爲192.168.1.110
AT+SAVETRANSLINK=1,"192.168.1.110",8080,"TCP"

2018.04.24補充:此時若無USB轉TTL工具,不要使用AT+SAVETRANSLINK指令,該指令會將當前設置存儲到RAM中去,ESP8266通電後自動進入鏈接模式,除非使用USB轉TTL進行燒寫,不然將沒法恢復到調試模式(沒法使用AT指令)。本人掉坑,後USB轉TTL燒寫版本後,才恢復正常。 

第三步,將LED的正極引腳插入9號數字口,負極接地,進行編程。

int led_pin = 9;
//定義一個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);

}

第四步,安裝APP進行驗證。

一、打開網絡調試助手,點擊TCP SERVER—-配置

18A52A9D8177DF9B8BE1276CC4941491

二、當開啓服務端後,ESP8266自動鏈接上了:

93F62FF2778F7ECAEEC5835F2061EB72

三、在發送框內發送」on」便可點亮Arduino板載LED燈。

427716C31B543BA557EA6AC07D4D2C8D

BAD5F840EDD341B0F583D741F7E05841

四、在發送框內發送」off」便可熄滅Arduino板載LED燈。

38845248DABA686998901FA0E8F019AF

總結:經過對網上資料的整理學習,實現了一種不經過USB轉TTL燒寫ESP8266的方式,對APP實現同一WiFi網絡內LED開關。

本文主要參考了以下資料:

手機經過ESP8266控制Arduino上的LED燈(AT指令方式)

手機經過ESP8266控制Arduino上的LED燈(燒寫方式)

相關文章
相關標籤/搜索