最近因爲項目要求,須要開發物聯網雲平臺,而本人對硬件和通訊技術一竅不通,故而選擇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—-配置
二、當開啓服務端後,ESP8266自動鏈接上了:
三、在發送框內發送」on」便可點亮Arduino板載LED燈。
四、在發送框內發送」off」便可熄滅Arduino板載LED燈。
總結:經過對網上資料的整理學習,實現了一種不經過USB轉TTL燒寫ESP8266的方式,對APP實現同一WiFi網絡內LED開關。
本文主要參考了以下資料: