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

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

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

預定上市時間:2016年5月(已上市)

本書探討的核心主題是串聯、匯流整合。

網際網路從最初的人際溝通橋樑,演化成機器之間協同合作的交流管道。物聯網(Internet of Things, 簡稱IoT)是指替每個東西,包括一般物品(例如:超商以及它所販售的所有商品)、感測器、甚至人類和動物,都標上唯一識別碼(unique identifiers,如:條碼、IP位址、身份證號碼…),彼此之間透過約定好的通訊協定,利用網際網路相連、分享數據。

網際網路,物聯網演進。

筆者假設讀者曾經閱讀《超圖解Arduino互動設計入門》,並且曾使用Arduino開發工具寫過Arduino程式。

超圖解Arduino互動設計入門》探討的重點是電子電路基礎,以及Arduino和周邊介面、感測器與零組件的整合應用。《超圖解物聯網IoT實作入門》則是強調串聯網路軟體與微電腦控制板,以JavaScript為主軸,開發網路應用程式、手機App、互動網頁、資料庫程式和操控微電腦。

物聯網開發應用

物聯網不僅只是兩個裝置之間的互相連結,它們通常也連結到負責收集資料,以及協調這些裝置運作的(雲端)伺服器。此外,控制器、感測器等物聯網裝置,通常也都要具備讓使用者操作和監控的介面,無論是網頁或者App形式。底下是物聯網的基本組成架構:

物聯網的基本組成架構

超圖解Arduino互動設計入門》觸及的物聯網內容,僅包含「感測器∕控制器」和「通訊網路」;《超圖解物聯網IoT實作入門》則囊括上圖列舉的四大範疇。

使用C和JavaScript程式語言

本書使用物聯網領域,兩種最根本的語言來建構應用程式:

  • Arduino的C語言:Arduino系列控制板是電子互動maker的最愛,許多非Arduino控制板,也強調跟Arduino的程式開發環境或者控制接腳相容。儘管控制板廠商不斷推陳出新,C語言仍是當家主流。
  • JavaScript:全球資訊網(World-Wide Web)最通行的語言是JavaScript,也是所有網頁∕網站開發人員必知必會的程式語言。經過數年來的發展,JavaScript的應用領域也擴展到電腦應用程式、手機App開發,甚至操控微電腦控制板。

無處不在的JavaScript執行環境

常見的智慧型網路裝置,都能執行JavaScript程式。當今書市不乏大師級的JavaScript相關著作,像本書每個章節,從互動網頁、網站資料庫程式設計、動態圖表到手機App開發,都有專門的參考書籍,但它們都鮮少提及JavaScript在物聯網和微控制器的整合應用。所以本書的定位,並不是要取代這些書籍,而是延伸和擴充。

用於電腦伺服器和微控制器的JavaScript

伺服器端程式也能用JavaScript語言開發。可在瀏覽器之外獨立執行JavaScript程式的Node.js於2009年問世,並相繼獲得Walmart(世界最大連鎖超市), PayPal(線上支付款項系統)和Netflix(網路第四台)等大型企業採納,用來建置可應付購物旺季高流量的高效能網站伺服器程式(註:Node.js並不是第一個可在瀏覽器外運作的JavaScript程式環境,但它是最成功的一個)。

Node.js

Node.js能夠在Windows, Mac OS X以及Linux系統執行;不只是個人電腦,風靡自造界的Raspberry Pi(以下稱「樹莓派」)、BeagleBone Black,以及美金9元的開放原始碼微電腦C.H.I.P.,還有基於x86處理器架構的Intel Galileo控制板也都能執行Node.js。

Raspberry Pi + Node.js

某些採用32位元處理器的控制板,更直接把JavaScript語言當作「母語」,例如EspruinoTessel 2,而三星電子公司在2015年5月發表了一個「瘦身」版的JavaScript程式語言,叫做JerryScript,可運用在僅有64KB主記憶體的微控制器。換句話說,在這些控制板上讀取和設定I/O腳位,都是用JavaScript。因此,從前端網頁、網站伺服器程式,到微控制器和感測器終端,都能用相同的JavaScript語言撰寫;學習JavaScript,也就能同時掌控前端、伺服器端和感測端的軟、硬體!

Espruino Pico控制板

本書採用的控制板類型比較多元,不限於Arduino,但它們的控制程式都是用C或JavaScript。

《超圖解物聯網IoT實作入門》章節導讀

