Arduino結合ESP8266 Serial WIFI模塊訪問遠程服務器

參考資料Control LED from web app using ESP8266 Serial WIFI module 強力推薦,單片機/Arduino 實現物聯的啓蒙教程,下文基本是對這篇教程的理解和翻譯html

開頭的話:如今物聯網平臺不少,相似Yeelink,樂爲物聯,Bylnk(爲microduino量身打造,更易上手),藉助它們提供的APP和接口能夠快速地實如今手機端接收遠程硬件信息。但別人的框架老是固定的,接口也是有限的,在樣式和功能上有必定侷限性,無法作到徹底知足需求的定製型APP。因此,我但願搭建本身的獨立平臺,實現遠程控制硬件,相似智能家居的設計,而後就找到這篇教程,理解運用就能夠達到本身的目的了。git

教程項目:使用ESP8266模塊和Arduino開發板在WIFI下經過網頁遠程控制LED開關github

所需器件:1. Arduino開發板 2.LED燈 3.麪包板 4.鏈接線 5.電腦web

具體步驟編程

1、配置Arduino IDE環境json

  • 安裝ESP8266開發板軟件包
    使用1.6.4及以上版本的Arduino, 打開Arduino IDE,打開 文件->首選項 在 附加開發板管理器網址 一欄寫入:http://arduino.esp8266.com/package_esp8266com_index.json 添加完之後點擊 
    作完這步之後重啓Arduino IDE,而後依次點擊 工具->開發板->開發板管理器 打開後在搜索框輸入esp,而後能找到相似'esp8266 by ESP8266 Community',點擊並安裝。
    安裝完後重啓Arduino IDE,而後依次點擊 工具->開發板->Generic ESP8266 Module,接着按照下面的信息在工具欄找到對應項進行配置
    • Flash Mode: DIO
    • Flash Frequency: 40 MHz
    • Upload Using: Serial
    • CPU Frequency: 80 MHz
    • Flash Size: 4M (1M SPIFFS)
    • Upload Speed: 115200
    • Port: 對應的USB 端口 (當你一將Arduino鏈接電腦時,在設備管理器中會冒出端口號)
    • Programmer: AVRISP mkll
    其餘的設置就按照默認的選擇不變

  • 安裝ArduinoJSON庫
    在咱們的HTML網頁中將使用到json數據,因此咱們須要添加ArduinoJson庫到咱們的Arduino IDE中。打開 項目->加載庫->管理庫 在搜索框輸入json,可能會獲得相似 'ArduinoJSON by Benolt Blanchon' 點擊它並安裝,若是安裝出現問題,能夠訪問以下連接: installing ArduinoJson library 在這步設置之後,你能夠經過 #include<ArduinoJson.h> 在項目中添加庫 了

2、配置HTML網頁程序(須要有一點網頁開發基礎)

原教程的網頁程序是用PHP+Apache配置的,若是熟悉這兩種工具使用的能夠訪問下面連接下載運行:Controling LED using ESP8266 HTML app(這個網頁應用的本質就是:在主頁面上放置兩個按鈕,點擊按鈕on,會經過js顯示一張燈亮的圖片,同時修改light.json中的數據爲{"light":"on"};點擊按鈕off,會經過js顯示一張燈滅的圖片,同時修改light.json中的數據爲{"light":"off"})。但對於我來講,重點在於掌握控制原理而不在於準備網頁程序,由於遠程控制的形式有不少種(網頁端、安卓應用、蘋果應用),不必爲了完成測試把每種應用都學一遍,因此我只在本身電腦上新建一個web project,例如工程名起爲wifiarduino,裏面放一個light.json文件,內容爲{"light":"off"},而後放到tomcat中發佈(須要修改端口號爲http協議默認端口號80),而後就能經過在瀏覽器端輸入http://localhost/wifiarduino/light.json查看到了。瀏覽器

 3、實物連線tomcat

咱們不須要使用專門的固件燒寫工具,咱們能夠將移除了ATmega芯片的Arduino開發板作爲固件燒寫工具。以下圖所示,移除中間的芯片。
app

