超圖解 Python 物聯網實作入門:使用 ESP8266 與 MicroPython

超圖解Python物聯網實作入門

作者:趙英傑
出版社:旗標科技股份有限公司
出版日期:2018.5.1
頁數:640頁,雙色印刷(4頁全彩)。
定價:NT$699

  • 用最夯的Python語言學習程式設計
  • 用最超值的ESP8266控制板學物聯網
  • 用最易懂的超圖解學電子電路
  • 人人都能化身創客自造各種智慧應用

這是一本結合Python語言、電子電路、微電腦控制和物聯網的圖解入門書

本書的電子零件清單與配套的材料包,請參閱這一篇貼文

Python無疑是近年最受注目的通用型程式語言,它的語法簡單易學,不僅智慧型手機、個人電腦到網路雲端應用平台都支援Python程式,應用領域更遍及系統工具、網路程式、數值分析到人工智慧,而開放原始碼的MicroPython專案,則可在拇指大小的微電腦控制器上執行Python程式,讓你直接用Python控制硬體或開發物聯網專案,就連歐洲太空總署也將MicroPython應用在控制太空載具(詳見MicroPyhon官網論壇的“MicroPython and the European Space Agency”貼文)。

MicroPython支援多種32位元控制板,本書採用的是內建Wi-Fi無線網路、價格低廉的ESP8266系列控制板

打好基礎,超圖解電子電路觀念

本書的目標是讓沒有電子電路基礎,對微電腦、電子DIY 及物聯網有興趣的人士,也能輕鬆閱讀、認識Python語言,進而順利使用Python與ESP8266控制板完成互動應用。因此,實驗用到的電子、電路組裝和Python程式觀念,皆以手繪圖解的方式說明。例如,底下是二級體元件的概念圖解:

二極體元件圖解

為了方便讀者進行實驗,書本裡的電路都採用現成的模組,並搭配圖解說明,讓讀者不單只會照著接線,也能理解電子模組背後的原理,進而能靈活改造應用並實踐自己的想法。

類比搖桿模組圖解

WEMOS D1 mini (ESP8266) 控制板

ESP8266系列控制板種類很多,本書選用的是WEMOS D1 mini板

WEMOS D1 mini板

採用D1 mini板的主要原因:

  • 尺寸小、可插入麵包板。

WEMOS D1 mini與熱敏電阻麵包板電路

  • 有5V輸出和輸入,方便驅動各種週邊和感測器。

WEMOS d1 mini鋰電池擴展板

  • 有多種現成的「擴展板」模組可用,而且擴展板的接腳採用標準2.54mm孔距的排母或排針,不像某些廠商採用特殊規格的插座。

WEMOS d1 mini擴展板

擴展板雖然方便,但也有些缺點,像是配線彈性不足,有些擴展板佔用相同的微控器接腳,無法一同使用,有些則受限於擴展板的尺寸,像OLED顯示器和NeoPixel全彩LED,就採用解析度較低或者數量較少的元件,所以本書未全盤採用這些擴展板。

超圖解Python程式設計入門

為了清楚說明程式語法和執行結果,書本裡面的命令提示字元(終端機)視窗,也全都用手繪方式呈現:

命令提示字元(終端機)視窗

底下是用Python語言建立網路用戶端和伺服器程式的流程和相關指令對照說明:

網路用戶端和伺服器程式的流程

底下是在OLED螢幕呈現自訂符號的步驟和相關指令對照說明:

在OLED螢幕呈現自訂符號的步驟

本書也有說明實用的物件導向程式設計(OOP)手法,自行編寫伺服馬達(Servo)、超音波距離感測器、直流馬達控制板…等程式庫。

這是用自製的超音波距離感測器程式庫,達成測量物體距離的Python程式解說:

超音波距離感測器程式庫

書中也以範例實作說明物件導向程式設計中的「繼承」概念(註:實作內容與伺服馬達有關,不是拼裝獵雷鑑)。

物件導向程式設計之繼承

最後的「附錄B」則說明如何運用Windows 10的WSL(適用於Linux的Windows子系統),安裝Debian Linux並且配置交叉編譯器(cross-compiler),讓讀者了解如何自行編譯客製化的MicroPython韌體。

交叉編譯MicroPython

