《超圖解ESP32深度實作》新書預告

本書的正式章節內容以及索引(PDF檔)下載,請參閱《超圖解ESP32深度實作》這篇貼文。

ESP32是樂鑫信息科技(上海,以下簡稱樂鑫公司)研發,結合Wi-Fi和藍牙的32位元系統單晶片(SoC)。ESP32的性能表現優異,有人用它製作出80年代的遊戲機和電腦的模擬器,例如,任職樂鑫公司的Jeroen Domburg用ESP32製作出超微型的Mac Plus(80年代的Mac電腦)。ESP 8BIT開源專案能在ESP32執行任天堂紅白機(NES)、SEGA(世嘉)Master System(SMS)和Game Gear掌上型遊戲機以及Atari 5200等機種的軟體,而且還支援藍牙控制器,可透過AV端子連接電視機。

ESP32晶片

筆者假設讀者已閱讀過《超圖解Arduino互動設計入門》第三或四版,所以ESP32這本書的內容不包含基本電子學(像電阻分壓電路、電晶體開關電路、運算放大器的電路原理分析…等),也不教導Arduino程式入門(像for迴圈、陣列、指標…等),這些基礎都歸納在《超圖解Arduino互動設計入門》。

在微電腦控制或者電子Maker入門領域,我認為Arduino Uno板仍是首選,因為它有充沛的學習資源和軟硬體範例,可以替學習者打下穩固的基礎,對了…Arduino Uno板還有免費的線上模擬器

有些時候,人們會把微電腦控制板(如:Arduino系列開發板)和執行電腦作業系統的微電腦板(如:執行Linux系統的樹莓派和NVIDIA Jetson)相提並論,但它們的應用領域截然不同。

Arduino系列開發板通常於週邊設備、低功耗、即時監控等的密集i/O任務場合,像是飲水機恆溫監控、3D印表機、桌上型CNC數位加工機等的馬達控制,8位元微控器通常足以勝任這些任務,而且成本、尺寸和電力消耗也比較小。

執行作業系統的微電腦板則偏屬CPU密集型的應用,也就是有大量運算和記憶體空間需求的任務,像多媒體播放器、遊戲機、視覺辨識、資料庫…等等,所以它們往往搭載32甚至64位元多核心處理器,以及數GB容量的記憶體。

超圖解ESP32深度實作

回到新書的話題,《超圖解Arduino互動設計入門》第四版,第19章採用ESP8266晶片製作物聯網應用,之所以未採用ESP32,主因是ESP32的Arduino程式的相容度不如ESP8266,像PWM輸出還有跟PWM相關的Servo伺服馬達和tone()音調輸出,它們的指令操作和典型的Arduino不一樣。這意味著某些Arduino範例和程式庫無法直接在ESP32上執行。

PWM輸出

相對地,ESP32的獨特硬體架構也需要專門的程式庫和指令才能釋放它的威力,例如,ESP32內建藍牙4.2,向下支援典型(2.x版)的藍牙以及新的BLE低功耗協定、內建DAC(數位類比轉換器)和I2S(序列音訊介面),可輸出高品質數位音效。

I2S音訊輸出

樂鑫公司官方提供的ESP32開發工具叫做ESP-IDF,IDF是IoT Development Framework的簡稱,代表「物聯網開發框架」。ESP-IDF採用標準C/C++語言,程式架構以及控制晶片的指令都跟Arduino語言不同。

為了支援Arduino語法,樂鑫公司維護了一個“Arduino core for the ESP32”(ESP32的Arduino核心程式元件)開源專案,也編寫了ESP32版的Arduino開發板管理員和程式庫,好讓廣大的Arduino開發者能使用熟悉的Arduino IDE和程式庫來開發ESP32專案。

更有意思的是,ESP-IDF開發工具引入一個叫做FreeRTOS的系統,所以ESP32 Arduino程式其實是運作在FreeRTOS上的一個應用程序。

ESP-IDF FreeRTOS

Free代表免費和自由、RTOS是real-time operating system(即時作業系統)的縮寫,「即時」代表程式能在短時間內(通常以毫秒為單位)回應或處理某個事件,就像微控器偵測到某個腳位輸入訊號發生變化,就立即執行對應的程式。