第一章「JavaScript入門」:介紹JavaScript的由來、基礎語法、瀏覽器的DOM(文件物件模型)、事件處理程式、使用Chrome瀏覽器測試JavaScript程式、在網頁中嵌入JavaScript程式…等主題。

JavaScript入門

第二章「jQuery入門」:jQuery是當今最廣泛使用的JavaScript程式庫,主要的作用是讓動態網頁程式變得更簡單。本章將透過整合Arduino乙太網路與jQueryUI(互動介面)程式,帶領讀者認識jQuery語法、網頁訊息交換格式(CSV, XML和JSON)和「不重新載入網頁,動態更新內容」的AJAX技術。

整合Arduino乙太網路與jQueryUI(互動介面)程式

第三章「Node.js入門」:Node.js是一個獨立的JavaScript執行環境,可以讓我們使用JavaScript程式語言開發應用程式,在瀏覽器之外執行。本章將說明Windows, Mac OS X和Linux(樹莓派)系統的Node.js安裝方式,並透過非阻塞I/O讀取檔案、自訂與引用程式模組、使用npm工具程式管理模組、使用Express框架開發網站應用程式、RESTful API、從Arduino傳遞溫溼度值給Node網站…等數個實作範例認識Node.js。

Node.js + Express.js

第四章「Node.js序列埠通訊與樹莓派GPIO控制」:序列埠是連接Arduino與個人電腦和Linux微電腦控制板,最常用的介面。GPIO則是樹莓派控制板的標準週邊介面,本章除了介紹如何使用Node.js連接與控制序列埠和GPIO介面,也將介紹GPIO介面整合自製Arduino控制板的方法,還有MOSFET電子元件,以及透過MOSFET組成5V和3.3V的訊號電壓轉換板。

FET元件符號

第五章「使用Johnny-Five(霹靂五號)及Socket.io即時操控Arduino」:Johnny-Five(霹靂五號)是個Node.js程式庫,讓電腦(或Linux微電腦控制板)以JavaScript程式操控連接在USB介面(或其他序列埠)的Arduino。本章將比較「霹靂五號」與Arduino的C語法異同,並且透過讀取開關(數位)訊號、類比輸入和PWM輸出、LM35溫度感測器、伺服馬達控制,還有瀏覽器與矩陣LED作畫等範例實作,讓讀者了解「霹靂五號」和網頁即時通訊程式(Socket.io)。

使用Johnny-Five(霹靂五號)及Socket.io即時操控Arduino

第六章「電子郵件、串流視訊與操控伺服馬達」:本章的範例以樹莓派相機為主,第一個範例搭配PIR人體紅外線感測器,在偵測到入侵者時,自動拍照並e-mail。第二個範例介紹使用Socket.io和M-JPEG壓縮程式,在網頁上顯示串流視訊。第三個範例介紹簡易的相機+DIY伺服馬達雲台,並且透過觸控螢幕、鍵盤和實體遙桿控制雲台。

串流視訊與操控伺服馬達

本章最後一個例子是在電腦的瀏覽器上,透過JavaScript擷取Web Cam攝影機的視訊影像,並偵測其中是否有人類臉孔,若有的話,則控制伺服馬達跟著臉孔轉動。

人類臉孔偵測

第七章「Espruino控制板入門」:介紹採用JavaScript作為「母語」的Espruino開源控制板、如何自行燒錄一個相容的Espruino板,並且透過超音波LED燈光強弱控制、藍牙H橋馬達控制、SD記憶卡溫濕度記錄器、深層睡眠省電模式…等DIY實作練習,認識Espruino控制板的數位和類比I/O腳位的接線和控制方式。

Espruino與STM32控制板

第八章「MongoDB資料庫系統」:MongoDB是一款適合處理大數據與物聯網資料的免費、開放原始碼資料庫,本章將介紹MongoDB的安裝方式、基本架構、資料的新增、擷取(篩選)、修改和刪除等基本操作,並且透過Node.js的Mongoose套件連結資料庫,儲存Arduino上傳的數據。

MongoDB資料庫系統

第九章「資料視覺化—使用C3.js與D3.js繪製圖表」:若只在網頁上用文、數字列舉數據,未免太乏味,本章將說明如何透過知名的C3.js和D3.js程式庫,以活潑生動的量表(gague)和圖表(chart)形式呈現儲存在MongoDB資料庫裡的數據,以及Arduino傳入的即時數據,並且透過簡易的數位濾波手法過濾雜訊。

數位濾波