《超圖解Python物聯網實作入門:使用ESP8266, MicroPython》目錄

第1章 認識MicroPython與ESP8266控制板

  • 認識MicroPython、pyboard和ESP8266控制板
  • 認識程式語言
  • 在個人電腦上安裝Python 3.x版本
  • WEMOS D1 mini和NodeMCU控制板簡介
  • 下載與燒錄MicroPython韌體
  • 透過終端機操控MicroPython控制板
  • MicroPython和Arduino的程式開發流程比較
  • 動手做 1-1 用Python控制LED閃爍

第2章 認識電子零件與工具

  • 電壓、電流與接地
  • 電阻
  • 電容
  • 二極體
  • 發光二極體(LED)
  • 看懂電路圖
  • 微控制板和實驗電路的電源供應器
  • 電子工作必備的量測工具:萬用電錶
  • 動手做2-1 測量電阻或電容
  • 麵包板以及其他電子工具

第3章 MicroPython基本操作

  • MicroPython程式設計基礎
  • 使用迴圈執行重複性質的工作
  • 動手做 3-1 使用 while 執行已知次數或無限重複的工作
  • MicroPython的互動解譯器模式(REPL)操作說明
  • 上傳程式檔到ESP8266控制板
  • 負載的接法:源流與潛流
  • 動手做3-2 自行連接LED
  • 用歐姆定律計算出限流電阻值

第4章 開關電路

  • 認識開關
  • 開關電路與上/下拉電阻
  • 動手做4-1 用麵包板組裝開關電路
  • 改變程式流程的if條件式
  • 動手做4-2 LED切換開關
  • 動手做4-3 用RC電路消除開關彈跳訊號
  • 電容式觸控開關
  • 動手做4-4 使用觸控開關模組製作LED開關

第5章 Python程式設計基礎

  • 變數與資料類型
  • 建立自訂函式
  • 自訂程式庫與常數定義
  • 處理文字訊息:認識字元與字串資料類型
  • 列表(List)類型
  • 元組(Tuple)與其他循序型資料操作指令
  • 字典(Dictionary)類型
  • 認識數字系統

第6章 Wi-Fi 無線網路

  • 認識無線區域網路與Wi-Fi
  • 從網頁瀏覽器操作MicroPython控制板
  • 設定ESP8266以 STA(基站)模式連接無線網路
  • 修改boot.py檔、開機自動連線
  • 其他網路相關指令
  • bytes(位元組)類型與字元編碼

第7章 序列埠通信

  • 並列與序列通訊簡介
  • DHT11數位溫濕度感測器
  • 動手做7-1 製作數位溫濕度計
  • 認識UART序列埠
  • 建立UART序列通訊程式物件
  • 動手做7-2 連接GPS模組
  • 認識NMEA標準格式與獲取GPS的經緯度值

第8章 數位調節電壓強弱與全彩LED控制

  • 使用Timer(計時器)定時執行程式
  • 動手做8-1 使用定時器閃爍LED
  • 使用try…except捕捉例外狀況
  • 用匿名函式(lambda)改寫閃爍 LED 程式
  • 數位調節電壓變化
  • 動手做8-2 呼吸燈效果
  • 控制全彩 LED
  • 動手做8-3 控制RGB全彩LED
  • 旋轉編碼器
  • 動手做8-4 連接旋轉編碼器與ESP8266控制板
  • 動手做8-5 使用旋轉編碼器調整LED色彩
  • WS2812彩色LED模組與燈條
  • 動手做8-6 調控WS2812的色彩
  • 動手做8-7 跑馬燈效果

第9章 電晶體與蜂鳴器和直流馬達控制

  • 認識電晶體元件
  • 發音體和聲音
  • 動手做9-1 發出警報聲響
  • 動手做9-2 電流急急棒
  • 彈奏音樂
  • 動手做9-3 演奏一段瑪莉歐旋律
  • 認識直流馬達
  • 動手做9-4 電晶體馬達控制與調速器

第10章 控制伺服馬達

  • 認識伺服馬達
  • 動手做10-1 伺服馬達的控制程式
  • 自訂類別:遠離義大利麵條
  • 動手做10-2 編寫控制伺服馬達的自訂類別
  • 動手做10-3 吃錢幣存錢筒
  • 繼承:建立子類別
  • 動手做10-4 隨機轉動標靶