因此,ESP32這本書的重點主題包括:

  • Wi-Fi無線物聯網應用
  • 低功耗藍牙(BLE)
  • I2S序列音效傳輸介面
  • FreeRTOS即時作業系統
  • HTTPS安全加密連線

另外,微控器通常是整個物聯網應用當中的一個環節,以「透過網頁瀏覽器控制某個裝置」的應用來說,呈現在瀏覽器的內容是採用HTML和JavaScript語言開發的互動網頁,和微控器的Arduino程式語言完全不同,所以這本書也不只探討Arduino程式語言。

互動圖表網頁

開發微電腦應用程式,偶爾會用到一些小工具程式,例如,呈現在OLED顯示器上的中英文字體與影像,都必須先經過「轉檔」才能嵌入Arduino程式碼,除了使用現成的工具軟體,筆者也示範採用廣受歡迎的Python語言編寫批次轉換字體和影像檔的工具程式。

Python字體轉換工具

本書附錄A和附錄B也分別示範在電腦上,使用Python和JavaScript程式連接ESP32低功耗藍牙裝置的程式;本書提及的Python程式屬於進階應用,筆者假設讀者閱讀過《超圖解Python程式設計入門》,具備Python語言的操作檔案目錄、解析命令行參數、轉換影像、執行緒…等相關概念,但仍會在書中以圖解說明程式運作原理。

超圖解ESP32新書預計三月下旬上市,目前已確定的章節如下:

第1章 32位元雙核心ESP32晶片以及軟體開發工具
介紹ESP32晶片的架構和官方開發工具

開發ESP32程式

第2章 ESP32開發板與Arduino程式開發應用
介紹幾款知名的開發板、接腳和Arduino開發環境、ESP32 Arduino和典型的Arduino程式的不同點,以及ESP32晶片的特色功能,例如霍爾磁力感測器。

霍爾磁力感測器

第3章 物件導向程式設計與Arduino程式庫開發
C++物件導向程式設計入門,編寫一個偵測按鍵被按一下(click)、長按、放開…等事件的程式庫。

C++物件導向程式設計入門

第4章 中斷處理以及ESP32記憶體配置
ESP32的中斷處理程式涉及CPU的快取(cache,預先提取將要執行的指令)機制,還要避免雙核心處理器同時存取相同記憶體區域或接腳,所以本章也將說明下列主題:

  • 認識執行緒(thread)與分時多工
  • 解析ESP32當機時拋出的錯誤訊息
  • 認識ESP32的主記憶體分區配置
  • 認識堆疊(stack)和堆積(heap)記憶體區域
堆疊(stack)和堆積(heap)記憶體

第5章 OLED顯示器以及Python中文轉換工具程式設計
示範連接「圖像式」顯示器及其程式控制方式,OLED顯示器沒有內建字體,需要採用顯示器程式庫提供的字體,或者我們自訂的字體。因此本章一半的篇幅在講解如何選用以及轉換字體格式,最後使用Python程式編寫一個自動化字體轉換程式,方便我們自訂這個顯示器所呈現的文字。

OLED顯示器

第6章 Wi-Fi無線物聯網操控裝置
支援Wi-Fi聯網是ESP32晶片的特色之一,本章將介紹ESP32晶片的Wi-Fi規格、聯網模式以及下列主題:

  • 連接Wi-Fi無線網路、自動與手動設定IP及MAC位址
  • 建立HTTP伺服器,提供網頁服務以及處理GET或POST請求。
  • 認識快閃記憶體的SPIFFS檔案系統,在其中儲存網頁資料。
  • 建立非同步網站伺服器
  • 使用JavaScript(jQuery程式庫)建立動態網頁擷取ESP32的資料
  • 使用JavaScript建立動態燈光控制介面
ESP32動態網頁

第7章 擷取網路資料以及OLED圖像轉換工具
把ESP32當作網路用戶端工具,擷取JSON格式資料並以圖文呈現在OLED顯示器;本章也將說明Python轉換圖檔工具的寫法。

JSON格式資料

第8章 物聯網動態資料圖表網頁
本章將使用ESP32蒐集多個類比感測資料,匯聚成動態網頁圖表。

動態網頁圖表