第十章「Cordova開發手機App入門」:Cordova是免費、開放原始碼的工具軟體(註:付費版的開發工具為Adobe PhoneGap),讓開發者使用HTML和JavaScript來開發手機和平板的App。本章將說明Cordova與Android系統的開發環境與相關軟體的安裝、App程式基本架構並且使用jQuery Mobile建立App操作介面、建立透過手機網路(Wi-Fi)操控微電腦的App。

Cordova藍牙手機遙控App

第十一章「製作Cordova藍牙手機遙控App」:說明如何透過Cordova的藍牙、加速度感測器和序列埠通訊等外掛,製作手機藍牙遙控機器人的App,以及用手機的加速度感測器控制伺服馬達雲台。

Apache Cordova序列埠控制Arduino

第十二章「ESP8266物聯網實作(一)」:介紹ESP8266微控器的I/O腳位,連接Arduino控制板,提供Arduino控制板Wi-Fi無線通訊的功能,並且說明如何替它燒錄Arduino韌體,用Arduino的C程式語言操控ESP8266。

ESP8266網站伺服器

第十三章「ESP8266物聯網實作(二)」:介紹如何替ESP模組設定區域網路的域名、替ESP-01模組燒錄Arduino程式、透過網路更新ESP模組的韌體、連接OLED顯示器,以及燒錄並透過Espruino(JavaScript程式)控制ESP8266。

ESP8266連接OLED顯示器與DHT11溫濕度感測器

