Arduino UNO WiFi = Arduino UNO板 + ESP8266

2016年元旦當天,收到Arduino S.R.L公司(arduino.org)創辦人Federico Musto先生寄來的聖誕禮物:Arduino UNO WiFi控制板

Arduino UNO WiFi控制板

跟新的Arduino系列控制板一樣,UNO WiFi板的排插外側有印上接腳的編號(所以我們不用自己搞貼紙DIY了):

Arduino UNO WiFi控制板

這張控制板的尺寸和UNO一樣,板子上整合了Arduino UNO和ESP8266(具備Wi-Fi網路連線的系統級晶片)。它採用ATmega328微控器執行Arduino程式,並且同樣採用ATmega16U2作為USB序列埠通訊晶片。廣告一下,ESP8266的說明和程式設計請參閱《超圖解物聯網IoT實作入門》第12和13章。

Arduino UNO WiFi控制板

ESP8266晶片透過序列通訊介面連接其他微控器(如:Arduino板),但由於Arduino控制板的序列埠肩負接收程式碼的重責大任,因此,UNO WiFi板採用NXP(恩智浦半導體)的SC16IS750IBS序列轉I2C/SPI介面的晶片,把EP8266的序列介面轉換成I2C,再連接到Arduino的ATmega328微控器。

SC16IS750IBS序列轉I2C/SPI介面的作用

平時,Arduino UNO的網路資料經由I2C介面(亦即:A4和A5腳)傳送到SC16IS750IBS,再從這個晶片的序列埠,轉送給ESP8266晶片,反之亦然。

上傳程式給Arduino時,除了透過控制板的USB介面,也可以用Wi-Fi無線方式上傳。透過無線上傳程式時,程式檔將從ESP8266的序列埠直接傳入Arduino的序列埠。ESP8266的序列埠和I2C介面通訊會依照使用情況自動切換,我們的程式碼無須介入。

設置Wi-Fi網路和ESP8266的運作模式

Arduino Uno WiFi板子上的16M bit(2MB)快閃記憶體,用於儲存ESP8266的韌體,此網路晶片的預設工作模式為AP+STA,也就是同時充當網路基地台(Access Point)和無線終端設備(Station)。

若要啟用OTA(Over The Air,無線上傳程式碼)功能,ESP8266必須先設置成STA(無線終端)模式。Arduino UNO WiFi的無線網路參數,都是用瀏覽器設置。設置參數之前,要先透過Wi-Fi連接此控制板。

接上電源之後不久,即可探尋到此控制板的Wi-Fi訊號:

連接Arduino UNO WiFi的無線網路

連上Arduino Uno WiFi基地台,再透過瀏覽器連接到http://192.168.240.1/網址,即可進入此控制板的無線網路設置畫面。

Arduino UNO WiFi的無線網路設置畫面

這個網頁程式存在EP8266韌體中,可顯示無線網路的運作狀況和資訊,例如,IP位址、MAC位址、工作模式…等等,也有提供一個相當於無線版「序列埠監測視窗」的WiFi Console(WiFi控制台)

在WIFI設定畫面,設定讓無線網路連接到家裡的無線路由器之後,再按下右上角的SWITCH TO STA MODE(切換到連線終端模式),詳細的操作說明可參閱arduino.org網站的Getting started with Arduino UNO WiFi

設定成STA模式,UNO WiFi板便失去無線基地台(AP)的能力,但仍具備網路連線功能。連接UNO WiFi板的電腦,必須和它連線到相同的無線網路環境。UNO WiFi板預設的主機名稱是“arduino”,透過“arduino.local”網址,即可開啟它的網路設定頁面:

http://arduino.local/

使用Arduino IDE 1.7.10版撰寫程式

Arduino UNO WiFi控制板是Arduino S.R.L公司的產品,請使用該公司的新版Arduino IDE(目前是1.7.10版)來編寫程式。Arduino S.R.L公司的Jeff告知,在今年五月舊金山Maker Faire會展中,該公司宣佈計劃未來會透過add-on platform packages(外掛平台套件)來支援arduino.cc的Arduino IDE,減少開發者使用Arduino IDE的困擾。

先在IDE主功能表的「工具→板子」選擇Arduino Uno WiFi板,再從「工具→序列埠」選擇有線序列埠(如下圖中的COM5),或者網路埠(如下圖中的arduino at 192.168.7.185)。

使用Arduino IDE 1.7.10版撰寫程式

這項「網路埠」連線功能,可讓開發人員在遠端更新Arduino控制板的軟體。

Arduino UNO WiFi網路程式入門

以往,Arduino都是透過乙太網路或者Wi-Fi無線網路擴展板(像Arduino官網的這一款WiFi Shield)連接網際網路,這兩種方案都使用SPI介面與Arduino控制板相連。

Arduino UNO WiFi板的ESP8266晶片則是經由I2C連接Arduino微控器,加上每個網路晶片的控制方式都不一樣,所以UNO WiFi板的網路程式也不同於乙太網路程式;若不使用Wi-Fi網路功能,這塊板子的程式設計方式和普通的UNO相同。

乙太網路以及UNO WiFi的連接方式

在連接乙太網路模組的情況下,Arduino UNO板的數位10~13腳無法挪作他用;Arduino UNO WiFi則是犧牲了A4和A5兩個類比腳。

Arduino S.R.L公司(arduino.org)創辦人Federico Musto先生

底下的程式將使用Arduino IDE內建的WebSever(網站伺服器)範例,說明UNO WiFi板的程式架構。上傳此程式碼之後,使用者將能透過底下的網址讀取UNO WiFi板的自製網站:

讀取UNO WiFi板的自製網站的URL網址

我們自訂的網路程式路徑,始終被附加在arduino.local/arduino/後面。底下是WiFi網站伺服器程式的架構,由於無線網路的IP、閘道器(gateway)位址…等參數,都是透過瀏覽器設置,所以我們的程式碼裡面不需要設定:

WiFi網站伺服器程式的架構

其中負責處理前端資料的WiFiData類型,定義在ArduinoWiFi程式庫資料夾裡的SC16IS750.h檔案中。每當有用戶連接此控制板時,process()自訂函式將讀取URL網址最後面的參數,其值若是“webserver”,則呼叫WebServer()自訂函式輸出網頁,若非“webserver”,ESP8266會自行在網頁上輸出“Not found.”(查無此資源)。