第9章 使用WebSocket即時連線監控聯網裝置
WebSocket是一種讓HTTP用戶端與伺服器保持連線、雙方可即時收發訊息的通訊協定,網頁即時通訊和多人連線遊戲等應用程式大都採用這種通訊協定,本章將介紹WebSocket的概念和優勢,並採用它即時更新網頁上的監測資料以及傳遞使用者的調控值。

WebSocket概念

第10章 RTC即時鐘以及網路和GPS精確對時
ESP32晶片內部具有即時鐘(Real Time Clock,簡稱RTC),它的作用像附帶月曆和鬧鈴功能的時鐘。就像新買的時鐘,ESP32每次通電之後都需要先設定正確的時間,本章將透過網路和GPS衛星定位接收器來設置ESP32的即時鐘。

即時鐘與時間伺服器

第11章 ESP32的睡眠模式與喚醒方法
本章將介紹ESP32晶片的睡眠模式、開發板的耗電量,以及這些相關主題:

  • 啟用深度睡眠模式以及喚醒ESP32的程式
  • 透過觸控或者接腳的電位變化喚醒微控器
  • 搭配網路對時,在指定時間喚醒ESP32並上傳感測資料到雲端平台。
  • 在自訂類別程式中引入「回呼」函式
  • 在深度睡眠中透過ULP超低功耗處理器維持接腳的狀態
喚醒ESP32

第12章 SPIFFS檔案系統與MicroSD記憶卡
SPIFFS.h檔案系統程式庫相當於快閃記憶體的檔案總管,提供程式建立、刪除、讀寫檔案,以及重新命名、格式化…等操作功能。本單元將深入介紹SPIFFS檔案系統,並利用它來儲存裝置的狀態資料。

SPIFFS檔案系統

第13章 設置區域網路域名、動態顯示QR碼以及OTA更新韌體
替ESP32設定專屬本機域名和服務回應訊息、在OLED螢幕顯示本機IP位址和QR碼、透過OTA(網路下載)更新ESP32的韌體。

QR碼

第14章 網路收音機與音樂播放器
本章首先將介紹I2S與DAC,接著採用程式庫製作:

  • 網路收音機∕Podcast(播客)播放器
  • 氣溫語音播報服務

為了深入瞭解I2S介面,本章後半段將自行建立一個播放器,從這個例子可學到下列主題:

  • 設置與驅動I2S介面
  • WAVE聲音檔的結構以及解析程式的寫法
  • 在Arduino程式裡面嵌入2進位檔
  • 認識DMA(直接記憶體存取)功能
DMA(直接記憶體存取)功能

第15章 典型藍牙以及BLE藍牙應用實作
ESP32晶片內建的藍牙支援典型與BLE這兩個藍牙標準,但它們的程式寫法南轅北轍。本章的範例囊括典型藍牙與BLE藍牙應用實做以及下列內容:

  • 製作高音質藍牙立體聲接收器
  • 使用ESP32內部的DAC(數位類比轉換器)輸出真實的類比訊號以及聲音
  • 製作跟典型藍牙2.1 SPP序列通訊協定相容的無線通訊介面,並且透過藍牙無線連接兩個ESP32開發板。
  • 製作ESP32BLE藍牙序列通訊裝置
  • 提供BLE藍牙顯示剩餘電量功能
  • 偵測負載的消耗電流
BLE GATT

第16章 BLE藍牙人機輸入裝置應用實作
人機介面裝置(Human Interface Devices,簡稱HID)泛指讓人類操控電腦的裝置,如鍵盤和滑鼠。HID規範是USB介面發明的產物,微軟從Windows 95系統開始支援並沿用至今,藍牙也將它承襲下來。

本章將製作三個BLE藍牙人機輸入裝置:

  • 多媒體旋鈕:控制音量、播放、暫停或者其他自訂功能,在智慧型手機上也可當作無線快門。
  • 整合無線鍵盤和滑鼠的多媒體控制器
  • 電腦桌面自動切換器,讓你的工作、娛樂無縫接軌、恣意穿梭。

後半段說明藍牙鍵盤滑鼠程式庫當中的一些核心概念,有助於讀者了解HID裝置的運作。

整合無線鍵盤和滑鼠的多媒體控制器