ESP8266        Arduino框架

  • VCC                      3.3 V
  • GND                     GND
  • CH_PD                 3.3 V
  • TX                         TX
  • RX                         RX
  • GPIO2                   3.3 V
  • GPIO0                   GND

 給ESP8266供電:ESP8266模塊是由低電壓(3.3V DC)供電的,把ESP8266的VCC和CH_PD鏈接到Arduino的3.3V開發板上,在GPIO2和3.3V電源中間接一個1KΩ的電阻。
鏈接TX/RX引腳:TX/RX是 用於編程模塊,串口I/O以及調試。將ESP8266的TX與Arduino板上的TX,ESP8266的RX與Arduino上的RX對應鏈接起來。
將ESP8266設定爲FLASH(燒寫)模式:當GPIO0(上圖紫色線)接地線時,ESP8266是以bootloader模式(編程模式)啓動的,這也就是你能夠燒寫ESP8266(將Arduino上的代碼轉移到ESP8266上)的時候。在Arduino代碼加載完畢時,你將看到Arduino IDE底部提示「上傳結束」的信息,而後代碼就會開始運行了。
程序上傳結束後,將紫色線移除:當你不想將ESP8266一直設定爲燒寫模式時,將紫色線移除便可,程序將會一直在ESP8266上執行。

4、編寫Arduino代碼

原理:下面咱們將用到<ESP8266WiFi.h>以及<ArduinoJson.h>頭文件,實質上就是經過ESP去訪問咱們的light.json文件,若是json文件中light的值是on的話,就點亮LED;若是light的值是off的話,就關閉LED(你能夠在本地編輯json文件中light的值,來控制LED的開關)。下面是示例代碼:

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
const char* ssid     = "mywifi"; //修改爲你可訪問的wifi名稱 const char* password = "mywifipassword";  // 修改爲wifi密碼 const char* host     = "192.168.1.10"; // 你的網點域名或IP 
String path          = "/wifiarduino/light.json"; // 文件路徑 const int pin        = 2;
void setup() {
    pinMode(pin, OUTPUT);
    pinMode(pin, HIGH);
    Serial.begin(115200);
  delay(10);
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  int wifi_ctr = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
    Serial.println("IP address: " + WiFi.localIP());
}
void loop() {
    Serial.print("connecting to ");
  Serial.println(host);
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  client.print(String("GET ") + path + " HTTP/1.1\r\n" +               "Host: " + host + "\r\n" +                "Connection: keep-alive\r\n\r\n");
  delay(500); // wait for server to respond
  // read response  
String section="header";
  while(client.available()){
    String line = client.readStringUntil('\r');
    // Serial.print(line);    // we’ll parse the HTML body here
    if (section=="header") { // headers..
      Serial.print(".");
      if (line=="\n") { // skips the empty space at the beginning
         section="json";
      }
    }
    else if (section=="json") {  // print the good stuff
      section="ignore";
      String result = line.substring(1);      // Parse JSON
      int size = result.length() + 1;
      char json[size];
      result.toCharArray(json, size);
      StaticJsonBuffer<200> jsonBuffer;
      JsonObject& json_parsed = jsonBuffer.parseObject(json);
      if (!json_parsed.success())
      {
        Serial.println("parseObject() failed");
        return;
      }
      // Make the decision to turn off or on the LED
      if (strcmp(json_parsed["light"], "on") == 0) {
        digitalWrite(pin, HIGH);
         Serial.println("LED ON");
      }
      else {
        digitalWrite(pin, LOW);
        Serial.println("led off");
      }
    }
  }
  Serial.print("closing connection. ");
}

 5、最後須要作的事

咱們打開Arduino IDE中 工具->串口監視器,並將右下角的波特率設定爲115200,而後它將會顯示你是否連上了WiFi,若是你看到ESP8266上有紅燈亮起,且有藍燈閃爍時,說明你的無線模塊準備完畢。最後能夠移除RX/TX引腳連線,經過3.3V的鋰電池給ESP8266供電(以下圖所示)。感謝閱讀,祝編程愉快!

相關文章
相關標籤/搜索