最近由於項目要求,需要開發物聯網雲平台,而本人對硬件和通信技術一竅不通,故而選擇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—-配置
2、當開啟服務端后,ESP8266自動連接上了:
3、在發送框內發送”on”即可點亮Arduino板載LED燈。
4、在發送框內發送”off”即可熄滅Arduino板載LED燈。
總結:通過對網上資料的整理學習,實現了一種不通過USB轉TTL燒寫ESP8266的方式,對APP實現同一WiFi網絡內LED開關。
本文主要參考了如下資料:
手機通過ESP8266控制Arduino上的LED燈(AT指令方式)
手機通過ESP8266控制Arduino上的LED燈(燒寫方式)