第17章 FreeRTOS即時系統核心入門
本章將介紹FreeRTOS程式的基本架構,並使用它建立簡單的、同時執行多任務的程式。閱讀本章之後,讀者將能理解:

  • FreeRTOS分時多工的程式架構,以及對比典型Arduino分時多工的程式寫法。
  • 什麼叫做任務,如何安排執行各個任務,又如何讓出資源給其他任務。
  • 如何決定該分配多少記憶體空間給任務
  • FreeRTOS識別字的命名規則以及FreeRTOS的基本資料類型
  • FreeRTOS的時間單位,以及vTaskDelay()和delay()的不同。
  • 看門狗的作用以及如何避免引發看門狗計時器錯誤
FreeRTOS

第18章 FreeRTOS即時系統核心應用
本章將繼續探討FreeRTOS,介紹下列主題:

  • 瞭解ESP32 Arduino程式的結構
  • 讓FreeRTOS任務在指定的處理器核心運作
  • 使用佇列(queue)在任務之間傳遞訊息
  • 使用熱敏電阻檢測溫度
  • 在佇列中傳遞結構類型資料
  • 使用旗號(Semaphore)來確保任務或資源能完成工作
  • 從中斷處理常式觸發執行FreeRTOS任務
  • 搭配中斷處理常式排除開關彈跳雜訊
quese

第19章 採用HTTPS加密連線的前端與Web伺服器
本章將介紹安全加密通訊的原理以及下列主題:

  • 認識具備保密、確保訊息完整以及驗證身份功能的傳輸協定
  • 認識對稱式加密與非對稱式加密,以及常見的演算法。
  • 匯出與自建安全加密通訊所需的數位憑證
  • 從ESP32以HTTPS加密連線存取伺服器資料
  • 在ESP32上建立HTTPS加密連線的伺服器
SSL TSL加密連線
Posts created 469

23 thoughts on “《超圖解ESP32深度實作》新書預告

  1. 老師好,Arduino的參考書買了多本但是較特殊語法或是中斷等在之前買的參考書都沒有篇章說明,直到最近買了老師著作—超圖解Arduino互動設計入門 第四版才把一些困惑解除,去年也開始玩 ESP32,也有買參考書,由於ESP32多了無線傳輸介面,不過ESP32參考書中對於無線傳輸部分並不是相當豐富,期待老師ESP32的新書發表,我會馬上買一本來做為主要參考書。

    1. errr….我只負責產出內容,日後會列舉實驗材料清單,或許會有供應商提供材料包,謝謝!

      thanks,
      jeffrey

  2. 趙老師好,
    希望也能出一版,採用micropython為主題,控制ESP32的專書。
    控制相關周邊GPIO、PWM、BLE、WiFi、Web遠端控制等應用。
    進而控制UART、SPI、I2C儀器等。

    期待老師的大作,

  3. 抱歉 細看完後知道是三月下旬出版
    另個問題是本書”大部份”是用Arduino還是python編寫 謝謝

    1. 說大失太沈重,我只是文字工作者。ESP32採用Arduino和C++語言開發,Python用於開發小工具程式(如:字體和影像轉換),JavaScript則用在互動網頁(如:動態圖表和藍牙BLE控制),絕大部分內容都是Arduino相關,謝謝!

      thanks,
      jeffrey

    1. 抱歉,因为新增一个Mesh(网状)网络章节,所以昨天下午才校阅完毕,傍晚送印刷厂。印刷装订估计需要一周,物流分送到各地的书店,估计也要一周。所以预计4月16日上架。预祝五一长假愉快!

      thanks,
      jeffrey

  4. 赵老师,您好!我是大陆的读者,在BING上查找资料看到您的博客,想要购买的您的书籍,请问在大陆网站上是否能进行购买。感谢!

  5. 老師您好
    我在執行10-12頁,我想要將印出來的時間放到字串裡面,請問要怎麼寫呢?
    例如:我想要讓他傳回來的是時跟分,這樣我要怎麼把這兩個數字存到字串裡面呢!

    1. 請參閱10-5頁的分解時間tm結構體成員、10-9頁的顯示「星期幾」的例子,提取「時」和「分」整數值的敘述像這樣:

      localtm->tm_hour
      localtm->tm_min

      使用第2章介紹的string類別整合成字串的例子:

      int hr = localtm->tm_hour; // 時
      int min = localtm->tm_min; // 分
      std::string s; // 宣告字串
      // 透過to_string()把整數轉成字串
      s = “h: ” + std::to_string(hr) + “, m: ” + std::to_string(min);
      Serial.println(s.c_str());

  6. 老師您好
    我有把程式試著編譯,但顯示 ‘localtm’ was not declared in this scope
    我不太確定要把您上面的程式碼放到哪個位置才是正確定的,我目前只有使用
    int hr = localtm->tm_hour; // 時
    int min = localtm->tm_min; // 分
    這兩段程式碼,以及列印hr跟min(變數好像不能設min)
    想請問老師我還缺少甚麼沒有打到嗎?
    程式的部分都是照著10-14頁打的,再麻煩老師指導指導,謝謝老師,真的很喜歡這本書!!

    1. “‘localtm’ was not declared in this scope”的錯誤訊息代表「localtm變數未定義」
      這個變數名稱我是沿用10-9和10-11頁的名字

      localtm是指標,所以存取結構成員時,透過->寫成(參閱10-3頁說明):

      localtm->tm_hour
      localtm->tm_min

      10-14頁定義的「分解時間」結構變數叫做now,它不是指標,存取成員的敘述寫成(參閱10-2頁):

      int hr = now.tm_hour; // 時
      int min = now.tm_min; // 分

      所以10-14頁的loop()函式碼改成:

      void loop() {
        struct tm now;                  // 宣告「分解時間」結構變數
        if(!getLocalTime(&now)){          // 取得本地時間
          Serial.println("無法取得時間~");
          return;
        }
        
        int hr = now.tm_hour; // 時
        int min = now.tm_min; // 分
        std::string s; // 宣告字串
        // 透過to_string()把整數轉成字串
        s = "h: " + std::to_string(hr) + ", m: " + std::to_string(min);
        Serial.println(s.c_str());
        Serial.println(&now, "%Y/%m/%d %H:%M:%S"); // 輸出格式化時間字串
        delay(1000);  // 等下一秒再讀取
      }
      
  7. 使用書中的範例程式,有些可正常編譯並燒錄,但很多程式出現諸如:
    ‘ledcSetup’ was not declared in this scope
    除了’ledcSetup’ 還有其他許多函式, 請問如何解決? 謝謝!
    控制器版本:ESP32-WROOM-32E,ESP32-S3
    Arduino IDE 2.2.1

    1. 開發板的相容性有兩個層面:微控器和開發環境。

      撰寫本書時,筆者使用的開發板是WEMOS LOLIN32,採用的微控器模組是ESP32(為了方便識別,底下稱它「典型ESP32」),開發環境是1.0.5版。

      後來新推出的晶片,例如S和C系列的ESP32-S3和ESP32-C3,內部結構和功能都不太一樣。

      典型ESP32支援典型藍牙和低功耗BLE,S和C系列僅支援BLE,所以書本第15章的「典型藍牙和低功耗BLE」部分單元就無法在S和C系列編譯執行。此外,僅ESP32內建霍爾感測器,所以第2章的部分單元也僅適用於典型ESP32。

      ESP32-S3微控器內建USB介面,可用於序列通訊、人機介面、除錯…,在下一本Arduino應用實作書籍中,至少五個章節使用到ESP32-S3,但有部分章節仍採用典型ESP32。

      樂鑫的ESP32 Arduino開發環境的新增功能和錯誤修正等資訊,列舉在這個發行記事:
      https://github.com/espressif/arduino-esp32/releases

      1.x版基於ESP-IDF 3.3.x版,不支援S和C系列ESP32,例如;ESP32-S3和ESP32-C3。
      2.x版基於ESP-IDF 4.4.x版,支援S和C系列ESP32。

      開發環境大改版(從1.x到2.x),程式語法也可能改動,例如,設定類比輸入位元深度的這個函式:

      analogSetWidth(位元)

      在2.x版僅限用於典型ESP32,ESP32-S3和ESP32-C3等微控器,要改用底下這個函式,功能一樣,但函式名字變了:

      analogReadResolution(位元)

      至於控制類比輸出的”ledc”名稱開頭的函式,從定義這些函式原型的esp32-hal-ledc.h標頭檔看來,並沒有改變,原始碼網址:
      https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-ledc.h

      請至少採用典型ESP32開發板(如:WEMOS LOLIN32)實作本書內容,謝謝您!

發佈留言

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

Related Posts

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

Back To Top