第11章 類比信號處理

  • 讀取類比值
  • 動手做11-1 讀取類比值並調控LED亮度
  • 認識光敏電阻與分壓電路
  • 動手做11-2 使用光敏電阻製作小夜燈
  • 壓力感測器與彎曲感測器
  • 熱敏電阻
  • 動手做11-3 使用熱敏電阻測量溫度
  • 動手做11-4 雷射槍玩具標靶
  • 電容式麥克風元件與聲音放大模組
  • 動手做11-5 拍手控制開關
  • 動手做11-6 拍手控制開關改良版

第12章 I2C介面:連接週邊與擴充ESP8266的類比輸入埠

  • 認識I2C介面
  • 類比轉數位(ADC)的專用IC介紹
  • 動手做12-1 連接PCF8591類比轉數位模組和I2C介面
  • 動手做12-2 自製二軸雲台(機械手臂)
  • 使用OLED顯示器顯示文字訊息
  • 動手做12-3 使用ssd1306程式庫操控OLED模組
  • 自訂顯示圖像
  • 動手做12-4 在OLED上顯示自訂符號
  • 使用LCD Assistant軟體轉換圖像
  • 動手做12-5 在OLED顯示動態溫濕度值

第13章 超音波距離感測器與I2C直流馬達驅動控制板實驗

  • 認識超音波
  • 動手做13-1 使用超音波感測器製作數位量尺
  • 建立超音波自訂類別與發出自訂例外錯誤
  • 動手做13-2 超音波距離控制燈光亮度
  • 控制馬達正反轉的H橋式馬達控制電路
  • WEMOS馬達擴展板
  • 動手做13-3 自動迴避障礙物的自走車
  • 用MicroPython改寫WEMOS原廠的Arduino馬達驅動程式庫
  • 位移和邏輯運算子

第14章 製作GPS軌跡記錄器

  • 讀取與設定本機時間
  • 動手做14-1 在OLED螢幕顯示GPS定位的台北時間
  • 使用os程式庫操作檔案
  • 建立與寫入檔案
  • 輪詢VS中斷
  • 動手做14-2 使用中斷要求開、關LED
  • 動手做14-3 建立儲存GPS紀錄的CSV格式檔案
  • 在谷歌地圖呈現GPS移動軌跡

第15章 SPI介面控制:LED矩陣和MicroSD記憶卡

  • LED矩陣元件
  • 認識SPI介面與MAX7219 IC
  • 動手做15-1 組裝LED矩陣電路
  • 顯示單一矩陣圖像
  • 動手做15-2 在 LED 矩陣上顯示音符圖像
  • 動手做15-3 在終端機顯示矩形排列的星號
  • 動手做15-4 LED矩陣動畫與多維序列資料程式設計
  • 動手做15-5 連接MicroSD/SD記憶卡

第16章 網路程式基礎入門

  • 認識網路與IP位址
  • 網域名稱、URL網址和傳輸協定
  • 網路的連線標準與封包
  • 使用Socket建立網路通訊程式
  • 動手做16-1 使用Socket建立一對一通訊程式
  • 認識網頁與HTML
  • 認識HTTP通訊協定
  • 動手做16-2 連結網站的用戶端程式
  • 認識HTTPS加密連線

第17章 物聯網應用初步

  • 建立網站
  • 動手做17-1 建立網站伺服器
  • 動手做17-2 動態顯示溫濕度資料
  • 動手做17-3 讀取並顯示HTML網頁和圖像
  • 認識 ThingSpeak物聯網雲端平台
  • 透過查詢字串傳遞資料
  • 動手做17-4 用urequest程式庫上傳資料到ThingSpeak平台
  • 使用POST方法傳遞資料
  • 解析查詢字串
  • 動手做17-5 搭配互動網頁介面的燈光調控器
  • 控制家電開關
  • 動手做17-6 使用繼電器控制家電開關

第18章 物聯網應用

  • 網路應用程式訊息交換格式:XML與JSON
  • 動手做 18-1 讀取JSON格式的世界各地天氣資料
  • 動手做 18-2 在OLED螢幕顯示氣象資訊
  • 認識MQTT
  • 動手做18-3 使用ESP8266發布資料到ThingSpeak MQTT伺服器
  • 動手做18-4 訂閱ThingSpeak MQTT訊息
  • ESP8266微控器的即時鐘(RTC)
  • 動手做18-5 透過網際網路更新時間
  • 超低功耗的深度睡眠模式
  • 動手做18-6 進入深度睡眠與喚醒微控器
  • 動手做18-7 自動睡眠、喚醒並上傳資料到ThingSpeak平台