14 thoughts on “新書預告:《超圖解物聯網IoT實作入門 使用JavaScript/Node.JS/Arduino/Raspberry Pi/ESP8266/Espruino》

  1. 老師你好:
    我家洗衣機電腦機板掛了,我用Arduino自己寫了個簡單的控制程序,
    如下: 當按鈕開關啟動程序,正常循環一個流程後,過了約30分鐘程序為什麼會自己自動再啟動,不是應該要在按開關,程序才會再次啟動嗎? 我只好在最後面補一個24小時的時間延遲.
    //   快速測試
    int ledPin13 = 13; //設定第13 pin給注水
    int ledPin12 = 12; //設定第12 pin給洗衣正轉
    int ledPin11 = 11; //設定第11 pin給洗衣反轉
    int ledPin10 = 10; //設定第10 pin給排水
    int ledPin9 = 9; //給脫水
    int ledPin8 = 8;// 給強制斷開排水
    int inPin = 2; //設定第2 pin為輸入pin (為了讀取按鈕狀態)
    int val = 0; //讀取按鈕狀態
    void setup() {
    pinMode(ledPin13, OUTPUT); //設定LED pin腳狀態為輸出
    pinMode(ledPin12, OUTPUT);
    pinMode(ledPin11, OUTPUT);
    pinMode(ledPin10, OUTPUT);
    pinMode(ledPin9, OUTPUT);
    pinMode(ledPin8, OUTPUT);
    pinMode(inPin, INPUT); //設定第2 pin狀態為輸入
    }
    void loop(){
    val = digitalRead(inPin); //讀取輸入pin腳的值
    if (val == 1) { //確認是否輸入為高電壓 (按鈕壓下)
    //  注水
    digitalWrite(ledPin13, 1);
    delay(3000);//注水時間控制
    digitalWrite(ledPin13, 0);//注水停止
    delay(500);
    ////////////////洗衣
    digitalWrite(ledPin12, 1);//正轉開始
    delay(1500);//正轉時間控制
    digitalWrite(ledPin12, 0);//正轉停止
    delay(3000);
    digitalWrite(ledPin11, 1);//反轉開始
    delay(1500);//反轉時間控制
    digitalWrite(ledPin11, 0);//反轉停止
    delay(3000);
    digitalWrite(ledPin12, 1);//第2輪
    delay(1500);
    digitalWrite(ledPin12, 0);
    delay(3000);
    digitalWrite(ledPin11, 1);
    delay(1500);
    digitalWrite(ledPin11, 0);
    delay(3000);
    /////////////////////////////////////////////////////////////////////排水
    digitalWrite(ledPin10, 1);//排水
    delay(3000);//排水時間控制
    //停止+煞車
    digitalWrite(ledPin10,0);//排水停止
    delay(3000);
    digitalWrite(ledPin8,1);//強制排水斷開(繼電器由B變A)
    delay(3000);//變A接點持續時間
    digitalWrite(ledPin8,0);//復歸為B接點
    delay(1000);
    /////////////////////////////////////////////    洗淨
    //  注水
    digitalWrite(ledPin13, 1);
    delay(3000);
    digitalWrite(ledPin13, 0);
    delay(500);
    ////////////////洗衣
    digitalWrite(ledPin12, 1);
    delay(1500);
    digitalWrite(ledPin12, 0);
    delay(3000);
    digitalWrite(ledPin11, 1);
    delay(1500);
    digitalWrite(ledPin11, 0);
    delay(3000);
    digitalWrite(ledPin12, 1);
    delay(1500);
    digitalWrite(ledPin12, 0);
    delay(3000);
    digitalWrite(ledPin11, 1);
    delay(1500);
    digitalWrite(ledPin11, 0);
    delay(3000);

    //////////////////////////
    //  排水
    digitalWrite(ledPin10, 1);
    delay(3000);//排水時間
    digitalWrite(ledPin8, 1);//強制斷開排水
    delay(3000);
    digitalWrite(ledPin8, 0);
    delay(1000);
    //   脫水
    digitalWrite(ledPin9, 1);
    delay(3000);//脫水時間
    //    慢轉
    digitalWrite(ledPin9, 0);//脫水停止
    delay(3000);//洗衣槽慣性旋轉時間
    //    停止+煞車
    digitalWrite(ledPin10,0);//排水斷開 同時 慣性旋轉立即煞車
    delay(1000);
    digitalWrite(ledPin8, 1);//強制斷開排水
    delay(5000);
    digitalWrite(ledPin8, 0);
    delay(1000);
    }
    }

    1. wow~真有意思~

      建議你可以把各項功能拆開寫成不同的函式,比較容易除錯。
      另外,也請在偵測按鍵值的條件式內,把按鍵值設定成0試試看。

      void loop(){
      val = digitalRead(inPin); //讀取輸入pin腳的值
      if (val == 1) { //確認是否輸入為高電壓 (按鈕壓下)
      val = 0;
      : // 以下省略
      }
      }

      thanks,
      jeffrey

    1. hi AJ:

      本書有使用CSI介面,實際是透過Node.js執行Linux指令操控相機。沒有提到DSI,因為DSI模組本質上就是一個具備10點觸控的LCD顯示器。

      如果你說的「控制」,指的是「接收多點觸控訊號」的話,就Web應用程式觀點,這部份是前端JavaScript的工作,跟Node.js比較沒有關係,本書第六章有採用觸控螢幕操控攝影機雲台的範例。

      thanks,
      jeffrey

  2. 老師您好 我想請問一下我依照《超圖解物聯網IoT實作入門:使用JavaScript/Node.JS/Arduino/Raspberry Pi/ESP8266/Espruino》這一本書中第7-50頁的步驟使用「python stm32loader.py COM24(我的STM32F103RCT6的相容板,內建PL-2303HX的USB轉TTL晶片) -e -w -v espruino_1v91_espruino_1r3.bin」進行燒錄Espruino韌體時發生失敗,顯示找不到Serial的錯誤訊息,另外我也是去Espruino官網下載的韌體,在Espruino Web IDE讀得到該STM32相容板的COM24,也顯示「Connected >」連入該裝置,但是無法進行程式燒錄、開發與執行等基本動作。
    STM32開發板/核心板/STM32F103RCT6最小系統板。謝謝您的協助。

    1. 請問你在板子通電開機之前,有先按住Boot0按鈕,讓此接腳處於高電位嗎?

      如果有的話…我自己有遇到USB轉序列線的問題。

      這是我採用的STM32F103RCT6最小系統板,以及兩個USB轉序列線:

      stm32最小系統板

      兩個USB轉序列線的IC都是CH340G,燒錄Arduino韌體沒問題,但我不知道為什麼,最左邊的那一個在燒錄Espruino韌體時都會出現錯誤。這是燒錄Espruino 1.9.2版的畫面,上方是成功的訊息(用中間的USB序列線燒錄),下方是錯誤訊息(用最左邊的USB序列線燒錄):

      燒錄Espruino韌體

      這是燒錄成功之後,使用Espruino IDE連線的畫面:

      Espruino 1.9.2

      也許你需要外接USB轉序列線測試看看。

      thanks,
      jeffrey

  3. 老師您好, 非常喜歡你的書,
    我想詢問這本超圖解物聯網IoT實作入門大陸版跟台灣版有什麼差別嗎?
    因為我人目前在大陸, 在想要不要從台灣買還是直接在大陸買一本

    1. 謝謝你對本書感興趣,簡體中文版和繁體中文版的主要差別有兩個:

      1. 因為大陸內地無法使用Google服務,所以裡面的Google Mail單元改成QQ。
      2. 簡體中文版分成兩冊,第一冊已經出版,包含八個章節。第二冊還在編輯中。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *