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


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

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

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

連線參考圖如下:


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

#include <SoftwareSerial.h>

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

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?");
}

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

==程序效果==

打開串口,設置波特率為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進行驗證。

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

18A52A9D8177DF9B8BE1276CC4941491

2、當開啟服務端后,ESP8266自動連接上了:

93F62FF2778F7ECAEEC5835F2061EB72

3、在發送框內發送”on”即可點亮Arduino板載LED燈。

427716C31B543BA557EA6AC07D4D2C8D

BAD5F840EDD341B0F583D741F7E05841

4、在發送框內發送”off”即可熄滅Arduino板載LED燈。

38845248DABA686998901FA0E8F019AF

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

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

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

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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM