超圖解物聯網IoT實作入門:使用JavaScript/Node.JS/Arduino/Raspberry Pi/ESP8266/Espruino

書名很長,以下簡稱《超圖解物聯網IoT實作入門》

封面的控制板和3C裝置圖案,刻意以黑白灰階方式呈現,傳達軟體的重要性,若沒有軟體驅動,這些高科技裝置宛如沒有靈魂的軀殼;背景採用和JavaScript標誌相同的黃色系。

《超圖解 Arduino 互動設計入門》序言中的「序」字,繪製成印刷電路板風格;本書強調的是裝置之間的連結,因此「序」字也做出對應的改變。

內容簡介

本書是《超圖解 Arduino 互動設計入門》的姊妹作,強調串聯網路軟體和微電腦控制板, 以 JavaScript 為主軸,開發網路應用程式、手機 App、互動網頁、資料庫程式和操控微電腦。書中包含網頁式遠端遙控 LED 燈、即時溫濕度 、保全自動感測拍照蒐證、網頁式遠端 LED 繪圖板、即時影像監控 、影像辨識擺頭控制攝影機雲台、雲端溫濕度監控、即時資訊動態圖表、藍牙機器人遙控手機 App 等多元範例(感謝本書編輯黃昕暐先生提供文案)。

本書特色

  • 統括物聯網應用開發的全面技術
  • 前端 JavaScript 到後端 Node.JS 實踐物聯網創意
  • 結合 Arduino、Raspberry Pi 實作物聯網感測控制節點
  • 詳述 C/P 值最高的 ESP8266 Wi-Fi 模組
  • 活用 Apache Cordova 開發跨平台物聯網行動 App
  • 使用 JavaScript 即可駕馭的 Espruino 嵌入式控制板
  • 採用 MongoDB 建構後端資料庫
  • 利用 D3.js / C3.js 打造資訊圖表
  • 連結 IFTTT 串連各項雲端服務

《超圖解物聯網 IoT 實作入門》目錄

各章節導讀,請參閱「新書預告:《超圖解物聯網IoT實作入門 使用JavaScript/Node.JS/Arduino/Raspberry Pi/ESP8266/Espruino》」這篇貼文。

第0章 無所不在的 JavaScript 與物聯網裝置

  • JavaScript 與物聯網
  • MPU、MCU與SoC介紹
  • 章節導讀

第1章 JavaScript 入門

  • JavaScript 入門
  • JavaScript 語言基礎
  • 函式定義
  • 定時產生隨機數字
  • Array(陣列)物件
  • 認識 Object(物件)類型
  • BOM(瀏覽器物件模型)與 DOM(文件物件模型
  • 動手做 操作網頁物件
  • 在網頁中嵌入 JavaScript
  • 事件處理程式

第2章 認識 jQuery 程式庫

  • jQuery 簡介
  • jQuery 語法基礎
  • AJAX 技術:動態更新 HTML 內容
  • 動手做 從 Arduino 輸出純文字溫度
  • 網頁訊息交換格式
  • Arduino 輸出 JSON 訊息
  • 調整燈光亮度的網頁介面
  • 動手做 接收調光值的 Arduino 網站程式
  • 動手做 製作滑桿介面網頁
  • AJAX 的安全限制

第3章 Node.js 入門

  • 在電腦以及樹莓派安裝 Node.js
  • Node 程式設計起步
  • 使用 http 模組建立網站伺服器程式
  • 事件驅動、非阻塞 I/O 示範:讀取檔案
  • global(全域)物件與模組檔案
  • 安裝與管理模組:使用 npm 工具程式
  • 使用 Express 框架開發網站應用程式
  • 使用 package.json 管理 Node 專案的模組程式
  • 動手做 從 Arduino 傳遞溫溼度值 給 Node 網站
  • 動手做 讓 Arduino 定時上傳 DHT11 資料
  • 使用 JSONP 格式跨網域存取資訊

第4章 Node.js 序列埠通訊與樹莓派 GPIO 控制

  • 安裝編譯 Node 模組所需的軟體
  • 動手做 Node.js 序列埠通訊
  • 動手做 從 Node.js 傳送序列資料
  • 透過 Node.js 執行系統指令
  • 樹莓派的 GPIO 簡介
  • 動手做 GPIO 輸出入訊號練習:按開關閃爍 LED
  • 動手做 透過紅外線感測模組拍攝照片
  • 樹莓派 GPIO 整合 Arduino 控制板
  • 5V 和 3.3V 電壓準位轉換

第5章 使用霹靂五號操控 Arduino

  • 霹靂五號:用 JavaScript 控制 Arduino
  • 動手做 用霹靂五號指揮 Arduino 閃爍 LED
  • 動手做 啟用上拉電阻並讀取開關訊號
  • 動手做 類比輸入與 PWM 輸出程式實驗
  • 動手做 檢測溫度
  • 動手做 控制伺服馬達
  • 動手做 控制 LED 矩陣顯示圖像
  • 使用 Socket.io 建立即時連線
  • 動手做 建立即時通訊程式
  • 動手做 瀏覽器與矩陣 LED 作畫

第6章 電子郵件、串流視訊、電腦視覺與操控伺服馬達

  • 透過 Node 傳送電子郵件
  • 動手做 雲端蒐證 / 拍照自動寄送 e-mail
  • 動手做 串流視訊 / 推播即時影像
  • 使用 MJPG 壓縮與串流視訊
  • 控制伺服馬達雲台
  • 動手做 使用方向鍵操控伺服馬達雲台
  • 動手做 攝影機雲台的 Node 伺服器程式碼
  • 使用觸控螢幕虛擬搖桿操控攝影機雲台
  • 瀏覽器連接遊戲控制器(電玩把手)
  • 動手做 使用 gamepad.js 程式庫建立遊戲器操作的網頁程式
  • 機器視覺(computer vision)應用
  • 使用 tracking.js 偵測人臉
  • 動手做 臉孔偵測與伺服馬達連動
  • 動手做 偵測顏色

第7章 Espruino 控制板簡介

  • Espruino 程式開發軟體
  • Espruino 的基本硬體操作指令
  • 動手做 使用光敏電阻製作小夜燈
  • 動手做 呼吸燈效果
  • 動手做 超音波控制燈光亮度
  • Espruino 的睡眠模式
  • 動手做 深層睡眠實驗
  • 動手做 藍牙控制 LED
  • 動手做 藍牙遙控車(馬達控制)
  • 動手做 利用 SD 記憶卡紀錄溫濕度變化
  • 動手做 控制伺服馬達
  • STM32 微控器相容板
  • 動手做 替 STM32 控制板燒錄 Espruino 韌體

第8章 使用 MongoDB 資料庫以及ejs 樣版引擎建立動態網頁

  • 資料庫簡介
  • 安裝 MongoDB
  • MongoDB 的基本操作
  • 查詢資料
  • 更新與刪除資料
  • 使用 mongoose 套件連結 MongoDB 資料庫
  • 連結 MongoDB 並讀取資料的程式
  • 動手做 儲存 Arduino 上傳的溫溼資料
  • 認識樣版引擎
  • 動手做 在 ejs 樣版中顯示最近 10 筆溫濕度資料
  • 動手做 分頁顯示資料

第9章 資料視覺化:使用 C3.js 與D3.js 繪製圖表

  • 使用 C3.js 繪製圖表
  • 顯示動態平移的即時線條圖
  • 動手做 使用資料庫數據描繪折線
  • 動態顯示 Arduino 檢測類比值
  • 動手做 使用圖表動態顯示感測器數據
  • 簡易數位濾波
  • 使用 D3 程式庫
  • 認識 SVG
  • 使用 D3 繪製 SVG 圖像
  • 使用動態資料繪製折線圖
  • 結合數據動態附加 HTML 元素

第10章 使用 Cordova 開發行動裝置 APP

  • 認識 Cordova
  • 設置 Cordova 的 Android 開發環境
  • 下載與設置 Android SDK
  • 安裝 Cordova 工具程式和 Ant
  • 使用 Cordova 建立手機 App
  • 啟用 Android 手機的 USB Debug 功能
  • Cordova 網頁的基本程式架構
  • jQuery Mobile 框架入門
  • 動手做 手機 App 網路控制 Arduino

第11章 製作藍牙手機遙控 App

  • 製作藍牙遙控 LED 燈 App
  • 動手做 Arduino 端的藍牙 LED 開關程式
  • 作藍牙機器昆蟲遙控 App
  • 動手做 手機體感(加速度感測器)控制伺服馬達
  • 動手做 透過手機 USB 介面連接 Arduino 板
  • 透過返回(Back)鍵關閉 App

第12章 ESP8266 物聯網應用入門(一)

  • ESP8266 模組簡介
  • NodeMCU 開發版簡介
  • 使用 AT 指令操作通用型 ESP 模組(ESP-01)
  • 動手做 透過 Arduino 執行 ESP8266 的 AT 命令
  • Wi-Fi 無線網路簡介
  • 動手做 透過 ESP-01 的 AT 命令建立 HTTP 伺服器
  • 使用 Arduino 開發 ESP8266 程式
  • 使用 ESP8266WiFi 程式庫連接無線網路
  • 使用 ESP8266WebServer 程式庫建立 HTTP 伺服器
  • 動手做 處理 GET 或 POST 請求
  • 讓 NodeMCU 扮演網路前端上傳資料(IFTTT)

第13章 ESP8266 物聯網實作(二)

  • 設置區域網路域名
  • 動手做 使用 ESP-01 模組開發 Arduino 物聯網
  • 透過 OTA 更新 ESP8266 的韌體
  • 使用 OLED 顯示器呈現 IP 位址和溫濕度值
  • 動手做 在 OLED 顯示 IP 位址與動態溫濕度
  • 使用 JavaScript 程式開發 ESP8266 程式
  • 使用 Espruino 的 Wifi 程式庫
  • 觸發執行 IFTTT 網路程式
Posts created 468

370 thoughts on “超圖解物聯網IoT實作入門:使用JavaScript/Node.JS/Arduino/Raspberry Pi/ESP8266/Espruino

    1. hi ayu:

      謝謝,but,… 目前並沒有改版計畫,上一本《超圖解Arduino互動設計入門》也是一年之後改版。

      thanks,
      jeffrey

  1. 趙老師您好:

    拜讀您的兩本超圖解真是獲益良多!

    目前欲將手上的STM32相容版燒入Espruino韌體
    使用命令列視窗似乎無法執行python 2.7版的,只能執行3.5版
    而stm32loader.py又是2.x版寫的

    因python還未接觸,不知是否有其他燒入方式?
    不能直接用ST-LINK 直接燒寫嗎?

    1. hi jammy:

      命令列可以執行2.x和3.x版的Python,請先移除3.x版再安裝2.x版試試看。我目前使用的Windows 10系統,就是執行2.7版。
      另一個燒錄STM32微控器韌體的方法是透過J-Link(7-51頁有提到),但是這個硬體比序列線貴,而且只拿來上傳軟體,也挺浪費的。

      thanks,
      jeffrey

  2. 感謝趙老師的回應與指導!

    手邊剛好有一片 ST NUCLEO-F401RE 開發板
    看過Espruino剛好有支援這塊
    就利用STM32 ST-LINK Utility 程式開啟 espruino_1v85_nucleof401re.bin
    再燒入,結果試用可以成功
    提供給大家參考~

  3. 請問有要出 Google play 電子書嘛?
    現在對比較厚的書, 都想要看電子書

  4. 哈囉 ~ 因為讀了老師的書 學習到很多 真的很謝謝老師

    現在如果碰到朋友有想學習的一定大推超圖解這兩本

    目前碰到在12-10動手做的部分 ,在下達at指令時

    都跑出數字 ,但將print改成write就成功了,有點誤打誤撞,

    但不是很清楚其中的緣故是資料類型的關係嗎??

    1. hi 0-7:

      非常感謝!

      也許是ESP-01模組的韌體版本不同,print()和write()的差別在於,print()會將資料輸出成「字元」或「字串」,方便人類閱讀;write()則是輸出實際值。以底下的程式碼為例:

      byte a=65;   // 'A'字元的ASCII碼是65
      
      void setup() {
        Serial.begin(9600);
        Serial.print("print: ");
        Serial.println(a);
        Serial.print("write: ");
        Serial.write(a);
        Serial.println();
      }
      void loop() {
      
      }
      

      在序列埠監控視窗的輸出結果如下:

      print: 65
      write: A

      表面上,print()似乎原封不動地顯示變數a的值,但實際是輸出字元’6’和’5’。
      而write()輸出了數字65,被序列埠監控視窗解讀成字元’A’。

      thanks,
      jeffrey

  5. 趙老師:在閱讀 ESP8266物聯網應用入門 這一章節時,有個問題向您請教下:
    動手做透過arduino執行ESP8266的AT命令,麵包板上的LD1117芯片的電壓輸入腳是連接在arduino的5v輸出腳上,那LD1117芯片輸出電流是不是可以超過arduino的5v輸出引腳提供的最大輸出電流?在使用LD1117芯片時,雖然可以提供更大的輸出電流,但是最終也還是要受制于前級輸入最大能提供的輸出電流?不知道我這樣理解正不正確?

    1. 原廠的Arduino Uno控制板上面的5V直流電壓轉換IC是NCP1117ST50T3G,它能提供最大1A的輸出電流;若是連接電腦的USB 2.0,大約可提供500mA輸出電流,所以足以供應書本的範例使用。

      沒錯!LD1117的電流輸出將受制於前級的輸出電流。

      thanks,
      jeffrey

  6. 趙老師:在閱讀esp-01模組與arduino連接通信時,因為有連接的詳細示意圖,所以看起來心理比較踏實。但在12-5節,替NodeMCU燒錄Arduino程式,您寫到序列埠位於COM5,我有個疑惑這個NodeMCU透過哪個口與計算機相連的?NodeMCU與Arduino的連接示意圖好像書本中沒有畫出來,可能我比較菜鳥,不知道趙老師能否寫寫篇博文補充說明下,謝謝。

    1. Arduino連接的COM編號是電腦指定的,所以你在實驗時,COM編號可能會和我不同。第12和13章介紹的NodeMCU,在某些應用領域足以取代Arduino控制板,不需要連接Arduino。

      thanks,
      jeffrey

    2. 謝謝趙老師的耐心回答,感謝萬分!還想問下:替nodeMCU燒錄程式時是通過microUSB口與計算機usb口相連的嗎?

    3. 沒錯!我應該在內文提到「先把NodeMCU的microUSB接上電腦的USB,再進行燒錄」,感謝提醒!

      thanks,
      jeffrey

  7. 趙老師您好
    請問為esp8266供電的時候為什麼不用arduino uno板上3.3輸出就好,而需要用5v電流轉換?

    1. hi yc:

      請參閱12-4頁「3.3V直流轉換電路」一節說明,簡言之,因為ESP8266的消耗電流大於Arduino板所能供給。

      thanks,
      jeffrey

  8. 趙老師您好

    我正在讀您的Cordova開發行動裝置App一章
    到10-5使用Cordova建立APP時下達cordova bulid命令時出現以下錯誤
    http://i.imgur.com/13n4zVP.png
    是否是我的使用者變數沒有ANDROID_HOME呢? 新增路徑為?

    1. ANDROID_HOME是Android SDK的所在位置,以我的電腦為例,位於:

      C:\Users\cubie\Android\android-sdk

      你可以在設置完成後,於命令提示字元輸入這個指令,它會輸出ANDROID_HOME的值讓你確認:

      C:\>echo %ANDROID_HOME%

      thanks,
      jeffrey

    2. 那個錯誤訊息等同於10-17頁底下的錯訊息,書上的訊息顯示「缺乏android-22目標版本」,你的訊息則顯示缺乏android-23版本。

      請依照10-18頁說明,開啟SDK Manager,勾選 (API 23) 裡的 “SDK Platform”。

      安裝指定的套件之後,即可順利編譯成功。

      thanks,
      jeffrey

  9. 老師您好
    關於ESP8266 我使用USB轉TTL連接ESP-01
    下AT命令正常來說AT+RST回傳最後一行應該是ready 但我卻是invalid 不知是哪裡出錯?
    也無法At+CWSAP更改SSID跟密碼(也是會回傳invalid)
    看了12-14的回傳值以及其他教學文章後,AT+GMR都是回傳一串資料跟我的不一樣,是否是韌體的問題?
    以下是詳細回傳訊息http://i.imgur.com/FzmK4c9.png

    1. 書本上採用的ESP-01韌體是AI-Thinker(安信可)公司的0.95.2版,我剛剛略讀了一下安信可公司的維基網站,沒找到這個舊版的韌體,倒是他們的最新版韌體(固件,1.5.4)有提供 8Mbit (1MB) 和 32Mbit (4MB) 兩個版本。

      我在這個網站看到9600bps和115200bps的0.95.2韌體,如果你希望AT指令的操作結果和書本一致的話,請在ESP-01刷入這個韌體。

      燒錄ESP8266的韌體工具,採書本13-32頁使用的nodemcu-flasher,把下載的ai-thinker-0.9.5.2-9600.bin燒錄到0x00000位址即可。新版的韌體燒錄位址配置,請參閱安信可的「ESP 系列 Bin 燒錄」網頁說明。

      除了安信可,你也可以嘗試刷入樂鑫原廠的韌體,不過,我剛剛看了一下他們的SDK下載頁,只有提供1.5.x版。印象中,原廠的韌體在1.4版之後,只能燒入 32Mbit (4MB) 的快閃記憶體。如果你要下載樂鑫原廠的AT命令韌體,請選擇標題為”ESP8266_NONOS_SDK”開頭(亦即,沒有即時作業系統)的檔案,裡面就包含.bin格式的韌體。

      樂鑫原廠韌體的AT指令,可在該公司網站的「文檔」頁面的「入門指南」找到(ESP8266 Non-OS SDK AT 指令集,簡體中文版)。

      thanks,
      jeffrey

  10. 老師您好
    我也買了這一本書來看,
    然後在實驗ESP8266連上WiFi的時候一直卡關,編譯的時候一直錯誤。

    在您書中的12-36頁的程式碼第一行,
    #include

    我一直沒有辦法引用這個檔案(字體不會變色),不過我確定我有放在libraries裡面。

    試了好久都無法編譯成功,還請老師幫我解答了!

    我使用編譯器的版本是Arduino 1.6.5

    (這是編譯器回報的錯誤訊息)
    WiFi_basic.ino: In function ‘void setup()’:
    WiFi_basic.ino:5:3: error: ‘WiFi’ was not declared in this scope
    WiFi_basic.ino:12:27: error: ‘WL_CONNECTED’ was not declared in this scope
    ‘WiFi’ was not declared in this scope

    1. hi peter:

      我的電腦目前安裝三個版本的Arduino IDE:
      1.6.5(舊版的下載位置在此
      1.6.9
      1.7.10 (arduino.org版)

      補充說明:除了1.6.5版是以安裝程式(Installer)方式安裝,其餘都是下載.zip免安裝格式,解壓縮之後直接使用。

      主要使用的是1.6.5版,因為這個版本之後更新了GCC編譯器,導致某些程式庫無法順利編譯。ESP8266編譯器在1.6.5以及後續版本的預設安裝路徑不同,所以我如果使用1.6.9同樣會出現編譯錯誤。

      請嘗試在Arduino IDE中選擇主功能表的「工具→板子→板子管理員(Board Manager)」指令,然後按一下「板子管理員」裡的ESP8266,再按一下「移除」。重新啟動Arduino IDE之後再重新安裝ESP8266編譯環境試試看。

      thanks,
      jeffrey

    2. 老師,我照著這個方法測試過了。還是不行

      (這是錯誤訊息)
      Arduino:1.6.5 (Mac OS X), 板子:”Arduino/Genuino Uno”
      WiFi_basic.ino: In function ‘void setup()’:
      WiFi_basic:5: error: ‘WiFi’ was not declared in this scope
      WiFi_basic:6: error: ‘WL_CONNECTED’ was not declared in this scope
      ‘WiFi’ was not declared in this scope
      ———————–分隔線—————————–
      這是我的程式碼
      #include

      void setup() {
      Serial.begin(9600);
      WiFi.begin(“LAB-Free”);
      while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      }
      Serial.println(“”);
      Serial.println(“IP address: “);
      Serial.print(WiFi.localIP());
      Serial.println(“WiFi status:”);
      WiFi.printDiag(Serial);
      }
      void loop() {
      }
      ———————–分隔線—————————–
      另外我使用的ESP8266wifi.h是在這邊下載的
      https://github.com/ekstrand/ESP8266wifi

    3. 從錯誤訊息看來,你在編譯程式碼之前,忘了選擇ESP8266模組,所以IDE假設的目標控制板是Arduino Uno。

      thanks,
      jeffrey

    1. 咦?我剛剛在Mac OS X上,用1.6.10版的IDE安裝ESP8266,可以正常安裝:

      安裝ESP8266

      編譯ESP8266的程式碼也沒問題:

      編譯ESP8266程式

      thanks,
      jeffrey

    1. 如同12-4頁談到,ESP8266有兩大應用類型:
      1. 當作WiFi網路的橋接器
      2. 以獨立的控制板運作

      編譯器的錯誤訊息包含找不到avr相關程式碼,代表你的程式碼的目標處理器是AVR晶片,例如,Uno控制板採用的ATmega328。

      我剛剛看了ESP8266wifi程式庫的說明頁,這個程式庫是把ESP8266當成WiFi橋接器使用,也就是書本第12章「透過ESP-01的AT命令建立HTTP伺服器」的用法,程式庫把AT命令用更方便操作的語法包裝起來,主程式透過Arduino的ATmega328執行,所以採用這個程式庫的程式碼,控制板請選擇Arduino Uno。

      從第12章「使用Arduino開發ESP8266」一節開始的內容,則是把EP8266當成獨立的控制板使用,不需要搭配其他控制板,編譯這一類程式碼之前,控制板必須選擇ESP8266模組。

      thanks,
      jeffrey

    2. 老師您好~
      我改成使用NodeMCU 1.0開發版之後,可以連上自己的無線網路了。
      謝謝老師!!

      接下來想實作利用NodeMCU 1.0搭配DHT11溫度感測器,上傳到Google的Firebase。
      請問這樣的組合是合理的嗎?

      因為我對Arduino比較熟悉,所以還是會用Arduino編譯器上傳程式這樣。

      麻煩老師解答了,謝謝老師!

    3. 老師您好!不好意思一直打擾

      我查詢了一下,發現網路上很少運用Arduino與Firebase的Demo。

      不曉得老師有沒有可以提供參考的資料呢?

      我現在對如何連接Arduino與Firebase這件事非常沒有頭緒。

      麻煩老師了,真是不好意思。

    4. 你查詢資料的方向,並不應該從Arduino和Firebase相連著手。

      像Firebase這種雲端服務,都會提供API,所以你要查詢的是它提供哪些指令以及語法。像Firebase的REST API文件,你就可以從電腦或者微控制器下達這些指令來操作Firebase。

      如果你一定要用ESP8266/Arduino,建議選用Arduino Yun之類的高階控制板或者樹莓派,會讓你的開發工作輕鬆不少。

      good luck!
      jeffrey

    1. hi nnp:

      書本裡面介紹的Cordova (Android) App操控Arduino/ESP8266控制板的範例有三種:網路連線、藍牙和USB序列埠。

      thanks,
      jeffrey

  11. 老師您好

    每次在ESP-01燒錄Arduino程式,如果要更改程式內容需要重新燒回AT韌體再重新燒入Arduino程式嗎?

    1. 不需要,直接燒入Arduino程式即可,你可以用13-13頁的方法,透過OTA更新ESP8266的韌體。

      thanks,
      jeffrey

  12. 老師您好
    關於12-18頁
    SoftwareSerial宣告物件ESP
    提供的find函式 其參數為字串,ESP.find(“x”)是指監看用戶連線時所回傳的AT韌體訊息是否有字串”x”對吧?
    還有問題是read()函式的值就是來自AT韌體訊息的”連線編號”嗎? 他是一個字一個字讀入並以ASCII作為其回傳值嗎?
    如果連線編號是十位數的話,我是否就應該call兩次read function?

    另外問題是NodeMCU是不是沒有AT韌體,我可以用13-13頁的方法燒錄?
    因為我覺得ESP-01實在不太穩定,想拿NodeMCU作為Arduino的橋接器,做為測試實驗用而已,雖然殺雞用牛刀

    1. 1. 沒錯!
      2. 如同該行程式碼和註解,read()的傳回值是char形式,也就是一個字元,所以你不需要call兩次read()。
      3. AT韌體也可以燒錄到NodeMCU,因為它就是一個ESP-12E模組外加電源和USB序列通訊晶片。你可以用13-32頁的方式燒錄。

      thanks,
      jeffrey

    2. 老師您好
      關於read()我看了這篇教學文章
      http://allaboutee.com/2015/01/02/esp8266-arduino-led-control-from-webpage
      程式部分44、45行, 他使用read()兩次想要讀到”1″,”3″兩字元,請問為什麼會按照順序得到值?我看了arduino官網的文件好像沒有說明?

      還有想問一般關於函式庫有哪些函式可用、使用方法、參數、回傳值等等資料,只有官網有嗎? 我去看他們的github都沒有說明文件,還是都在examples裡面了?

    3. 在《超圖解Arduino互動設計入門》5-12頁的圖解裡面有說明,Serial.read()可取出緩衝區裡的第一個字元,也就是按照順序、逐一取出緩衝區裡面的字元。

      Arduino IDE提供的函式庫說明,請參閱Arduino網站的Reference單元,例如,這是Serial.read()函式的說明

      thanks,
      jeffrey

  13. 老師請問LD1117為esp01供電仍然有電流不足的問題 是否還有其他的替代方式?
    我是用UTC這家公司的,也去查datasheet確認腳位了 不知道問題出在哪

    1. 我認為不是電流不足,我也曾在台中電子街買過UTC公司的LD1117,焊接好電路之後無法順利輸出3.3V,以為買到故障品,回到同一家材料行打算再購買一個。

      這一次,店員把零件包放在櫃子上準備拿出元件時,我才看見:

      UTC公司的LD1117腳位不同

      如果真的不行,可換用書本12-5頁提到的LM317。

      thanks,
      jeffrey

    2. 你用電錶測量它的輸出電壓是3.3V嗎?
      如果是的話,按照規格書,它的電流輸出可達800mA,足夠ESP-01使用。

      thanks,
      jeffrey

  14. 老師你好:
    當我執行第二章中的範例:監控遠端的溫濕度值diy2_1,
    呼叫網頁時,程式只要執行到void defaultCmd()l裡面的dtostrf(DHT11.temperature, 5, 2, buffer)時,
    網頁就會出不來,當我把dtostrf()拿掉,
    只用 server << "溫度:" << DHT11.temperature << "”;
    就可以正當.
    這是什麼問題呢.
    謝謝

    1. hi gogo:

      “gogo”這個發音聽起來像閩南語的「哥哥」 😀

      我剛剛用Chrome測試可以顯示,Edge不行。請把buffer陣列元素從5改成6個:

      char buffer[6] = "";
      

      網頁無法顯示是因為在轉換成字串時,字串資料沒有結尾。假設30.00度,轉換成字串之後,結尾還要包含”\0″,所以是6個元素,拍謝~

      thanks,
      jeffrey

  15. 老師你好:
    我在第5章中測試Blink2.js時.
    問題出現在這行 : this.digitalWrite(LEDPIN, (out ^= 1));
    回傳 this.digitalWrite is not a function

    可能是那裡出問題呢?
    謝謝

    1. 可能是因為版本不同的緣故,我之前使用的Johnny-Five是0.9.4版,目前的版本是0.10.0。

      請改用led或pin物件試試看,底下是用pin物件的write方法輸出:

      var five = require("johnny-five");
      
      var board = new five.Board({ port: "COM11" });
      const LEDPIN = 13;
      
      board.on("ready", function() {
        var out = 0;
        var pin = new five.Pin(LEDPIN);
        //this.pinMode(LEDPIN, five.Pin.OUTPUT);
      
        this.loop(500, function() {
          //this.digitalWrite(LEDPIN, (out ^= 1));
          pin.write(out ^= 1);
        });
      });
      

      thanks,
      jeffrey

  16. 謝謝老師指點.
    另外第五章中的另一個範例:servo.js
    我測試了光碟中及書中的範例(因書中及光碟中的範例寫法有點不同),
    arduino 對應了 servo.js 指定脚位, 執行時 ,
    輸入書中所提的指令,都沒有任何反應.
    如:s.y.to(30);等
    ps : 我的伺服馬達( MG995 / S3003二款 , 確定是正常的 ) 採外接5v電源,
    都沒有反應.
    是否還有其他地方我沒注意到的.

    1. 不好意思剛才才發現..我忘了共地當然不會動了.
      現在正常了.
      Sorry.

  17. 老師您好!
    我想請問你,我要用blueduino rev2和ESP8266溝通,因為這個板子比較少人用,所以不知道該如何接線?想請教您。

    1. hi huang:

      我也沒用過blueduino,如果你所謂的「溝通」是指拿ESP8266當作blueduino的WiFi介面,那就用AT韌體功能即可。

      thanks,
      jeffrey

  18. 前陣子在博客來看到這本書, 馬上就衝去買了~~~
    IoT這本介紹的東西有比較深一點了(我不是本科系的), 所以看得比較慢一點, 目前還在努力當中…
    但這二本超圖解我都很喜歡~~~大推~~~

  19. 老師你好:
    在書中第13-10頁提到當使用UNO來燒錄ESP-01時,
    凡是從UNO板輸入訊號到ESP-01模的的接脚都要串2.2K電阻.
    我感覺接線圖在ESP-01的RX/TX表示好像畫錯了.
    也就是要從uno的tx輸出訊號而接上2.2K電阻應該是到esp-01的rx位置.
    還是我認知有誤呢?

    1. 在這次燒錄接線圖中,
      為什麼是RX對RX
      TX對TX呢?
      是怎樣的條件下才會這樣接呢?
      是因為要燒韌體才會這樣嗎?還有何時會這樣接.
      謝謝

  20. 請問一下,wifi+arduino的AT指令一直沒有回應。
    我是用MEGA2560版子,電壓外接3.3V電源,TXRX設在0和1 (程式也有改到0和1)
    燒錄進去後 打指令AT完全沒有回應
    想請問問題出在哪裡!?

    1. hi wei:

      1. 請確認你的Serial程式運作正常
      2. 請嘗試用不同的鮑率,例如,115200。
      3. 請參閱這一篇回應,刷新韌體看看。

      thanks,
      jeffrey

    2. 感謝你的回答!
      程式是照著課本上打的,也試過更改鮑率及刷新韌體了
      利用終端機與esp8266是可以溝通的,
      但是接上arduino利用序列監控室窗與esp8266通訊還是沒有反應…
      還有什麼導致沒有回應的原因嗎 ?

  21. 我的硬體環境: Arduino UNO R3是旗標版本(另一本書及實驗套件),已經用Arduino IDE分別測試dht11、w5100網卡,軟硬體都是正常。
    我想按照書上先實際測試第二章範例程式[動手做-從 Arduino 傳遞溫溼度值 給 Node 網站],我將書附光碟的檔案複製到硬碟,安裝Aarduino IDE 1.6.11版本(後來改換1.6.5),直接將書附範例程式編譯,都會發生錯誤!
    請問:若要能夠正常編譯書附範例程式,軟硬體有無那些限制?需要下載的Library有哪些?
    會這樣問是因為已經將書附範例copy至Arduino,但是,在未改任何code就進行編譯,會找不到 Streaming.h或是語法有問題 …… 好多狀況。
    我是個Arduino新手,也沒有購買[超圖解Arduino互動設計入門],單純想編譯書附範例就碰到一堆問題,不知該如何讀這本書?

    1. hi abel:

      書本的Arduino板以Uno為主,也就是你手邊的控制板。

      由於本書第2章的範例,沿自《超圖解Arduino互動設計入門》第16章,因此相關的程式碼沒有在此書詳列,除了dht11之外,需要的程式庫包含:
      Webduino(提供HTTP伺服器服務功能)以及Streaming按此可下載最新版本),請下載安裝這兩個程式庫,再編譯程式碼。
      我使用1.6.11版編譯無誤。

      thanks,
      jeffrey

    2. 請問:本書其它章節的範例,是否也會有類似的情形?
      本書因為引用另一本書的範例,但是讀者不一定會購買另一本書,畢竟 ,本書論及的開發板範圍較廣,如果沒有詳細說明使用的LIBRARY或提供額外下載網址,當碰到[動手做]時,會浪費很多不必要的時間.
      以我來說,買這本書的主要目的是想了解Node.js/javascript在物聯網當中扮演的角色並學習相關技術,反而不是要學書中提及的開發板該如何撰寫程式,所以,是否可以麻煩您整理一份本書在動手做的完整範例程式,讓讀者下載以便跟著讀書進度練習並了解實際運作的機制,不甚感激!

  22. 剛剛下載完streaming5,未修改範例程式並在編譯時發生下列錯誤訊息:

    C:\Users\Abel\Documents\Arduino\DHT11Client_2\DHT11Client_2.ino: In function ‘void httpSend()’:

    DHT11Client_2:53: error: expected unqualified-id before ‘<<' token

    EthernetClient << "GET /th?t=" << dtostrf(DHT11.temperature, 5, 2, tBuffer) << "&h=" << dtostrf(DHT11.humidity, 5, 2, hBuffer) << " HTTP/1.1\n";

    ^

    exit status 1
    expected unqualified-id before '<<' token

    1. 主要的程式庫,除了Streaming之外,就是放在光碟「Arduino程式庫」資料夾裡的dht11和webduino。

      ch3的arduino/DHT11Client_2/DHT11Client_2.ino檔,用1.6.5版編譯沒問題,用1.6.11會出現”httpSend未定義”的錯誤:

      ‘httpSend’ was not declared in this scope

      只要把httpSend()函式定義敘述挪到呼叫它的loop()函式之前,例如,放在setup()函式定義的上面,就能正確編譯了。像這樣:

      // 初始化乙太用戶端
      EthernetClient client;
      unsigned long past = 0; 
      const unsigned long interval = 5 * 1000L;
      
      void httpSend() {
        char tBuffer[6] = "";
        char hBuffer[6] = "";
        client.stop();
      
        // 連線到指定伺服器的5438埠號
        if (client.connect(server, 5438)) {
          Serial.println("connected");
          // 發送HTTP請求
          client << "GET /th?t=" << dtostrf(DHT11.temperature, 5, 2, tBuffer)
                 << "&h=" << dtostrf(DHT11.humidity, 5, 2, hBuffer)
                 << " HTTP/1.1\n";
          client.println();
      
          past = millis();
        } else {
          Serial.println("connection failed");
        }
      }
      
      void setup() {
        Serial.begin(9600);
      
        Ethernet.begin(mac, ip);  // 初始化乙太網路連線
        
        // 等待一秒鐘,讓乙太網路卡有時間進行初始化
        delay(1000);
        Serial.println("connecting...");
      }
      

      thanks,
      jeffrey

  23. 已經可以正常編譯並成功將DHT-11產出的數值,傳遞給遠端的Node.js網站。
    謝謝您的協助與解惑!

  24. 我想請問老師,為什麼Arduino Nano和ESP8266無法溝通?
    有更新燒錄過了,用AT指令都沒有反應,該怎麼辦?

  25. 請教老師:
    在第12章中的動手做(透過ESP-01的AT命令建立HTTP伺服器)
    預設的server IP為192.168.4.1
    如何修改本範例讓IP成為我要的靜態IP.
    謝謝.

    1. ESP8266的AT命令中,設定靜態IP的命令有兩個:
      AT+CIPSTA:設定STA模式的IP位址
      AT+CIPAP:設定softAP(軟體AP)模式的IP位址

      安信可(Ai-Think)公司的官方韌體AT命令說明文件,可在這個網址瀏覽(簡體中文和英文,PDF格式)。

      我尚未嘗試用AT命令設置靜態IP位址,請嘗試底下的操作步驟(#號和後面的文字是註解,請勿輸入):

      AT+CWMODE=1 #設置成STA模式
      AT+CWLAP #列舉可用的無線基地台

      假設其中的一個基地台的SSID是”pi”,密碼是 “raspberry”,請執行底下的命令連結該基地台:

      AT+CWJAP=”pi”,”raspberry”

      如果基地台採用動態分配位址(DHCP),執行底下的命令可顯示分配到的位址:

      AT+CIFSR

      否則,你可以嘗試底下的命令設定靜態IP位址、閘道器位址和網路遮罩:

      AT+CIPSTA=”192.168.1.100″,”192.168.1.1″,”255.255.255.0″

      如果你要把ESP-01設置成softAP(軟體AP),請執行AT+CWSAP命令(詳細的命令格式和參數說明,請參閱安信可公司的說明文件):

      AT+CWSAP=”myESP”,”12345678″,5,3 # 設定SSID為”myESP”、密碼”12345678″、頻道5、WPA2_PSK加密
      AT+CIPAP=”192.168.5.1″ # 設定IP位址”192.168.5.1″

      請注意,官方AT說明文件列舉的某些命令,可能不適用於舊版(0.9x)的AT韌體。

      thanks,
      jeffrey

  26. 老師您好
    我用板載ESP-12的WeMos D1這塊板子
    使用的是IDE裡的ESP8266WebServer範例中的WebUpdate
    這個也是一種OTA更新韌體的方式對吧?
    但我更新失敗了,導致現在板子運作不正常
    上傳程式後都在Serial回傳亂碼
    不知道一般要用什麼方法重置它?

    1. 我沒有WeMos D1這個板子,不過它們的運作方式都一樣,請嘗試燒入不同的韌體,例如ch13後面提到的Espruino測試,然後再燒寫Arduino程式看看。

      thanks,
      jeffrey

    2. 謝謝老師 已經恢復正常了

      另外想請問第12-32頁
      const char PAGE_INDEX[] PROGMEM = R”=====(
      test)=====”;
      這樣的方法要如何在以上字串中插入的不同資料型態的變數呢?
      我想顯示例如溫度資料在這個http server上

    3. 要動態更新網頁的顯示值,建議使用jQuery的get()方法搭配SetInterval()函式(請參閱2-19頁),你可以把網頁和JS程式庫存入ESP8266的SPIFFS記憶體區域。

      thanks,
      jeffrey

    4. 老師您好

      我想按照2-19的方法取得溫度資料
      先嘗試新增網頁資源路徑
      server.on (“/temp”, [](){
      server.send(200, “text/plain”, “28”);
      });
      直接網址輸入yc.local/temp/ 仍然得不到純文字資料
      但是我如果在網頁中加入連結
      temp
      這樣子卻可以看到看到資料
      打開console看也get不到資料
      為什麼會有這樣的情況呢?

    5. 因為“/temp”指的是根路徑底下的temp資源;
      “/temp/”指的是根路徑的”temp”路徑裡面的首頁。
      輸入網址時,去掉末尾的”/”即可。

      thanks,
      jeffrey

  27. 請教老師:
    有關第13章,設置區域網路域名的範例中(mDNS.ino),
    我在PC上安裝了書中提的Bonjour printer service.
    可在pc的瀏覽器中正確的執行jarvis.local呼叫網頁.
    當我在我的Android手機上下載了Bonjour Broswer後,
    我在Bonjour Broswer中也成功看到我的ESP01的相關內容.
    但在手機的瀏覽器中輸入jarvis.local時,卻是找不到該網頁.
    輸入IP時,網頁內容才出現.
    請問這可能是那裡出現問題?
    ps:我試了不同的手機都是相同的結果.

    1. 我記得Android 4.1版就有支援,我只在4.2.x, 5.x和6.0.1版系統的Note 2與Note 4手機,用Chrome瀏覽器測試沒問題,請下載其他瀏覽器測試看看。

      thanks,
      jeffrey

  28. 您好~~~
    我想請問一下, 我將第八章的ejs範例複製到硬碟, 然後執行”node top10.js”, 會出現下列的錯誤訊息:

    D:\mongo>node top10.js
    ##############################################################
    #
    # !!! MONGOOSE WARNING !!!
    #
    # This is an UNSTABLE release of Mongoose.
    # Unstable releases are available for preview/testing only.
    # DO NOT run this in production.
    #
    ##############################################################

    events.js:141
    throw er; // Unhandled ‘error’ event
    ^

    Error: failed to connect to [localhost:27017]
    at null. (D:\mongo\node_modules\mongoose\node_modules\mongodb\lib
    \mongodb\connection\server.js:549:25)
    at emitThree (events.js:97:13)
    at emit (events.js:175:7)
    at null. (D:\mongo\node_modules\mongoose\node_modules\mongodb\lib
    \mongodb\connection\connection_pool.js:150:15)
    at emitTwo (events.js:87:13)
    at emit (events.js:172:7)
    at Socket. (D:\mongo\node_modules\mongoose\node_modules\mongodb\l
    ib\mongodb\connection\connection.js:533:10)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at emitErrorNT (net.js:1269:8)

    請問一下, 我可以從哪方面著手去除錯呢?!

    1. 請問你有事先啟動MongoDB嗎?MongoDB是第幾版?晚一點我再測試看看。

      thanks,
      jeffrey

      [更新] 我用MongoDb 3.0.4版< 測試top10.js,執行正常。 另外,我查看了光碟裡的package.json,裡面設定的mongoose是3.0版, 我目前使用的是4.1.10版,也請試用底下的package.json定義安裝套件看看:

      {
        “name”: “sensorDB”,
        “version”: “0.0.1”,
        “dependencies”: {
          “ejs”: “^2.3.4”,
          “express”: “^4.13.3”,
          “mongoose”: “^4.1.10”
        }
      }
      
  29. 老師您好,
    上傳程式的時候遇到這個錯誤,
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    想請問有沒有什麼解決方法。
    是跟程式有關還是跟板子的設定?

    1. 從錯誤訊息看來,問題並非出在你的程式;請問你的控制板是NodeMCU 1.0嗎?
      我之前也遇過無法燒錄的情況,使用電錶檢查,原因出在ESP-12E的某些接腳和板子焊接不良(虛焊),補上銲錫之後就正常了。

      也請更新Arduino IDE和ESP8266編譯環境看看。

      thanks,
      jeffrey

    2. 感謝老師的解答,
      我是使用ESP8266-01再加上CP2102
      ARDUINO已經是最新版本了,
      我試過其他塊ESP8266-01也是一樣的情況,
      所以可能可以排除接觸不良這部分。
      不過ESP8266板子的設定倒是有點不確定
      板子:Generic ESP8266 Module
      Flash Mode:QIO
      Flash Frequency:40MHZ
      CPU Frequency:80MHZ
      Flash Size:4M(1M SPIFFS)
      Debug port:Serial1
      Debug Level:無
      Reset Method:ck
      Upload Speed:9600

    3. 這個問題我之前也有遇過, 如果你確定軟體和線路連接都是正常的話, 請在上傳sketch之前, Reset一下你的ESP8266(把RST和GND短路一下), 之後再上傳.
      今天我有再把ESP8266拿出來測試, 我的環境是Arduino IDE 1.6.12, 測試了幾個會發生這個問題的情況, 整理下來給你參考:
      1. ESP8266供電不足 : 我使用FDTI連接線接在電腦的USB 2.0 Port, 經AMS1117轉換成3.3V供電給ESP8266. 但因為USB 1.1和2.0的供電電流都只有500ma, 再經過轉換電流就不夠推動ESP8266了, 把線插到USB 3.0 Port(電流在1A左右)再上傳就正常了.
      2. 前一個例子上傳成功後, 線路都沒動, 要再上傳另一個sketch就發生了”espcomm”的錯誤了. 用迴紋針碰一下”RST”和”GND”二個腳位, 之後上傳就成功了. 後來我就不斷的測試上傳, 只要在上傳之前, 先RST一下, 上傳率100%.
      這個是在我的環境下的測試結果, 你的情況有可能跟我不同, 可以參考一下, 如果解決不了你的問題, 可能就要再請其他高手們解答了.

  30. 感謝您的回覆~~~
    我目前使用的MongoDB是最新版(mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi). 將Mongoose模組更新至4.1.10版後, 已可正常執行!
    謝謝您的幫忙~~~我可以再往下一個章節繼續測試了~~~

  31. 請教老師:
    目前想將手上的STM32F103RCT6相容版燒入Espruino韌體,
    使用python 2.7.12版分別在windows7,windows10命令列視窗執行執行書上7-50頁
    python stm32loader.py -p COM29 -e -w -v espruino.bin 命令時,出現以下錯誤.

    File “stm32loader.py”, line 29, in
    import serial
    importError:No module named serail

    我確定COM port 號是正確的,不知問題出在哪裡?
    本身對python不熟,不知可否指點一下,感恩!

    1. hi jacky:

      “No module named serial” 訊息代表Python程式找不到序列通訊模組。

      拍謝,我忘了說明。

      請到Python官網的pyserial(序列通讯模组)網頁下載 .whl 格式的擴充模組(Python Wheel),例如:pyserial-3.2.1-py2.py3-none-any.whl

      為了方便安裝,請將此 .whl 放到磁碟根目錄,例如,我將 “pyserial-3.2.1-py2.py3-none-any.whl” 複製到代號 G 的隨身碟根目錄。

      開啟命令列視窗,輸入底下的指令即可安裝序列通訊模組:

      pip install g:/pyserial-3.2.1-py2.py3-none-any.whl

      安裝Pyhon模組的指令格式如下:

      pip install [模組檔案的路徑]

      請留意,Windows系統的路徑分隔符號是 “\”,但是在 pip 指令的參數中,請改寫成 “/”。

      thanks,
      jeffrey

  32. 老師您好:
    經過一番努力,解決了pyserial(序列通讯模组)的問題,本以為可以一路順暢執行
    python stm32loader.py -p COM29 -e -w -v espruino.bin 命令,不過又出現以下新的錯誤訊息.
    Cat’t init Ensure BOOT=1,BOOT1=0,and reset device
    Traceback (most recent call last):
    File “stm32loader.py”, line 554,in
    bootversion = cmd.cmdGet()
    File “stm32loader.py”, line 140,in cmdGet
    if self.cmdGeneric(0x00)
    .
    省略…
    我確定BOOT=1,BOOT1=0 硬體設定正確,usb to ttl轉板也連接正確,也更改過包率 9600,19200,115200 測過都不行.
    又卡關了,不知問題出在哪裡? 不知老師可否再指點一下,感恩!

    1. 剛才嘗試在STM32板子燒寫Espruino韌體,也發生錯誤:

      stm32loader.py error

      但是按一下Reset鍵,再執行一次就能正常寫入了:

      stm32loader.py

      thanks,
      jeffrey

  33. 背景:
    公司產品以工業控制為主,大部分以RS232連線控制。

    選擇此書的評估:
    行動裝置的數目即將超越PC,所以有客戶要求使用手機做機器設定,NB也開始被嫌重。
    基本上手機又有Android及iOS二大系統,各有開發語言及工具。
    個人接下在手機上開發控制程式任務,一開始就有平台問題。
    所以看到此書符合需求就買下。
    軟體使用Cordova為主,除可應付手機/平板,也可能產出PC程式。
    之前是MCU工程師,故無相關背景。
    合理的方法是使用Bluetooth-UART將原先通信轉到手機可以收到。
    使用Bluetooth的原因在於隱密性,只有客戶才可設定配對碼。

    不過Cordova開發上有些問題,不好找資源。
    也試過React-Native,更糟,新到沒有人可以問。
    可以建議Cordova相關的資源網站嗎?
    Cordova好像已發展很久了,但用的人好像也不是很多,也許是我不會找。

    1. hi bee:

      遇到問題的時候,我都是用關鍵字問谷歌大神,或者閱讀廠商∕開發人員提供的技術文件,沒有習慣固定造訪某個論壇或blog。

      企劃本書的行動App單元時,除了Cordova/PhoneGap,我有稍微閱讀React Native和NativeScript的文章,最後選擇Cordova的主要原因:當時React Native仍處於快速發展階段,語法和結構上可能會有大幅的變動,有可能我寫完整本書,這個單元會被迫重寫。

      再加上行動App開發是這本書的部份單元,不是主軸,而且React也不適合程式初學者,一個小小的App會涉及類別(class)、組件(component)、虛擬DOM…等概念。我還記得曾讀到「盡力完善Mac開發環境」之類的聲明,也就是開發環境以Mac OS為首選。

      所以本書採用相對成熟,參考文件較為豐富(市面上有多本Cordova書籍)、有我需要的外掛(像藍牙和USB序列通訊 )、且已經有教育單位導入教學的Cordova/PhoneGap。

      thanks,
      jeffrey

  34. 主要是在Cordova上打通裝置的速度不快。
    開SD卡,用了一天。但找不到開檔開到那去了。因為從android和PC二側看到的檔案結構有些不同。
    第二天改成寫特定檔名,再用Android檔案總管去找出位置。
    HC-05讀回又用了一天。但讀回的字有非顯示字元就出問題。第二天換接收函式,字元對了,數目不對。
    後來才發現,非同步I/O有使用到類似中斷的方式,所以接收函式要將資料串起來。這樣是對了,但又寫不進SD卡。
    寫入SD卡的是物件,以JSON格式放起來。又再查,找到寫入時改成物件內的buffer,才可以寫入二進制檔。
    用Cordova讀寫二進位的文章很少,所以前進速度很慢。
    這樣二週用掉了!

  35. 樹莓派在執行8-27頁的find.js 出現下面的回應,我該用甚麼方法讓他正常執行呢?

    pi@raspberrypi:~/test $ node find.js
    /home/pi/test/find.js:27
    �@�@console.log(“�䤣��dht11�����ơI”);
    ^
    SyntaxError: Unexpected token ILLEGAL
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:513:28)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Module.runMain (module.js:575:10)
    at run (bootstrap_node.js:352:7)
    at startup (bootstrap_node.js:144:9)
    at bootstrap_node.js:467:3

    1. 我今晚測試看看。

      >> 更新

      剛剛在乾淨的Raspbian系統安裝3.0.9版的MongoDB,測試沒問題:

      MongoDB執行find()

      應該是輸入的指令敘述裡的中文不是UTF-8編碼的緣故。如果你是使用光碟裡的 “MongoDB命令練習.txt” 複製指令、貼上的話,請先將 “MongoDB命令練習.txt” 轉存成UTF-8格式。

      thanks,
      jeffrey

  36. 老師您好:
    在ejs樣板中顯示最近10筆溫濕度資料時.當執行時發生如下的錯誤訊息.
    本身mongodb 是處于執行狀態,也可以查詢出相關的紀錄.
    卻發生如下的錯誤訊息:
    skhost:mongo skmac$ node top10.js
    { [Error: Cannot find module ‘../build/Release/bson’] code: ‘MODULE_NOT_FOUND’ }
    js-bson: Failed to load c++ bson extension, using pure JS version

    ##############################################################
    #
    # !!! MONGOOSE WARNING !!!
    #
    # This is an UNSTABLE release of Mongoose.
    # Unstable releases are available for preview/testing only.
    # DO NOT run this in production.
    #
    ##############################################################

    package.json
    {
    “name”: “sensorDB”,
    “description”: “Test Mongodb by mongoose”,
    “version”: “0.0.1”,
    “dependencies”: {
    “ejs”: “^2.5.2”,
    “express”: “^4.14.0”,
    “mongoose”: “^3.0.0”
    }
    }

    詢問一下如何解決.此問題.

    1. 老師你好:
      當將Mongoose修改為4.1.2版本之後出現新的狀況

      skhost:mongo skmac$ node top10.js
      網站伺服器在端口號:3000 為你服務中…

      當開啟Browser: http://localhost:3000 之後. 畫面為空白 而server端出現這樣的提示
      Mongoose: mpromise (mongoose’s default promise library) is deprecated, plug in your own promise library
      instead: http://mongoosejs.com/docs/promises.html

      不知道如何解決. 請問老師有沒有解結的方式.

    2. 老師該問題已經解決了:
      mongoose版本有修正,為4.1.2 ,另外在 models目錄下的dht11.js
      mongoose.connect(‘mongodb://localhost/sensors’);
      這行測試時remark. 忘記改回來. 產生了相關錯誤. 目前該程式已經正常運行.謝謝

  37. 老師您好,
    我想利用esp8266上傳霍爾感知器
    測得的轉速至Thingspeak,
    卻不知道從何下手,
    可以給我建議嗎
    謝謝

    1. hi cindy:

      把一個大問題拆解成數個小問題,分別解決。例如,先了解如何取得感測器數值、再測試以用戶端形式,透過GET或POST方法傳遞資料,實驗這一步之前,妳可能要先了解網頁表單的運作方式…最後再查閱thingspeak提供的API,並且把之前實驗的程式整合起來。

      have fun!
      jeffrey

    2. 老師您好,
      因為沒有寫程式的經驗,
      從網路上找些程式拼拼湊湊,
      大致上可以看得懂邏輯性,
      但是要解決問題有點難倒我了,
      一直無法將讀取到的數值寫出來,
      不管怎麼跑都是0,
      程式碼:http://pastie.org/10975535
      希望老師可以幫幫忙。

    3. Hello, Cindy. 如果單純將霍爾感測器的數值print出來, 顯示的數值是正常嗎?! 如果不正常, 建議妳先從霍爾感測器的方面先解決. 如果同時要判斷感測器和ThingSpeak的問題, 會使問題複雜化.

  38. 老師您好, 我有您寫的IOT黃色這本, 想請教:
    page2-26實做後, 點擊書本範例程式”temp_json.html”,
    其網址列上顯示為, 電腦硬碟中的路徑, 並不是如p2-25中的192.168.1.25
    修改其中ip去抓arduino的192.168.1.106/th.json資料,
    發現第一次reset板子後會抓到溫濕度數值,
    但是接下來似乎就接不到 JSON 的回應.
    而且濕度值與溫度值卻一樣, 如溫度20度, 濕度20%(從其他端顯示溼度應為50%)
    不知道是不是我漏了什麼?

    1. 請把thCmd()函式裡的buffer陣列元素改成6個試試看:

      char buffer[6] = “”;

      thanks,
      jeffrey

  39. 之前你提到,可能是因為版本不同的緣故,
    你用的是0.9.4版,而目前的版本是0.10.0。
    所以digitalWrite要改成其他的寫法,
    我也因為這個卡了很久,後來看了你的網站才解決,
    但請問一下,那個寫法是從哪邊來的資料,
    而且,是全部的函式只要碰到wait都不行還是只有這個digitalWrite。
    另外,請教一下,有沒有辦法可以只灌0.9.4。

    1. johnny-five網站的API單元,有列舉所有物件和相關指令,像這個Board物件的API文件,但是我沒看到改版的說明。

      至於指定Node.js套件版本的說明,請參閱3-43頁「使用package.json管理專案的模組程式」一節。

      thanks,
      jeffrey

    1. 你好,不知你是否能看到这些网站,台湾的一些网络书店可配送到全球,像是博客来网路书店。或者,香港的香港书城也有贩售。

      其实我已经跟北京的电子工业出版社签约,2017年第一季会有简体中文版,谢谢!

      thanks,
      jeffrey

  40. 老師您好,
    請問在12章「使用 ESP8266WebServer 程式庫建立 HTTP 伺服器」,
    或13章,「動手做 使用 ESP-01 模組開發 Arduino 物聯網」中,
    ESP是設成STA模式嗎?
    還有透過ip或網址jarvis.local連到ESP模組時,
    使用的筆電或手機是不是需要跟ESP模組連線的wifi在同一個網域才行?
    用手機的3G上網就找不到?
    謝謝老師!

    1. 對,我是用STA模式。一定要在相同網域才能相連,否則你就得設定無線基地台,開啟Virtual DMZ (虛擬非軍事區),讓你的ESP8266可以從外部網路存取。每個路由器的設定方式都不同,請查閱相關說明。

      thanks,
      jeffrey

  41. 老師好
    我想請問一下書中12-26頁的範例中
    #include
    這個程式庫是哪裡下載的
    我在這個網站中https://github.com/esp8266/Arduino下載的壓縮檔
    檔名叫做Arduino-master
    然後打開arduino IDE 選草稿碼->include library->add .zip library
    放進去arduino裡面還是不能夠編譯
    請問是我載錯還是加入library 方是有錯

發佈留言

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

Related Posts

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

Back To Top