附錄A uPyCraft與Tera Term使用說明

  • uPyCraft整合開發工具使用說明
  • 使用Tera Term終端機軟體

附錄B 編譯客製化的MicroPython韌體

  • 在Windows 10系統中安裝與執行Linux工具軟體
  • 交叉編譯MicroPython韌體
  • 從Linux環境複製檔案到Windows環境
  • 建立客製化的MicroPython韌體

內容勘誤

第3章 MicroPython基本操作

3-20頁,上方程式編輯器裡的while i in range(3):敘述,正確是for i in range(3):

第4章 開關電路

4-14頁,底下程式第一行的time=5,正確是time=15

第5章 Python程式設計基礎

5-19頁,中間程式第一行id=12,正確是num=12

第7章 序列埠通信

7-18頁,下方團片中的GPIO11,正確是GPIO1

GPIO1接線

7-28頁,最後一段的第13章,正確是第14章

7-48頁以及14-5頁,GPS日期格式的圖說中,日、月數字顛倒。

GPS日期格式

第8章 數位調節電壓強弱與全彩LED控制

8-4頁,底下的ujon程式碼,D1 = ”’,正確是 data = ”’

8-28頁,實驗程式第一行,from machine import Pin,正確是from machine import Pin, PWM

第9章 電晶體與蜂鳴器和直流馬達控制

9-22頁,TIP120馬達驅動電路,TIP120的E(射極)要接地,馬達一端要接正電源。

TPI120電晶體電路

9-23頁,中間內文(參閱第12章介紹),正確是第13章

第10章 控制伺服馬達

10-2頁,第二段文字中的參閱第10章,正確是第8章

第11章 類比信號處理

11-29頁,「增加拍手次數」註解底下的 print(‘claps: ‘ + claps),正確是print(‘claps: ‘ + str(claps))

第12章 I2C介面:連接週邊與擴充ESP8266的類比輸入埠

12-25頁,最下方程式碼當中的 oled.framebuf.blit,正確是oled.blit

12-30頁,程式碼當中的 self.oled.framebuf.blit,正確是self.oled.blit

第16章 網路程式基礎入門

16-32頁,程式碼當中的 wlan = network.WLAN(network.waln),正確是wlan = network.WLAN(network.STA_IF)

第17章 物聯網應用初步

17-7頁,程式碼當中的 client.send(httpHeader.format(temp, humid)),正確是client.send(httpHeader.format(temp=temp, humid=humid))

第18章 物聯網應用

18-10頁,「實驗說明」中的動手做11-3,正確是12-3

18-11頁,內文中間的第11章,正確是第12章

18-14頁,程式碼第2行的 oled.framebuf.blit(fb, 0, 15),正確是oled.blit(fb, 0, 15)

延伸閱讀

Posts created 469

443 thoughts on “超圖解 Python 物聯網實作入門:使用 ESP8266 與 MicroPython

  1. 趙老師您好:
    想請教一下, 我用esp8266 d1mini 連接 HC05 藍牙模組, 將HC05的txd接到8266的 rx, 中間有照書中7-20頁示範由8266的rx接一個二極體到hc05的txd
    藍牙與手機連線配對後, 用手機的 app 傳送單一字元, 例如:A 給 esp8266, 但esp8266 一直都接收不到任何東西
    主要的程式參照 7-21頁上方的示範, 將程式利用thonny 編輯儲存成test.py 如下, 然後在webrepl執行 import test:
    from machine import UART
    com=UART(0, 9600)
    com=init(9600)
    while True:
    data=com.read()
    if data:
    print(data)

    1. 老師您好:我剛剛試了拿掉二極體
      然後在webREPL執行 import TEST
      其中 TEST.py程式的內容如下:
      from machine import UART
      import time
      com=UART(0, 9600)
      com.init(9600)
      while True:
      data=com.read()
      if data:
      print(data)
      time.sleep_ms(20)
      執行後,必須要按下CTRL+C 跳出程式後
      才會看到我傳入的字元,沒有辦法在程式執行中印出我傳入的字元
      不過至少確定電路接線是沒問題,
      不知道程式的問題是出在哪裡,為什麼要按下CTRL+C後才看的到??

  2. adc_feedback=b”’\
    HTTP/1.1 200 OK

    ADC={val}
    ”’.format(val=data)

    data=adc.read()
    client.send(adc_feedback)
    老師您好, 我想請教一下, 我想用ESP8266 D1 mini 將其ADC的資料用 WiFi 傳送到筆電,
    如上面的程式範例,程式一直跑出我的data變數在adc_feedback資料裡面沒有定義
    以上是我的部份程式,
    請教一下是什麼原因, 以及我該如何處理。
    謝謝老師

    1. 因為data直到這個敘述執行才被宣告:

      data=adc.read()

      所以程式碼要改成:

      data=adc.read()
      
      adc_feedback=b"'\
      HTTP/1.1 200 OK
      
      ADC={val}
      '".format(val=data)
      
      client.send(adc_feedback)
      
  3. 老師您好,想請問6-8頁啟用webrepl遇到的問題
    import webrepl_setup
    WebREPL daemon auto-start status: enabled

    Would you like to (E)nable or (D)isable it running on boot?
    (Empty line to quit)
    e
    Would you like to change WebREPL password? (y/n) n
    No further action required
    請問No further action required要怎麼解決

    1. “No further action required” 代表無需執行其他操作。
      請關閉PuTTY,按一下開發板的Reset鍵,
      等一會兒讓它連上網路。
      再開啟WebREPL的操作頁面,從瀏覽器連線開發板。

  4. 老師您好 關於 client.connect() 因為如果伺服器異常或關閉 我的ESP32會報錯
    造成我 需要等待伺服器正常 然後還要把ESP32關電在送電後才可以繼續使用
    有辦法提前知道伺服器正常嗎?
    我想要讓ESP32等待 等待到伺服器正常 我在跟伺服器連線

    程式說明請參閱18-22頁
    client.connect()
    client.publish(config[‘topic’], data.encode())
    time.sleep(2)
    client.disconnect()

    1. 請參閱16-25頁的HTTP狀態碼,以及17-25頁的urequests物件的status_code屬性,可以透過HTTP回應碼得知資料是否請求成功。類似這樣:

      import urequests as req
      
      # 嘗試發出連線請求
      try:
          r = req.get("你的ESP32網頁位址")
      
          if r.status_code == 200:
              print("OK")  # 網頁讀取OK!
          else:
              print("NOT OK")  # 伺服器回應非200狀態碼
          
      except:
          print("error!")  # 無法連線
      
  5. 老師您好! 我按書本 “超圖解Python物聯網實作入門” 1-5 下載與燒錄 MicroPython 韌體, 之後按1.6 用Putty 連接控制板, 但只得黑屏, 沒有訊息顯示, 請問可能的問題出在那裡? 我要留意甚麼設定? 謝謝!

  6. 趙老師, 您好!
    在18-20 說:「使用MQTT項協定來訂閱訊息之前, 需要先取得MQTT API Key」。在thingSpeak – My Profile 下找不到 MQTT API Key 的選項, 是否 thingSpeak 的設定有更改? 程式碼是否要更改? 謝謝!

  7. 老師您好 我參考書上gps的範例 但我用的是有整個模塊(有wifi的)esp8266 gps則一樣 接線則rx tx 互接 vin 5v gnd gnd 然後我用裝micropython延伸模組的vscode寫 程式為第一個範例 執行後無反應 (>>>後空白)請問哪裡可能有問題?

    1. 請檢察接線:微控器的RX接GPS的TX,反之亦然。
      有些GPS的電源可接3.3V,請接3.3V試試。
      如果GPS接3.3V,二極體可省略。

  8. 老師您好 我是3/11問問題的那位 這個問題在參考(使用ESP32控制板(三),https://swf.com.tw/?p=1338)這篇後已解決,目前我想把接收到的資料顯示到nodered的worldmap上,那是否能用esp32在連網後用mqtt連接nodered將gps的資料顯示出來呢,目前還是不太確定這個流程是否可行

發佈留言

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

Related Posts

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

Back To Top