修改自Arduino IDE內建的WebSever(網站伺服器)範例的完整程式碼如下:

#include <Wire.h>
#include <ArduinoWiFi.h>
/*
  開啟瀏覽器,輸入此網址:
  http://<IP>/arduino/webserver/
  或者
  http://<hostname>.local/arduino/webserver/

  相關說明請參閱:
  http://labs.arduino.org/WebServer
*/

void setup() {
  Wifi.begin();
  Wifi.println("WebServer Server is up");  // 輸出訊息到(網頁的)WiFi控制台
}

void loop() {
  while (Wifi.available()) {
    process(Wifi);
  }
  delay(50);
}
void process(WifiData client) {
  // 讀取命令
  String command = client.readStringUntil('/');

  if (command == "webserver") {
    WebServer(client);
  }
}
void WebServer(WifiData client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Refresh: 5");  // 每5秒自動更新(重新整理)網頁
  client.println();
  client.println("<html>");
  client.println("<head> <meta charset=\"utf-8\"><title>UNO WIFI物聯網</title> </head>");
  client.print("<body>");

  for (int analogChannel = 0; analogChannel < 4; analogChannel++) {
    int sensorReading = analogRead(analogChannel);
    client.print("類比輸入 ");
    client.print(analogChannel);
    client.print(" 的值為 ");
    client.print(sensorReading);
    client.print("<br/>");
  }

  client.print("</body>");
  client.println("</html>");
  client.print(DELIMITER); // 中斷與用戶的連線
}

乙太網路和WiFi擴展板程式,都是透過底下的語法中斷用戶端的連線:

client.stop();

UNO WiFi控制板則是透過這個敘述中斷連線,其中的DELIMITER常數也是定義在SC16IS750.h檔案裡面:

client.print(DELIMITER);

延伸閱讀

Posts created 469

124 thoughts on “Arduino UNO WiFi = Arduino UNO板 + ESP8266

    1. 嗯…不過,UNO WiFi和Yun,都是arduino.org位於台北的Dog Hunter設計團隊的成果,台灣設計、義大利製造。

      thanks,
      jeffrey

  1. 你好,我是初3的學生,想要請教一下如何作出像ethernet的webclient程式連接其他伺服器呢?

    1. 咦~jeff~你該不會是今年6月3日晚上參加arduino.org舉辦的Maker+Pizza活動的那位學生吧??

      用Arduino Uno WiFi當作webclient… 好問題,我還沒試過,測試後告訴你,拍謝。

      thanks,
      jeffrey

    2. 從Uno WiFi的範例程式得知,讓Uno WiFi當作前端連接網站伺服器的程式,必須透過Ciao(橋接器)程式庫連接無線網路晶片,Ciao提供的write()方法用於對伺服發出連線資料。

      執行Ciao的write方法之前,程式還要指定連接器(connector)類型,我們可以把「連接器」看待成「線路轉接頭」,在連接HTTP網站伺服器的場合,連接器類型請設定成”rest”。

      筆者使用Node.js建立一個簡易的網站伺服器程式,它的rnd路徑將能接收一個r參數:

      var express = require('express');
      var app = express();
      
      app.get('/', function (req, res) {
        res.status(200).send('

      Hello World!

      '); }); app.get("/rnd", function(req, res) { var r = req.query.r; if (r != undefined) { console.log("隨機數字: " + r); } else { console.log("沒收到資料!"); } res.status(200).send('OK'); }); var server = app.listen(80, function () { console.log('伺服器在80埠開工了!'); });

      假設網站伺服器的IP是 192.168.7.101,那麼,在瀏覽器中輸入 “192.168.7.101/rnd?r=12″,伺服器將會在終端機視窗顯示「 隨機數字: 12」。

      Arduino Uno WiFi的測試程式碼如下,它將每隔10秒連線到 192.168.7.101網站伺服器,並且送出一個隨機數字:

      #include <Wire.h>
      #include <Ciao.h> // 必須引用「橋接器」程式庫
      
      #define CONNECTOR "rest" // 連接器類型
      #define SERVER_ADDR "192.168.7.101" // 網站伺服器IP位址
      
      int r = 100; // 暫存隨機數字的變數
      String command = "/rnd?r=";   // 傳給網站伺服器的路徑參數
      
      void setup() {
        Ciao.begin(); // 啟用「橋接器」
        // 以"rest"連接器類型,連線到網站伺服器,送出隨機數字。
        Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
      }
      void loop() {
        delay(10000); // 暫停10秒
        r = random(1000); // 取隨機數字
        Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
      }
      

      thanks,
      jeffrey

  2. 您好~我最近照著 超圖解物聯網IoT實作入門 第十二章 實作透過Arduino執行ESP8266的AT command,確定線路都沒問題,不管下任何指令都沒有回覆,請問有什麼可能原因嗎?p.s.透過CP2102轉接板則能正常執行

    1. 蛤?CP2102可以,Arduino卻不行?可是,它們倆個只是晶片型號不同,功能一樣欸。
      請把送出AT命令的那一行敘述,也就是ESP.print()改成ESP.write()試試看。

      thanks,
      jeffrey

    2. 如果你確定線路, Arduino和ESP8266都沒有問題的話, 建議你可以把ESP8266″完全斷電”(我有自己做一塊3.3V供電的擴充板, ESP8266直接插在擴充板上).
      我的情況是, 線路、Arduino和ESP8266之前使用都是正常, 是忽然間在Serial Monitor裡下AT command完全沒有反應. 之前遇到這個情況, 我都是重刷ESP8266的韌體就好了. 但後來發現, 只要把ESP8266 “完全斷電”(不是只有拔除擴充板的電源而已, 是把ESP8266從擴充板上拔下), 過個幾秒再插上, 其它東西都沒動, 再下AT command就出來了…
      至於是什麼原因我不確定, 因為電子元件我不是很熟, 詳細情形可能要查查看有沒有相關的官方文件說明了.

  3. 你好,我按照你寫在評論區的教程做了一個那種的node.js伺服器,成功訪問并返回隨機數到終端,然而試圖使用你給出的Arduino Uno WiFi的測試程式碼透過Arduino IDE上傳到板子上卻失敗。錯誤提示是:

    Arduino:1.8.0 (Mac OS X), 开发板:”Arduino Uno WiFi”

    In file included from /Users/pgool/Documents/Arduino/draft_ciao/draft_ciao.ino:1:0:
    /Users/pgool/Documents/Arduino/libraries/Ciao/src/Ciao.h:42:2: error: #error CPU not yet supported
    #error CPU not yet supported
    ^
    exit status 1
    为开发板 Arduino Uno WiFi 编译时出错。

    似乎目前ciao並不支持Arduino Uno WiFi這個開發板型號呀。。請問你是如何成功上傳代碼的?

  4. 老師您好~
    個人有架設伺服器做數據收集
    我使用的方式是利用一個PHP網頁讀取
    GET值後再寫入伺服器 http://…/index.php/?humi=26&temp=63
    Arduino uno wifi 的部分利用String做組合網址並存入變數
    現在的問題出在於如何單純連到網址做資料傳送?
    還請您多多幫忙!

  5. 使用 Arduino org 1.7.11 所編譯問題
    程式:

    #include
    #include // 必須引用「橋接器」程式庫

    #define CONNECTOR “rest” // 連接器類型
    #define SERVER_ADDR “192.168.7.101” // 網站伺服器IP位址

    int r = 100; // 暫存隨機數字的變數
    String command = “/rnd?r=”; // 傳給網站伺服器的路徑參數

    void setup() {
    Ciao.begin(); // 啟用「橋接器」
    // 以”rest”連接器類型,連線到網站伺服器,送出隨機數字。
    Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
    }
    void loop() {
    delay(10000); // 暫停10秒
    r = random(1000); // 取隨機數字
    Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
    }

    錯誤訊息:
    In file included from sketch_jan11a.ino:2:0:
    C:\Users\dawei\Documents\Arduino\libraries\Ciao\src/Ciao.h:42:2: error: #error CPU not yet supported
    #error CPU not yet supported
    :
    sketch_jan11a.ino: In function ‘void setup()’:
    sketch_jan11a.ino:11:14: error: call to ‘void SerialCiaoClass::begin(long unsigned int)’ uses the default argument for parameter 1, which is not yet defined
    編譯時發生錯誤

    1. 剛剛測試了一下程式碼,發現我上面留言中的程式庫 Wire.h 和 Ciao.h 名稱字首沒有大寫,拍謝。
      這是編譯成功的畫面:

      Arduino Uno WiFi Ciao.h library

      thanks,
      jeffrey

    2. 我上次有注意到大小寫問題
      改正之後還是有錯誤訊息…
      (如下)
      In file included from sketch_jan12a.ino:1:0:
      C:\Users\Unrealin\Documents\Arduino\libraries\Ciao\src/Ciao.h:42:2: error: #error CPU not yet supported
      #error CPU not yet supported
      :
      :
      C:\Users\Unrealin\Documents\Arduino\libraries\Ciao\src/CiaoData.h:39:7: error: previous definition of ‘class CiaoData’
      class CiaoData {
      ^
      sketch_jan12a.ino: In function ‘void setup()’:
      sketch_jan12a.ino:13:14: error: call to ‘void SerialCiaoClass::begin(long unsigned int)’ uses the default argument for parameter 1, which is not yet defined
      編譯時發生錯誤
      ==========================================================================================
      目前我覺得還是Ciao.h程式庫的問題

    3. Ciao程式庫使用內建在IDE的版本即可(位於Arduino安裝路徑的libraries裡面),不需要重新安裝。

      thanks,
      jeffrey

    4. 请问,您现在解决了这个问题了吗?
      我也遇到了 #error CPU not yet supported

    5. 刚刚下载安装最新的1.8.3 IDE,控制板选择Arduino Uno WiFi,编译代码没问题。

      thanks,
      jeffrey

  6. HI jeffrey:

    想請教一下Arduino wifi裡面利用SPI通訊方式連接Arduino,然後又能當AP的有哪幾塊

  7. 想請教一下
    我是arduino新手
    想買一塊開發版練習
    會推薦用UNO就好還是UNO WiFi這版

  8. 請教一下 小弟的是arduino YUN 想透過 YUN 的WI-FI 把資料傳到資料庫上
    請問一下大概要如何做才好, 小弟對資料庫方面不太熟悉
    請大大指點一下

    1. 這個題目很大…當前的主流資料庫系統分成SQL和NoSQL兩大類型,以免費、開放原始碼的資料庫系統來說,SQL的代表是MySQL,NoSQL的代表則是MongoDB。你可以把這些資料庫系統安裝在電腦上,或者找到免費的雲端方案(亦即,已經幫你架設好資料庫系統),像Google的Firebase是一種雲端NoSQL資料庫,並且有提供免費、功能比較有限的方案。

      無論你打算在自家的電腦上安裝資料庫系統,或者選擇雲端方案,都要了解資料庫的操作方式,例如,新建、更新和刪除資料的方法。如果是自行安裝資料庫,你還得決定要採用哪一種中介語言來連接和操作資料庫,例如,Node.js, PHP, Python,…等等。若是採用像Google Firebase這種方案,你要閱讀它的API(應用程式介面)文件,看看它提供哪些操作指令和語法。

      thanks,
      jeffrey

    1. 位於arduino.org的IDE( 新版本已經沒分別了)安裝裡的\libraries\ArduinoWiFi\src路徑裡面。

      thanks,
      jeffrey

  9. 老師您好!
    我剛買了一個arduino uno wifi板,跟著wedserver範例上載了程式到uno wifi,想問下hostname.local/arduino/webserver這個方法是不是需要在DNS登記了才可使用?另外這個路徑可以更改嗎?例如hostname.local/test/這樣可以嗎?還有一個問題我是使用了IDE 1.8.1在工具 > 序列埠中只能選擇com port上載程式没有可以選擇wifi上載的選項是不是IDE version問題 ?

    1. 不需要在DNS登記,主要是作業系統要支援mDNS,Mac OS X和iOS系統是內建支援,你可以用Android手機的Chrome瀏覽器瀏覽。

      hostname.local/arduino/webserver這個路徑是ESP8266韌體設定的,我沒看到相關的API指令。至於Wi-Fi port,請問你有替板子設定成STA模式嗎?有些使用者遇到Wi-Fi無法連線的問題,我手上的板子並沒有這種情況。

  10. 謝謝回覆 ! 設定成STA模式然後開啟IDE就見到Port可以選wifi上載了,至於mDNS我用了Android手機內的Chrome瀏覽器輸入hostname.local/arduino/webserver這個路徑還是會跳到google的搜尋頁,Android版本是6.0.1,Chrome是55.0.2883.91是否要在裝置內設定些什麼 ? 如果要令windows支援mDNS有没有網站有參考資料?

    1. Arduino Uno Wifi板的預設hostname是arduino,所以網址是arduino.local,你有改過嗎?或者,請在網址前面手動輸入”http://”試試看。
      在Windows上解析mDNS,請安裝蘋果公司提供的Bonjour Print Services for Windows,詳細說明請參閱《超圖解物聯網IOT實作入門》第13章「設置區域網路域名」單元。

      thanks,
      jeffrey

  11. 有些問題想請教,我在試做第二版中紅外線發射範例12-4,我已將紅外線發射led短腳接上GND長腳串接330歐姆電阻到D3 pin更改了紅外線編碼,正常上載程式到UNO板,在監控視窗中任意輸入一個字元,監控視窗亦顯示了action但目標没有反應,之後我試用一相機鏡頭對著led再按鍵,看不到led有閃光是不是led有問題壞掉?
    另外如果我用一個UNO板可否輸出多個led發射?因為範例中提到只能接到D3 pin,可以加多幾個pin位做發射用?

    1. 一般的數位相機(如:Sony NEX系列),其CCD或CMOS感光元件都有加裝隔絕紅外線的低通透濾鏡(Infrared Cut Filter),因此無法觀測到紅外線。我用Canon HF S11攝影機和Note 4手機,可以觀測到紅外線光。所以你可能需要換其他設備觀測。

      至於驅動多個紅外線LED,請參閱10-39頁「同時點亮多個發光二極體」,透過電晶體驅動。

      thanks,
      jeffrey

  12. 感謝回覆,我使用的是S7手機,我試用一個電視搖控觀測過是看到紅外線閃光,但是在範例測試中並未看到,可能我試用別的LED發射再作測試.還是老師還有更好的方法提供參考?

    1. 如果你有二塊Arduino板(我只有購買一塊,另一個是參考書上的教學再另外做一塊簡易型的Arduino板),一個接紅外線LED,另一個接紅外線接收器,這樣測試會比較直接。
      接收器的那塊Arduino跟電腦連接(因為要看Serial Monitor來確定是否有接收到訊號),另一塊用電池供電。

    2. 忽然想到,若是為了測試是否有訊號發出,其實只要把紅外線LED換成普通LED,即可用肉眼觀察了。

      thanks,
      jeffrey

  13. 老師您好,請教您一些問題。
    您在超圖解物聯網IOT入門實作第五章-使用霹靂五號操控Arduino這個部分,
    演示使用Firmata協定,與PC溝通。我手邊剛好也有Arduino Uno WiFi,
    想嘗試使用WiFi,請您指點一下!

    1. StandardFirmata.ino程式庫採用序列埠連線,理論上可以透過Uno WiFi上的ESP8266通訊,這部份要麻煩你自行實驗看看。

      thanks,
      jeffrey

  14. 老師您好 !
    回上回的紅外線發射測試,最後我換了一個LED發射就冇問題了.今次想問Arduino webserver的問題,我試在html裏寫了一個按鈕,按一下時網址顯示出192.168.1.25/?L=0這個路徑,我看了第二版的範例16-4未能明白要如何才可以取得路徑中”/?L=0″的參數來控制arduino,能否舉出再簡單的例子?有什麼重點需要注意?求指點一下謝謝!

    1. 處理GET方法(查詢字串)的流程比較複雜,但其實你可以沿用16-32頁的getCmd()函式,查詢字串的參數名稱將存放在該函式的name變數,參數值則保存在value變數。

      thanks,
      jeffrey

    2. 老師您好,

      關於W5100以太網路卡,我最近發現屋企的router TL-WR740N在瀏覽器輸入W5100的IP瀏覽器顯示無法連上這個網站,我在序列埠監控視窗亦見到顯示IP 0.0.0.0,這個Webserver程式碼我在公司的網絡中試過是沒有問題一切正常的,究竟是router設定問題或是其他問題呢?有什麼要注意?請指教謝謝!

    3. 應該是靜態IP和固定IP的問題(請參閱15-5頁),書本15-26頁程式採用的是動態IP,動態IP的寫法在15-28頁。

      thanks,
      jeffrey

  15. 老師您好
    目前我用Arduino uno + Ethernet shield
    透過網路端傳送數值到php後存入Mysql
    但是在php都只收到空值
    是用php的POST接收資料
    不知道是哪方面出了問題
    嘗試過多種寫法但還是無法解決
    麻煩老師指點,謝謝

    1. 建議先製作一個簡單的PHP頁面,把接收來自Arduino的值echo在網頁上,先釐清是PHP還是Arduino的程式有問題。

      thanks,
      jeffrey

  16. 老師您好
    目前手邊有塊 arduino uno wifi
    目前想做的是若沒有wifi環境時先將sensor資訊記錄在sd card內
    當接到wifi時,想把它當成client端傳送sd卡離線紀錄的資訊給自己的server
    利用Ciao library 的write 方法傳送get的話uri會過長
    所以想請問如何利用arduino uno wifi 傳送post request 呢?

    1. 請參閱Arduino Uno WiFi的ResetClient範例程式,請把底下這三行:

      const char* server = "download.arduino.org";
      const char* method = "GET";
      const char* resource = "/latest.txt";
      

      改成底下的敘述測試看看,其中的var1和var2是上傳資料的參數名稱,123和abc是虛構的資料值:

      const char* server = "你的HTTP伺服器網址";
      const char* method = "POST";
      const char* resource = "var1=123&var2=abc";
      

      thanks,
      jeffrey

  17. 老師 您好!

    想請教你有關arduino+esp8266的問題!

    因為我們沒有arduino uno wifi板子 所以我們是使用uno版+esp8266來製作題目。
    是希望能夠透過esp8266來傳輸字串 由app發送個人熱點的名稱以及密碼 貼上字串至原本板子被寫死的wifi名稱密碼,
    達到讓使用者自訂自己的個人熱點名稱。
    想請問老師 如何傳輸這樣的字串 以及這樣的行為 是否esp8266可以滿足我們的要求。

    感謝老師!

  18. 老師 您好!

    謝謝老師提供的函式庫!

    我們已經使用 app inventor 至做出一個透過藍芽來傳輸字串的 app

    目前已經放棄修改SSID 以及 PASSWORD了 我們直接寫死 給arduino D1 一個路由器來連線
    所以變成已經有網路的前提下 想修改api key 來讓使用者輸入自己的金鑰 來將值上傳至自己的 ThingSpeak.

    想修改的程式碼如下:

    String apiKey = “0FUUBXXXXXXXXXX”;
    const char* ssid = “eric”;
    const char* password = “88888888”;
    const char* server = “api.thingspeak.com”;

    藍芽端的程式碼
    #include
    //#include
    #include
    // the maximum received command length from an Android system (over the bluetooth)
    #define MAX_BTCMDLEN 128
    // TX- Pin10
    // RX Pin11
    SoftwareSerial BTSerial(1,0); // Arduino TX/RX
    byte cmd[MAX_BTCMDLEN]; // received 128 bytes from an Android system
    int len = 0; // received command lengthm
    void setup() {

    Serial.begin(9600);
    BTSerial.begin(9600);
    }
    void loop() {
    char str[MAX_BTCMDLEN];

    int insize, ii;
    int tick=0;
    while ( tick0 ){ // 讀取藍牙訊息
    for ( ii=0; ii<insize; ii++ ){
    cmd[(len++)%MAX_BTCMDLEN]=char(BTSerial.read());

    }
    } else {
    tick++;
    }

    }

    if ( len ) { // 用串列埠顯示從Android手機傳過來的訊息

    sprintf(str,"%s",cmd);

    delay(2000);
    Serial.write(str);
    cmd[0] = '\0';
    }
    len = 0;
    }

    傳輸過去後有兩個問題
    問題一 一開始輸入字串1 2 3 4 5 序列戶顯示 1 2 3 4 5 ,但第二次輸入2 3 4 序列戶顯示 2 3 4 4 5 。
    會一直記錄到上一個字串的長度(還是位元?) 無法解決..

    問題二 最上面敘述的問題 如何將apikey 來取代掉…

    1. 「會一直記錄到上一個字串」代表程式沒有清除上一次的序列輸入值,你可以像這樣宣告一個String類型的變數,暫存輸入值:

      String serialStr = “”;

      每當收到序列資料,就將它與serialStr相連:

      serialStr += val;

      最後取出序列字串後,再將它清空:

      serialStr = “”;

      thanks,
      jeffrey

  19. 老師您好
    以下是我用 Realterm 叫 esp8266 傳給 Thingspeak 的情況
    但 Thingspeak 卻回傳 400 Bad Request
    之前試過一樣的步驟似乎沒問題 但是之後卻不行了
    是不是有遺失字元或其他原因
    麻煩版主指導 ((一個小新手看網頁做的實驗

    OK
    > // GET /update?api_key=ZKANMZVA3YINU7L9&field1=5&field2=7
    Recv 56 bytes

    SEND OK

    +IPD,172:
    400 Bad Request

    400 Bad Request
    nginx/1.7.5

    CLOSED

    1. 如果確定之前正常的是同一塊ESP8266, 裡面的程式碼也都一樣, 但忽然不行的話, 建議你可以重置一下ESP8266或是完全斷電, 之後再重試看看. 如果以上二種處置方式都不行的話, 也可以試著重刷ESP8266的韌體之後再測試.
      ThingSpeak跟ESP8266之間溝通的原理也是透過傳送HTTP訊息來傳送數據給ThingSpeak的Server. 建議你可以再看一次作者IOT這本書的12-16這一頁, 先照著書本實作幾次, 對訊息之間的傳送了解了以後, 再來使用ThingSpeak, 會更容易上手.

  20. 想請教一下 我目前是使用 nano版+esp8266 當server 來使用 透過直接在程式打上SSID 跟 PASS 讓 esp8266 能夠直接連網 我想要做像上面那樣 就是我可以不透過程式 直接連IP(192.168.4.1)進入修改SSID 跟PASS 不知道要怎麼著手 感謝您

    1. 感謝您這麼快就回復 我馬上去實作看看 有問題還請麻煩您了 真的感謝

    1. firebase是一款雲端資料庫系統平台,也就是說,這個資料庫系統的主程式碼和資料檔,都是放在網路上的一群電腦伺服器裡面。

      用戶端只須透過網路對它下達一些指令就能操作資料庫,因此,用戶端只須具備聯網功能,就能使用firebase,用戶端本身並不需要架設資料庫。

      所以,是的,Uno板加上網路卡,就能操作firebase。

      thanks,
      jeffrey

  21. 老師你好
    我們使用這個https://github.com/firebase/firebase-arduino
    的firebase libary
    但是在編譯加上#include 後
    卻出現編譯錯誤In file included from C:\Users\USER\Desktop\gps_test1\gps_test1.ino:6:0:

    C:\Program Files (x86)\Arduino\libraries\firebase-arduino-master\src/FirebaseArduino.h:20:18: fatal error: string: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    開發板 Arduino Uno WiFi 編譯錯誤。

    請問這樣有甚麼解決方法嗎感恩

  22. 上網查詢國外網友說需要有esp8266的模組
    但是uno wifi是有包含的啊…

    1. 你誤會了。

      ESP8266有兩種運用方式:
      1. 當作Wi-Fi網卡,運算和硬體控制交給其他微控器處理,如Arduino。
      2. 兼具Wi-Fi功能的微控器,本身可取代Arduino。

      這兩種通訊程式的寫法不同。

      Arduino Uno WiFi板子上的ESP8266只用於Wi-Fi通訊。但是你找到的程式庫用於第2種模式,所以不能用於Arduino Uno WiFi板,Uno WiFi可以達到相同功能,只是程式碼你要自己改寫。

      good luck!
      jeffrey

  23. 老师您好,请问一下,怎么可以得到ArduinoWiFi库,我的IDE上没有,在网上也没有找到合适的。

  24. 老師你好,請問一下
    我用arduino uno wifi 來做專題 ,在我用at指令測試esp8266他都沒反應(我用realterm測試)
    但是wifi那些都正常顯示,更換sta、ap+sta模式都能更換
    我爬文找方法都試過了,麻煩妳了…

  25. 老師您好
    想詢問wifi功能可以設成一通電或是在電路一按開關就上傳嗎?
    還是一定要下command呢?
    謝謝

  26. 老师,arduino uno wifi想要连接到服务器(ip:69.165.65.152 port:65534),将窜口采集到的数据发送到服务器上该怎么做呢?上面的程式连接服务器不需要port号吗?

  27. 老师,求教arduino uno wifi建立tcp连接传数据的例程,不会使用http协议的get方式。

  28. 您好,這邊想請教一個問題
    這邊使用Arduino uno+ESP8266 01s
    跑的程式是範例中的WiFi Scan,但是一直會跑出
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    這樣的問題,想問問這個該怎麼解?

    1. 妳的ESP-01模組執行的是AT韌體,TX和RX應該是接在Arduino Uno的0和1腳,可能是TX和RX接腳錯了,兩腳交換看看。

      thanks,
      jeffrey

  29. 您好,
    剛剛看了一下RX跟TX應該是沒有接錯,下面是我的接法
    UNO ESP
    3.3v -> VCC
    3.3v -> CH_PD
    GND -> GND
    GND ->GPI00
    RX(0號角) ->RX
    TX(1號角) ->TX

    3.3V 是由uno的5V接LD1117轉3.3V的,RXTX交換接也是不行

    1. TX和RX按照妳上面的接法,就是錯的。另外,GPIO0平時不應該接低電位。

      thanks,
      jeffrey

  30. 老師您好
    請問一下為什麼我將 Arduino UNO WiFi 連上家裡的網路之後
    執行 SWITCH TO STA MODE 一直無法成功
    都會跑出 Error changing mode
    然後連上 Arduino UNO WiFi 的網路會斷開
    要重試好幾次才又能連到

    1. 拍謝,我在自己的板子上沒有遇過這個問題,或許你可以嘗試更新ESP8266的韌體。

      thanks,
      jeffrey

  31. 老師 你好
    想詢問一下,我的設備連上WIFI後可是還會有網頁需要登入員工帳號密碼 才能正式連外,這部分是不是無解?

    1. 應該是可以的,需要知道登入表單的後端程式位址,以及欄位名稱(資料的變數名稱),寫一個POST方法的資料傳送程式,來取代表單頁面登入。

      thanks,
      jeffrey

  32. 老師 你好請問一下 我目前使用ameba 這個板子 連自己的手機上傳資料到ThingSpak
    約20秒傳送一次 從手機網路流量去看發現半小時內使用了820K左右 這樣是對的嗎?

    未來設備是要架設在公司辦公室 但是公司的WIFI不給外部設備連線 所以想要自行預付卡之類的來做WIFI連線
    但是這樣看了一下流量一台一個月大概就要1.2G的流量了。

    1. 從控制板的前端程式,發出請求給ThingSpeak網站的HTTP訊息大致如下:

      GET /update?api_key=你的API_KEY&field1=資料1&field2=資料2 HTTP/1.1
      Host: api.thingspeak.com
      Connection: keep-alive
      

      收到來自ThingSpeak的HTTP回應內容大致如下:

      HTTP/1.1 200 OK
      Content-Type: text/html; charset=utf-8
      Content-Length: 2
      Connection: close
      Status: 200 OK
      X-Frame-Options: ALLOWALL
      Access-Control-Allow-Origin: *
      Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DELETE, PATCH
      Access-Control-Allow-Headers: origin, content-type, X-Requested-With
      Access-Control-Max-Age: 1800
      ETag: "6512bd43d9caa6e02c990b0a82652dca"
      Cache-Control: max-age=0, private, must-revalidate
      X-Request-Id: ecbbb7ff-bd47-4a6f-8dbd-3cd728b9005e
      X-Runtime: 0.101317
      X-Powered-By: Phusion Passenger 4.0.57
      Date: Tue, 21 Nov 2017 12:35:33 GMT
      Server: nginx/1.9.3 + Phusion Passenger 4.0.57
      
      資料索引數字
      

      你可以算算訊息包含多少位元組(每一行後面還有兩個看不見的換行與新行字元),藉此推算資料用量。

      thanks,
      jeffrey

  33. 謝謝大大的回覆 原來還有回應的內容。
    另外再請教一下
    我目前使用溫溼度上傳thingspeak出現一個問題,使用的模組為ESP8266+OLED-ssd1306+HTU21D+UNO
    OLED-ssd1306+HTU21D+UNO OLED顯示沒問題
    ESP8266+HTU21D+UNO 上傳數據也沒問題
    ESP8266+OLED-ssd1306+HTU21D+UNO 全部兜起來後
    OLED 出現白花花一片,開啟UNO 監控視窗 發項不會傳送AT出去 程式如下

    #include
    #include “ESP8266.h”
    #include “Adafruit_GFX.h”
    #include “Adafruit_SSD1306.h”
    #include
    #include “HTU21D.h”
    #include

    #define _baudrate 9600
    #define _rxpin 4
    #define _txpin 5
    #define OLED_RESET 13// 原本為4
    Adafruit_SSD1306 display(OLED_RESET);
    SoftwareSerial debug( _rxpin, _txpin ); // RX, TX
    ESP8266 wifi(Serial);

    HTU21D myHumidity;

    //*– IoT Information
    #define SSID “IP-2.4”
    #define PASS “”
    #define IP “184.106.153.149” // ThingSpeak IP Address: 184.106.153.149
    // 使用 GET 傳送資料的格式
    // GET /update?key=[THINGSPEAK_KEY]&field1=[data 1]&filed2=[data 2]…;
    String GET = “GET /update?key=OIJTQ90TDMBUHUHR”;

    void setup() {
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    myHumidity.begin();
    Serial.begin( _baudrate );
    debug.begin( _baudrate );
    sendDebug(“AT”);
    delay(1000);
    if(debug.find(“OK”))
    {
    Serial.println(“RECEIVED: OK\nData ready to sent!”);
    connectWiFi();
    }
    else{
    Serial.println(“NO RESEPONCE!”);
    }
    display.display();
    display.clearDisplay();

    }
    void loop() {
    delay(30000); // 30 second
    int h = myHumidity.readHumidity();
    int t = myHumidity.readTemperature();
    SentOnCloud( int (t), int (h) );
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.print(“Temp:”);
    display.print(T);
    display.println(“C”);
    display.print(“Humd:”);
    display.print(H);
    display.println(“%”);
    display.display();
    display.clearDisplay();
    delay(2000);
    }
    void SentOnCloud( int T, int H )
    {
    // 設定 ESP8266 作為 Client 端
    String cmd = “AT+CIPSTART=\”TCP\”,\””;
    cmd += IP;
    cmd += “\”,80″;
    sendDebug(cmd);
    if( debug.find( “Error” ) )
    {
    Serial.println( “RECEIVED: Error\nExit1” );
    return;
    }
    cmd = GET + “&field1=” + T + “&field2=” + H +”\r\n”;
    debug.print( “AT+CIPSEND=” );
    debug.println( cmd.length() );
    if(debug.find( “>” ) )
    {
    Serial.print(“>”);
    Serial.print(cmd);
    debug.print(cmd);
    }
    else
    {
    debug.print( “AT+CIPCLOSE” );
    }
    if( debug.find(“OK”) )
    {
    Serial.println( “RECEIVED: OK” );
    }
    else
    {
    Serial.println( “RECEIVED: Error\nExit2” );
    }
    }
    void sendDebug(String cmd)
    {
    Serial.print(“SEND: “);
    Serial.println(cmd);
    debug.println(cmd);
    }

    boolean connectWiFi()
    {
    debug.println(“AT+CWMODE=1″);
    delay(2000);
    String cmd=”AT+CWJAP=\””;
    cmd+=SSID;
    cmd+=”\”,\””;
    cmd+=PASS;
    cmd+=”\””;
    sendDebug(cmd);
    delay(5000);
    }

  34. #define _rxpin 4
    #define _txpin 5
    #define OLED_RESET 13// 原本為4

    目前覺得比較有疑惑的在這三行 應該是可以隨意設定
    OLED 與ESP8266 兩個分開來不一起使用都可以正常運作合在一起後卻有問題
    再麻煩大大 能幫忙解惑一下 謝謝。

  35. 請問 我使用是ESP8266-01 也是可以用這樣的方式?
    正在研讀中,不過還是希望知道為什麼原本的方式會有錯誤?
    謝謝。

    1. 如果是無法顯示,那問題就是出在顯示器部份的程式。從你的程式碼看來,你用的是彩色的顯示器。我的OLED顯示器是I2C介面、單色,所以接腳和程式設定都與你的不一樣,無法對照,你要自己查看顯示器的規格與程式庫的說明。

      good luck!
      jeffrey

  36. 今日無意間發現問題了,一直沒有好好仔細的看編譯完後的訊息。原來動態記憶體被使用到94%
    後面把一些雜七雜八與序列傳輸的部份加上 F(),節省之後 降到84% 就一切正常了。

  37. 老師你好
    我看到”超圖解物聯網IoT實作入門” 中的12-10 至12-14 修改AT command,我安照了你的硬體和軟體設定後都沒有收到ESP-01的回復。
請問會是甚麼原因?請問有其他解決方案嗎 ?

    ESP-01我是用外接電源的。(外接電源己與arduino UNO common GND)

    硬體和軟體設定請看看附件圖
    https://drive.google.com/open?id=1bmp_8ecqKl6v2Urt__RC1FviVPuscTTs
    https://drive.google.com/open?id=10qbjnBZe0UdHUAChKwPZJ_LpV4MwhSwd

    IDE cap screen
    https://drive.google.com/open?id=1eKHr3JsAV72ZZGEer307fLh8nBVyvTuh

  38. 老師你好:

    另外,關於”超圖解物聯網IoT實作入門” 中的12-30, GET和POST 請求方面的問題想請教一下:

我是用arduino UNO 及ESP-01 WiFi板的,而我主要是用MACBOOK的,不過有需要另可轉到window作業的。

    1. 昨天跟據上面的留言,我最後都未能成功把AT韌體版本改為0.95.2版(nodemcu-flasher中未能連接到ESP-01),但最後我參考了另一個方法把正在用的ESP-01進入到及修改了AT command。因為不知道會否影響之後的操作,所以在此特別問問。
    (其實就是直接把ESP-01 tx rt直接接到arduino 1 , 0 腳。)
    附上參考的方法及結果:
1/https://www.youtube.com/watch?v=J19sd61mvhw&t=28s
    2/http://microcontrollerkits.blogspot.hk/2015/02/wifi-module-esp8266-at-command-test.html
    
arduino serial monitor 回送結果圖:
https://drive.google.com/drive/u/0/folders/11050Cy4UqUS-QD0SWTK0MHKYz6_IOm1F

    2. 現在我的問題是想GET和POST 資料到指定的HTML網頁上,例如這個"http://13.250.218.18:8080/api"
    2.1 第一個疑問,參照頁12-24 至 12-27,我是否要把ESP-01 在AT command 設定為Station?
    2.2 承上題,如果是把ESP-01設定為Station,我已經設定了,之後我按照了頁12-26中的code嘗試與我的wifi網路連接,SSID 和密碼都是正確的(用手機能連接上),但Arduino serial monitor都沒有回應(已按照頁12-20 – 12-22中安裝及使用NodeMCU 1.0(ESP-12E Module))。在執行頁12-26中的code時,ESP-01 的TX RX 是應該與arduino UNO的甚麼 pin連接的?
    2.3 最後,關於頁12-30 至12-34 GET和POST 資料到指定的HTML網頁上,會否有更多的補充資料給我們參考?

    謝謝你的幫忙。

    1. 我幾乎不用AT命令,我會近期會測試新版的AT韌體。

      12-20頁之後的程式並不使用AT命令,也不必連接Arduino Uno板,那些Arduino程式都直接在ESP-01板子上執行(請參閱12-20頁說明)。

      這些是相關的補充文件,提供你參考:
      在ESP8266的SPIFFS檔案系統存放網頁檔案(一)

      從ESP8266連結Node.js並傳送JSON數據

      LINE Bot聊天機器人程式開發教學(七):從ESP8266/Arduino控制板觸發Line發布訊息

      MQTT教學(九):使用ESP8266上傳資料到ThingSpeak MQTT伺服器

      thanks,
      jeffrey

    2. Dear Leo,

      在使用AT指令的部份, 如果使用上有問題, 建議你先到原廠下載最新AT版本的韌體刷一下再測試. 因為我之前有買過幾個ESP8266, 但它裡面刷的是某個物聯網的韌體… 不是AT版本的韌體, 所以我測試AT指令, 一點反應都沒有… 在實務上,AT指令真的很少用到… 而且就如Cubie在書中提到的, ESP8266本身就是一個很強大的控制板, 拿來當網路介面有點可惜了.
      提供我現在使用的經驗給你參考 :
      我是使用一個FTDI轉接線來連接ESP8266, 其實跟你用Arduino連接ESP8266的方法是一樣的, TX接ESP8266的RX, RX接ESP8266的TX, GND接ESP8266的GND. 然後用Arduino IDE來開發. 如果你使用的是ESP8266-01, 建議你在Arduino IDE選擇”Generic ESP8266 Module”. 因為版本很多, 詳細的規格最好是跟你購買的廠商確認會比較好.
      ESP8266在上傳sketch的時候, 有時會發生明明前一次上傳是正常, 線路和程式都確定是OK的, 但就是會發生上傳錯誤.
      這時候建議你在上傳前, 先RESET一下ESP8266, 然後再按上傳鍵. 就我個人的經驗, 這個方式100%解決了我之前發生的怪問題.
      基本上, AT指令的部份, 我前一陣子有試過ESP8266_AT_Bin_V1.5.1這個版本的韌體, 但我習慣會先去原廠下載說明文件下來看, 因為如果沒記錯, 有時候版本的變更, 之前舊的指令有可能會被拿掉而無法使用. 最好先看一下文件會比較好. 順便附上原廠的網址供你參考:
      https://www.espressif.com/zh-hans/support/download/documents?keys=&field_type_tid%5B%5D=14
      中文的文件, 應該會容易很多了.

  39. 老師你好,我目前使用Arduino UNO wifi,想利用 wifi 將我的感測器收集到的數據,傳遞到資料庫(Mongo DB)再建立動態網頁,目前是照著您”超圖解物聯網IoT實作入門”到第3章,將Arduino資料先傳到Node網站,但書本上是使用乙太網路的方式,想請教老師能否提供指令去利用 Arduino UNO wifi 將資料傳遞到Node網站呢,謝謝老師。

    1. 由於Arduino UNO wifi這塊板子的相關資料與技術文件並不充分,所以我很長一段時間沒用它了。

      建議使用一般的ESP8266控制板,例如NodeMCU或Wemos D1 mini,至於Wi-Fi相關連線程式,請參閱第12章「從ESP8266連接IFTTT」以及「使用POST方法傳遞JSON資料」,還有「LINE Bot聊天機器人程式開發教學(七):從ESP8266/Arduino控制板觸發Line發布訊息」這篇文章的範例程式。

      thanks,
      jeffrey

  40. 老師您好,
    我目前用Arduino WiFi版以及Android 手機連上同個AP,手機可以正常持續不斷的收到板子送來的data
    我想在戶外沒有WIFI的環境透過板子自己的AP mode 送資料給手機(連到Arduino的WIFI熱點)
    手機是收得到data但是變得斷斷續續的,忽快忽慢甚至斷掉,我把手機跟板子擺在旁邊,訊號應該不至於太差才是?
    還是我應該改用藍芽模組比較好呢?
    還請老師解惑 謝謝老師

    1. 照理說,ESP8266的Wi-Fi信號傳送距離應該可達30米,如果你的板子上有外接天線插座,請替它連接2.4GHz天線試試看。

      thanks,
      jeffrey

  41. 老師您好,Ciao庫是只支持microcontroller和MIPS cpu這些嗎?我下載了Ciao庫,說是不支持此cpu

  42. 老師您好

    請問要如何用網路連接扈(NET WORK PORT)取得我得BOARD所讀取的資料
    以mkr1000 為例,我要用scannetwork功能。目前已確定可以從wiki上船程式碼到MKR1000上面
    但無法從network port上讀取mkr1000 scan network所掃描的wifi強度資訊。
    每次要從serial monitor看資料時,都必須切換至serial port才能看到資料。
    不知道有沒有什麼方法是不用使用serial port就能看到資料的呢?

    1. 如果ESP8266執行的是AT韌體,就要透過序列埠通訊;若是燒錄MicroPython或Arduino韌體,就能把RSSI顯示在OLED螢幕或者顯示在網頁上。

      thanks,
      jeffrey

  43. 老師您好:
    請問我從ESP8266不斷的傳送資料至MySQL一段時間後,
    在資料庫裡面read packet會顯示ERROR: Timeout waiting for client.
    該怎麼處理比較好呢?

    1. 我不確定是前端(ESP8266)還是後端程式的問題,但你可以先在前端輸出序列訊息,確認每次資料傳遞的狀況,後端程式也可以做對應的除錯,釐清問題出在哪裡。

      thanks,
      jeffrey

  44. 老師您好,我目前使用Arduino UNO R3 ESP8266 Web Sever ESP-13E,想利用 wifi 將我的感測器收集到的數據,傳遞到MQTT的Broker,想請教老師能否提供指令去利用 Arduino UNO R3 ESP8266 Web Sever ESP-13E 將資料傳遞到MQTT的Broker,謝謝老師。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top