超圖解 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 473

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

  1. 老師您好~ 想請問您第13-28頁 自走車硬體與軟體 下面5V電源的板子 叫什摸名子~?

  2. 老師您好 第12-17頁
    Traceback (most recent call last):
    File “”, line 15, in
    OSError: [Errno 110] ETIMEDOUT
    請問是什摸問題 謝謝您~

    1. 請檢查I2C接線是否正確,也可能是導線有問題,建議換一條試試。

      thanks,
      jeffrey

  3. 老師您好 第12-17頁
    我PUTTY上面的值都是b’\x00,轉動搖桿都沒有任何變化,想請問您是什摸問題,謝謝您~

    1. 請問搖桿模組有接3.3V嗎?取下PCF8591模組的AN2跳帽之前,轉動模組上的半固定可變電阻,數值有變化嗎?

      thanks,
      jeffrey

  4. 老師:
    我跟足了書中指示把D1 MINI 與家中WIFI路由器連接成基地台(已檢查控制板已拿到IP 地址). 我用流動裝置可接達MINI站台, 但D1 MINI 卻不能連上互聯網, 到底有何原因? 有勞老師告知.
    (P.S. 其他流動裝置皆可透過家中路由器上網的)

    1. 「不能連上互聯網」這句話有點含糊,請問執行16-30頁的socket程式碼,可以取得遠端網站的HTML內容嗎?

      thanks,
      jeffrey

    2. 即是說, 我的手提電腦不能透過D1 MINI站台上網, 但卻可內聯連接在MICROPYTHON中打指令. 我希望正如在書中所說般, 當 WEBREPL ESP8266同時, 電腦亦可上網 . 請問明白我的意思嗎 ?

      相關書頁 : P.6-12至6-17

    3. 了解,請問上傳boot.py並重新啟動之後,終端機有顯示什麼錯誤訊息嗎?
      下載這個動態IP的boot.py檔,修改其中的網路SSID和密碼之後,再上傳到D1 mini控制板。
      你可能需要重新執行import webrepl_setup,並重置控制板。

      thanks,
      jeffrey

    4. 並無任何錯誤信息, 所有結果與你書中所描述的相同.

    5. 沒有錯誤訊息卻不能連網啊…執行16-30頁的socket程式碼,可以取得遠端網站的HTML內容嗎?

      請確認:
      1. 你的電腦和D1 mini板位於相同網域,亦即,IP的前三碼都一樣,例如:192.168.1.x
      2. 使用chrome瀏覽器開啟webrepl.html
      3. ws網址是你的D1 mini板的IP位址

      thanks,
      jeffrey

    6. 真怪 . 用SOCKET又可讀到HTML . 哪是否意味我塊板可以傳送及接收互聯網資料 ?
      另外, 我發現打 import http_basic.py 後, 第一次能看到網頁內容. 但連續再打一次至多次, 卻沒有任何網頁內容顯示給我.
      我要再次插板或斷線登入才成功執行程式. 但要再顯示HTML , 則又要再斷線及登入才成功. 請問這是正常現象嗎 ?有何解決辦法 ? 還是我用錯執行方法 ? 敬侯老師回覆

    7. 嗯,你的D1 mini板並沒有問題,建議重新燒錄一次韌體看看,記得要選擇「清除」韌體的選項。

      早期的ESP8266板會有Wi-Fi連線不穩定的情況,現在比較沒聽說有連線方面的問題。

      import http_basic

      只有第一次有效,是正常的,除非你按下Ctrl+D重置再執行一次。

      如果要重複運行相同的程序,你要將程式碼寫成一個函式。簡單的例子如5-11的greet()。

      thanks,
      jeffrey

  5. 老師您好:
    我put 一個程式碼到 wemos d1 mini板子上後,要怎摸操作才能讓我接上外部電源時,只重複執行這個程式? 謝謝老師

    1. 請把要開機自動執行的檔案命名成main.py,如1-32頁第二段所示,謝謝!

      thanks,
      jeffrey

  6. 老師您好:

    Putty 連上 WEMOS D1 mini 後,視窗會出現亂碼且像跑馬燈一樣跑,請問是那裡設定出現問題。

    1. 請依照第一章的說明,燒錄MicroPython韌體,燒錄之前,請先執行ERASE(清除)。

      thanks,
      jeffrey

  7. 請教一下,我買了你這本書,也查了很多的網站
    但micropython好像都是透過終端機的方式去控制
    就是查不到micropython怎樣跟其它的程式語言來進行溝通,
    例如,我想要用python透過serial 去跟燒錄有micropython的D1 mini溝通
    想要它將某個感應器的值回傳回來 這個要怎麼作呢

  8. 老師您好,我用兩個超音波感測器,一個伺服馬達(電源都接板子5V),板子接外部電源5v/2.1A下去執行,一開始都可以正常執行,但重複開機執行幾次後,MINI版子卻突然燒掉了,想請問您這是什摸問題~??

    1. 你接的週邊耗電流都不大,加上板子本身有個自恢復保險絲,如果是電源過載的話,放一陣子它就能恢復運作;你也可以嘗試不透過microUSB供電,從5V接腳供電試試看。
      請問你的超音波感測器輸出腳有串接一個約2.2K的電阻嗎?如果不是直接輸入高於3.3V的訊號,微控器本體應該沒有故障。

      thanks,
      jeffrey

    2. 老師您好: 我板子到超音波皆有裝2.2K電阻,我剛剛把昨天那塊板子拿出來嘗試連接電腦一樣沒有反應,是要靜止較長的時間嗎? 有什摸辦法可以分辨是自恢復保險絲跳開,還是MINI板子燒掉? 謝謝老師您的回答。

    3. 自恢復保險絲只要經過短暫時間就復原了;請直接將5V電源,接板子的5V和GND供電(請參閱2-25頁),D1 mini的LED會閃爍一下,Wi-Fi也會有信號。如果LED沒有閃,那應該是本體故障了。

      thanks,
      jeffrey

  9. 看完老師的回答後,我還有個疑問,
    有沒有辦法用電腦的python透過pyserial,直接傳送
    import machine
    led = machine.Pin(15, machine.Pin.OUT)
    led.high()
    給有micropython的板子,進而控制它呢
    其實我是想要取代終端機,還請老師解惑一下

    1. Python程式預設的執行介面就是終端機,無論是要透過電腦接收還是發送資料,你還是得先啟動電腦上的程式。你也可以在作業系統上設定讓Python程式在開機後自動執行。

      「序列通訊」只是傳輸資料的一個介面,收到的資料不一定要呈現在終端機,例如,你可以直接將它寫入資料庫,或者寫個視窗介面來操控資料。

      thanks,
      jeffrey

  10. 想請問大家兩個可能笨笨的問題,
    1. 依照書中所說, Micropython是不是只能在某些微處理器上運行呢?而此微處理器中沒有OS只有Python 的直譯器, 運行存在Falsh中的Micropython指令, 請問是這樣嗎?
    2. 請問Micyro Python 能不能在Linux 的環境上跑呢?
    非常感謝大家

    1. 對,只能在特定的處理器上運作。其實這很正常,就像手機App不僅分成Android和iOS版,還細分成不同的系統版本。
      MicroPython兼任OS的工作。
      快閃記憶體存有MicroPython執行環境、用戶自訂的程式和資料。
      如果要在Linux上執行,安裝一般的Python版本即可。

      thanks,
      jeffrey

  11. 老師您好,想在詢問以下幾個問題
    1. 想請問以下程式運行的流程是否正確
    Python :
    .py 程式–> Python 直譯器–> 中介碼 –> Standard 虛擬機 –> 輸出動作–> 呼叫Linux System Call–> Linux –> 硬體執行
    MicroPython :
    .py程式–> MicroPython 直譯器 –> 中介碼 –> 微控制器虛擬機–> 輸出動作 –> 硬體執行

    2. 想請問為什麼MicroPython 的需要的運行環境空間跟Python 會差這麼多? 一個只要256K 另外一個大概需要16~20MB, 請問主要是因為Library 的差異嗎?

    非常感謝

    1. 1. 正確
      2. 因為目的和環境不一樣,就像日月潭的觀光遊艇不能和大海航行的郵輪相提並論,日月潭也無法容納郵輪這個龐然大物。MicroPython的專案網頁有提到它和電腦版CPython的不同點。由於微控器的資源有限,所以MicroPython無法實做所有Python 3的標準程式庫,耗用大量記憶體模組,例如sqlte3資料庫,或者需要硬體支援的功能(如:多處理器平行處理)也不支援。

      thanks,
      jeffrey

  12. 赵老师,您好,在15章中,您提到用SPI读写SD卡,请问在Wemos mini D1中如何读写Winbond-W25Q32-SPIFlash,我从网上pyboard中相关代码(https://github.com/manitou48/pyboard/blob/master/spiflash.py),但不会移植到esp8266中,烦请您指点。

    1. 我手边没有这个Flash芯片所以无法测试。建议先查找该芯片的技术文档,大致了解它的通讯协议,然后对照pyboard的SPI Flash代码。

      因为pyboard和ESP8266版的MicroPython完全相同,所以移植代码应该蛮简单的。只是pyboard有它专属的对象(库),像控制脚位的pyb.Pin、计时器pyb.Timer…你要自己将它替换成ESP8266版本。

      good luck!
      jeffrey

  13. 老師您好
    我按照範例diy17_1.py,python3可以正確執行,網頁也OK。但diy17_2.py則釋出現錯誤訊息
    >>> import diy17_2
    Traceback (most recent call last):
    File “”, line 1, in
    File “diy17_2.py”, line 1, in
    NameError: name ” isn’t defined

    請問我哪裡出錯。

    1. 實驗MicroPython程式時,你可以:
      1. 直接在終端機輸入或貼入原始碼(請參閱3-16頁)
      2. 使用ampy上傳在電腦端編輯好的Python程式檔並立即執行(請參閱3-20頁)

      實驗成功後,要讓自訂程式在微控制板開機後自動執行,請將程式檔命名成main.py,上傳到控制板(參閱1-32頁第二段,以及14-7頁)

      thanks,
      jeffrey

  14. 老師您好,我在網站購買這本書的零件包,但我不確定這塊d1 mini版是哪個型號,所以驅動程式我CH340G 和CP2102都下載了,但是用microUSB連接到筆電,裝置管理員內沒有出現連接阜,請問怎麼辦呢?謝謝><

    1. 當你接上控制板時,Windows系統會自動找尋並下載驅動程式;如果接上控制板,裝置管理員沒有顯示新增裝置的話,請先確定:
      1. 控制板在接上USB時,上面的LED有閃爍一下,代表有通電。
      2. 有些microUSB線材只是電源線,也就是只接兩條線,資料傳輸線沒有接;請更換USB線再測試。

      thanks,
      jeffrey

  15. 老師您好
    範例diy17_1.py,改檔名成main.py 上傳後可以正確執行,網頁也OK。
    但diy17_2.py 改檔名成main.py 上傳後 則釋出現以下錯誤訊息

    PYB: soft reboot
    #7 ets_task(40100164, 3, 3fff8398, 4)
    network config: (‘192.168.0.103’, ‘255.255.255.0’, ‘192.168.0.1’, ‘192.168.0.1’)
    WebREPL is not configured, run ‘import webrepl_setup’
    Traceback (most recent call last):
    File “main.py”, line 34, in
    OSError: [Errno 12] ENOMEM
    MicroPython v1.8.7-7-gb5a1a20a3 on 2017-01-09; ESP module with ESP8266
    Type “help()” for more information.

    不知是否我的sensor 為DHT22 有關
    我有試著修改程式 為

    d = dht.DHT22(Pin(2))

    但還是不行

    請問還有什麼原因呢??謝謝~

    1. 如果連接DHT22,用第七章的程式測試無誤,那問題應該是出在伺服器程式來不及同時應付用戶的連線和DHT資料請求,請嘗試把「用戶連線請求」和「讀取DHT感測器」的敘述分開執行。

      例如,DHT22改用定時方式讀取。先引用Timer(參閱第八章說明):

      from machine import Pin, Timer
      

      溫濕度值改存在全域變數cache裡面:

      cached = {
          'temp':0,
          'humid':0
      }
      
      def readDHT(t):
          global cached
      
          try:
              d.measure()
              cached['temp'] = '{:02}\u00b0C'.format(d.temperature())
              cached['humid'] = '{:02}%'.format(d.humidity())
          except OSError:
              pass
      

      每5秒更新溫濕度值:

      tim = Timer(-1)
      tim.init(period=5000, mode=Timer.PERIODIC, callback=readDHT)
      

      處理用戶連線請求時,不再即時讀取DHT感測器:

      while True:
          client, _ = s.accept()
          # readDHT()
          client.send(httpHeader.format(temp=cached['temp'], humid=cached['humid']))
          client.close()
      

      請測試看看。

      thanks,
      jeffrey

  16. Hi 老師,
    我也有一樣的狀況, erase 後 flash, 但藍色LED 一 直閃爍, 視窗會出現亂碼, 退了好幾版都一樣
    esp8266-20190125-v1.10.bin
    esp8266-20180511-v1.9.4.bin
    esp8266-20171101-v1.9.3.bin
    esp8266-20170823-v1.9.2.bin
    esp8266-20170612-v1.9.1.bin
    esp8266-20170526-v1.9.bin
    esp8266-20170108-v1.8.7.bin

    1. 請嘗試降低燒寫速度,例如改成460800,應該可以解決這個問題。

      thanks,
      jeffrey

  17. 老師 :

    上傳完main.py後
    終端機都會顯示這樣

    就算mail.py是空白的 也是這樣顯示

    PYB: soft reboot
    #6 ets_task(40100130, 3, 3fff83ec, 4)
    network config: (‘192.168.0.103’, ‘255.255.255.0’, ‘192.168.0.1’, ‘192.168.0.1’)
    WebREPL is not configured, run ‘import webrepl_setup’
    Traceback (most recent call last):
    File “main.py”, line 1, in
    NameError: name ” is not defined
    MicroPython v1.9.4-8-ga9a3caad0 on 2018-05-11; ESP module with ESP8266
    Type “help()” for more information.
    >>>

    請問這是什麼問題呢?? 謝謝~

    1. 真奇怪~如果上傳書本的範例檔也會出現類似的錯誤,請清空快閃記憶體再嘗試看看。

      thanks,
      jeffrey

  18. 請問老師
    使用PuTTY 時終端一片黑, 如書上指示(P1-32)按Ctrl+D 没有反應
    是那個地方有問題呢?

    1. 請問按下板子上的Reset鍵,有出現MicroPython的訊息嗎?如果沒有,應該是MicroPython韌體沒有燒錄好,請降低燒錄速度試試看。

      thanks,
      jeffrey

  19. 老師您好
    之前燒錄正常,
    重新再燒錄一次(baud 115200) 也没有異常訊息
    但使用Putty 時仍是黑畫面
    也有按下Reset 鍵, 但仍一樣黑畫面
    再麻煩了
    Thanks
    補充:
    按下Reset 鍵,畫面有出現一堆亂碼

    1. 請確認燒錄韌體的參數是否正確,例如,快閃記憶體的選項是32Mbit。另外,PuTTY預設的連線速度要選擇115200。

      thanks,
      jeffrey

  20. 老師您好
    我改用Flash 燒錄(之前用esptool) , 完成後仍是黑畫面
    按Ctrl+D没有反應
    按下Reset 鍵後,此次有跑出訊息了, 和書上的資訊相同

    但键盤輸入全無反應
    請問可能是什問題呢?
    Thanks

    1. 請改用附錄A介紹的Tera Term或uPyCraft試試看,再不行的話,我懷疑是硬體有瑕疵。

      thanks,
      jeffrey

  21. 老師,請問依照3-20 用ampy指令,每次執行指令都會造成D1 mini重開機,
    (不論是ls, put, rm等指令,都會重開機,但命令都有執行成功。)
    這是正常的情形嗎?

    謝謝!

    1. 不正常…我手上幾個ESP8266板子都沒有出現執行ampy後重新開機的現象。

      thanks,
      jeffrey

  22. 赵老师,大陆何时可以出版?想买一本超图解python物联网实作入门,可是无法访问台湾地区网站购买,不知道赵老师能否代发一本邮寄大陆呢?我可以支付宝转账给您。

    1. 感谢您的关注,我目前没有计画出版简体版。我已经委托朋友跟您联系,谢谢!

      thanks,
      jeffrey

  23. 老师您好!我也非常希望能买到《超图解python物联网实作入门》,能否也麻烦您帮忙邮寄一本呢?坐标是广东省,谢谢您!

  24. 超圖解Python物聯網書中diy12_5.py程式,傳送到ESP8266時發生錯誤,可以說明我哪裡出錯嗎?底下從Shell視窗拷貝的資料如下:

    MicroPython v1.10-8-g8b7039d7d on 2019-01-26; ESP module with ESP8266

    Type “help()” for more information. [backend=GenericMicroPython]
    >>> %Run diy12_5.py
    Traceback (most recent call last):

    File “D:\Python\範例程式\ch12\diy12_5.py”, line 7, in

    ImportError: no module named ‘bigSymbol’

    >>>

    1. ImportError: no module named ‘bigSymbol’
      代表找不到名叫 ‘bigSymbol’ 的模組

      請參閱12-31頁,上傳bigSymbol.py檔到控制板。

      thanks,
      jeffrey

  25. 感謝老師說明ampy步驟,我按照書上上傳檔案到控制板,再啟動thonny程式,並打開diy12_5.py後執行後,還是出現錯誤訊息,請老師幫忙解答,謝謝您。
    Traceback (most recent call last):

    File “D:\Python\範例程式\ch12\diy12_5.py”, line 18, in

    File “bigSymbol.py”, line 32, in temp

    AttributeError: ‘SSD1306_I2C’ object has no attribute ‘framebuf’

    1. 拍謝,bigSymbol.py程式檔裡的所有這個敘述:

      self.oled.framebuf.blit(fb, x, y)

      都要改成:

      self.oled.blit(fb, x, y)

      或者,請重新下載書本的範例檔(於三月更新),謝謝!

      thanks,
      jeffrey

  26. 在請問老師這個問題,一 顆16pinESP8266(D1 mini)傳送diy7_1_1.py程式,讀取溫溼度感測器正常運作,但傳送到另一顆30pinESP8266,卻發生錯誤無法執行,訊息如下:
    download ok
    exec(open(‘diy7_1_1.py’).read(),globals())
    Traceback (most recent call last):
    File “”, line 1, in
    File “”, line 8, in
    ImportError: no module named ‘DHT’

    1. 1. 請問另一個ESP8266板子的程式,是否有import dht敘述?
      2. 程式檔名請不要跟程式模組同名,例如:DHT.py。

      thanks,
      jeffrey

  27. 抱歉老師昨天有事今天才回應!兩個板子傳送同一個程式,一個D1 mini規格裝上DHT11溫濕度模組,傳送程式diy7_1_1.py可以執行,另一塊一般全部接腳引出ESP8266,事先有先清除記憶體,使用uPyCraft.exe軟體執行後,重新連線確認只有boot.py程式,才重新傳送diy7_1_1.py程式,就發生上述錯誤,也曾經使用uPyCraft.exe軟體執行清除後,使用Thonny軟體傳送diy7_1_1.py程式,也是發生相同錯誤。
    我發現另一個不一樣的問題,使用Thonny軟體連線兩塊不一樣板子,呈現出來的軟體版本不一樣,第一個為D1 mini的版本可以正常執行,第二個為一般全部引出的ESP8266
    MicroPython v1.9-6-g821dc27e-dirty on 2017-07-21; ESP module with ESP8266
    Type “help()” for more information. [backend=GenericMicroPython]

    MicroPython v1.10-8-g8b7039d7d on 2019-01-26; ESP module with ESP8266
    Type “help()” for more information. [backend=GenericMicroPython]

  28. 再請教一問題,我目前需要用到UART通訊周邊模組,因怕與port0有衝突問題,因此採用ESP32規格,採用port2的通訊埠,但一直無法正常接收資料。用相同的通訊參數用USB轉232可已讀取資料,但用ESP32接收卻出現如下的訊息,可以麻煩老師幫忙解惑?
    剛執行出現:
    [0;32mI (193499) uart: ALREADY NULL[0m
    [0;32mI (193499) uart: queue free spaces: 10[0m
    連接設備後出現
    rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    flash read err, 1000
    ets_main.c 371
    ets Jun 8 2016 00:22:57

    rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:2
    load:0x3fff0008,len:8
    load:0x3fff0010,len:3408
    load:0x40078000,len:9488
    loAUPC=0x40089265[0m
    [0;33mW (265) boot: WDT reset info: APP CPU PC=0x7783b105[0m
    [0;32mI (2234) cpu_start: Pro cpu up.[0m
    [0;32mI (2234) cpu_start: Single core mode[0m
    [0;32mI (2236) heap_alloc_caps: Initializing. RAM available for dynamic allocation:[0m
    [0;32mI (2248) heap_alloc_caps: At 3FFAFF10 len 000000F0 (0 KiB): DRAM[0m
    [0;32mI (2269) heap_alloc_caps: At 3FFB3000 len 00005000 (20 KiB): DRAM[0m
    [0;32mI (2290) heap_alloc_caps: At 3FFBBB28 len 00002000 (8 KiB): DRAM[0m
    [0;32mI (2310) heap_alloc_caps: At 3FFE0A18 len 000035E8 (13 KiB): D/IRA4 (46 KiB): IRAM[0m
    [0;32mI (2374) cpu_start: Pro cpu start user code[0m
    [0;32mI (2434) cpu_start: Starting scheduler on PRO CPU.[0m
    OSError: [Errno 2] ENOENT
    MicroPython v1.9.1-224-g83d3f3f-dirty on 2017-12-12; ESP32 module with ESP32
    Type “help()” for more information.
    程式碼:
    from machine import Pin
    import time
    from machine import UART
    uart = UART(2, baudrate=9600, bits=8, parity=None, stop=1)
    while True:
    data = uart.readline()
    if data:
    print(data)
    time.sleep(1)

    1. 我用ESP8266測試,燒錄1.10.x版韌體測試UART功能,序列埠也沒有反應,改用1.9.x版則正常。

      thanks,
      jeffrey

  29. 抱歉我用網路最後1.9.?版本通訊還是無法成功,不知道老師使用哪個版本?哪裡可以下載?

  30. 之前這個程式可以執行,最近重新上傳到ESP卻無法執行,不知道甚麼地方出了問題?老師可否幫忙解惑?
    import network, urequests, ujson, machine
    sta_if = network.WLAN(network.STA_IF)
    sta_if.active(True)
    sta_if.disconnect()
    sta_if.connect(‘HER’, ‘19680812’)
    while not sta_if.isconnected():
    pass
    print(sta_if.ifconfig()[0]) # 顯示 IP 位址
    res = urequests.get( #API 網址
    “http://180.176.166.149/raychuan/sel.php?date=2019-03-08&time=09:12:57”)
    print(“資料長度: “,len(res.text))
    print(“回讀資料: “,res.text)

    上船執行後出現錯誤
    download ok
    exec(open(‘MYSQL.py’).read(),globals())
    I (191743) wifi: wifi firmware version: 72ddf26
    I (191743) wifi: config NVS flash: enabled
    I (191743) wifi: config nano formLNLSJ} Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m
    I (191773) wifi: Init dynamic tx buffer num: 32
    I (191773) wifi: Init dynamic rx buffer num: 64
    I (1917buffer num: 0
    I (191783) wifi: Init rx ampdu len mblock:7
    I (191793) wifi: Init lldesc rx ampdu entry mblock:4
    I (191793) wifi: wifi power manager task: 0x3ffe53ac prio: 21 stack: 2560
    I (191803) wifi: wifi timer task: 3ffe6324, prio:22, stack:3584
    [0;32mI (191823) phy: phy_version: 355.1, 59464c5, Jun 14 2017, 20:25:06, 0, 0[0m
    I (191823) wifi: mode : null
    Traceback (most recent call last):
    File “”, line 1, in
    File “”, line 1, in
    ImportError: no module named ‘urequests’

    1. 為什麼錯誤訊息看起來不像是在控制板上執行的Python?請在控制板的REPL模式執行import urequests看看有沒有錯誤。

      thanks,
      jeffrey

  31. >>> import urequests
    Traceback (most recent call last):
    File “”, line 1, in
    ImportError: no module named ‘urequests’

  32. 老師終於發現問題,wifi連線程式原本使用ESP8266可以,後來因為有使用第二組232通訊功能,才更換為ESP32基板,目前ESP32通訊已完成測試,回頭來測試wifi連線時,才發現傳送程式編譯發生錯誤,原本以為環境參數跑掉,刪除Thonny、uPyCraft、python3.7重新安裝也一樣,最後才發現一樣程式使用ESP8266可以正常運作,更換ESP32就發生錯誤,即使我從網路下載四個版本(如下)燒入ESP32後,無法用Thonny或uPyCraft軟體連線到ESP32,只能用uPyCraft再燒入一次內定選項(強制選其他版本燒入也一樣無法正常進入連線),因為一定會用到232通訊,如果使用第0組通訊後,會影響軟體燒寫或偵錯通訊,請問老師如何是好?

    esp32-bluetooth.bin
    esp32-20190508-v1.10-330-g97753a1bb.bin
    esp32-20190125-v1.10.bin
    esp32-20180511-v1.9.4.bin
    網站四種版本用flash_download_tools_v3.6.5燒入ESP32後,無法用Thonny或uPyCraft軟體連線到ESP32,

  33. 再請教老師一個問題?在書上的範例程式,老師您是用甚麼軟體編輯及燒入?

    1. 我使用VS Code編寫Python程式,貼入PuTTY測試或用ampy上傳到控制板測試。

      thanks,
      jeffrey

  34. 老師您好
    依課本6-8頁啟用WebREPL,
    import webrepl_setup 輸入連線密碼…等操作後,從我筆電wifi連接D1板(AP模式)後,
    開啟webrepl ; connect後,出現 password,凍結但無法輸入密碼,請問我哪個步驟出錯?
    謝謝

    1. 剛剛在ESP8266上燒錄10.8版韌體,上傳設置wi-fi連線的boot.py、透過PuTTY啟用webrepl並設定密碼。連線測試沒問題。

      microPython

      請嘗試在PuTTY中按下Ctrl+D軟重置之後,重新整理瀏覽器畫面,再度連線試試看。

      thanks,
      jeffrey

  35. 感謝之前老師的解惑,最近測試第17章節程式,解析查詢字串的運用也完全沒問題。學生有個需求從232讀取rdif裝置後,再透過POST方法傳遞資料,但因為呼叫def main()後,ESP已無法執行其他程式(沒有呼叫時執行其他程式),不知道可以修改程式達到此要求嗎?如何寫?

    1. 可以在main()當中執行無限迴圈,不停地讀取RFID資料,只要有數值進來,就將它發送出去。

      thanks,
      jeffrey

  36. 我試了幾個地方沒有用!以底下程式中哪裡可以執行無限迴圈,執行我要的動作(如讀RDIF),拜託老師明示。
    def main():
    s = socket.socket()
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, PORT))
    s.listen(5)
    print(‘Web server running on port’, PORT)
    while True:
    client = s.accept()[0]
    handleRequest(client)
    client.close()
    print(‘Free RAM before GC:’, gc.mem_free())
    gc.collect()
    print(‘Free RAM after GC:’, gc.mem_free())

  37. 我再測試幾個方式確認,一旦呼叫main()程式執行到client = s.accept()[0]指令後,ESP會等待到有人用網址下指令後,執行傳送的指令並回傳後,才會離開main()程式,有無方法偵測有人下網址時,才進行執行main()程式,其他時間就可以執行其他事情,舉例通訊有資料時(u.any())才進行接收,只是不知道可不可以這要寫程式?

    1. 我原本以為你的程式需求是讓控制板當作前端:當感應到RFID時,用POST方法傳送給某個伺服器。我本週會抽空更新文章說明避免accept()佔用整個迴圈的方法。

      thanks,
      jeffrey

  38. 感謝老師的更新!如果不用佔用整個迴圈,其實可以運用很多的功能,如顯示目前連線人數,已連線的時間等等,這樣ESP的實用性就更棒,再次感謝老師的解惑。

  39. 老师 大陆有没有购买链接,你的几本书我都买来学习了,这本超图解Python物联网实作入门的购买链接可以给我吗?

    1. 我不知道哪个台湾或香港书店不被和谐,我再请朋友跟你联系,谢谢!

      thanks,
      jeffrey

  40. 請問老師?不知道”抽空更新文章說明避免accept()佔用整個迴圈的方法”,甚麼時候可以完成,我剛剛重新下載範例程式,跟以前程式一樣沒有修正?

  41. 老師的專業真的很厲害!之前請益的問題目前都已解決,目前正在學習書上所提TB6612FNG馬達擴展版,我所使用的是ESP8266一般單顆30pin,並非書上所提D1 mini規格,i2c使用GPIO21、22連結OLED模組沒問題,但連結TB6612上的D1、D2接腳使用i2c.scan()掃描,都無法掃描到此模組,書中提到STBY控制我將I2C焊接,電源3.3V、5.0V、GND都有正確接上,不知道為什還是無法掃描到?python掃描軟體如下:
    i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
    time.sleep(0.5)
    print(i2c.scan())

  42. 抱歉老師!學生學藝不精就亂發問題,其實老師後面有教需要燒韌體,因為我只顧著買硬體,忘記詳讀後面的說明,剛剛燒韌體後即可以搜尋到了,再次抱歉!造成困擾深感抱歉。

  43. 老師您好:我在實驗diy7_1.py的動手做時,一直出現OSError: [Errno 110] ETIMEDOUT的錯誤訊息,我試著用終端機及upycraft兩種方式跑書中的範例檔以及更改time.sleep(5)的時間都無法正常運作,請問老師我還可以做那些與修正?

    1. 出現OSError: [Errno 110] ETIMEDOUT錯誤,
      原因通常是控制板收不到DHT11模組的訊號。

      我遇過有問題的DHT11模組,
      透過三用電錶的歐姆檔測試DHT11元件的接腳和模組的輸出接腳,
      發現是「虛焊」,也就是模組的接腳焊接不良,
      重新焊接之後就好了,
      DHT11元件本身沒有故障。

      我還遇過「連接線沒有導通」的情況,
      也就是斷線了,但是導線外表(橡膠)看不出來。

      thanks,
      jeffrey

    2. 感謝老師的回覆,老師回覆後,我做了下列的嘗試:(1)首先把線材和DHT11接到arduino版上測試,發現可以正常運作(2)接回D1 mini 以diy7_1.py運作失敗(3)換個Pin,換到Pin(4),可以正常運作(4)以書中6-15頁的方法改boot.py將repl的設定註解掉(含密碼)(5)再接回Pin(2) 就可以正常運作 。但是我沒找到任何有關repl會干擾pin(2)運作的資料… 所以,我也不確定是否repl跟Pin2的運作有關…@@,最後還是再次感謝老師撥空回覆,謝謝老師。

    3. 感謝告知~我剛剛在D1 mini板子上燒錄全新的MicroPython韌體(1.11版),沒有修改boot.py,接第2腳執行diy7_1.py並沒有問題。如果在你的板子的第2腳接開關或LED,嘗試輸入或輸出控制,可以順利執行嗎?

      thanks,
      jeffrey

  44. 老師你好:
    目前學習到3-21的部分出現問題

    建立一個 LED_run3.py 檔案程式碼如下
    “`
    from machine import Pin
    import time
    p2 = machine.Pin(2, machine.Pin.OUT, value = 1)
    for i in range(3):
    p2.value(1)
    time.sleep(0.5)
    p2.value(0)
    time.sleep(0.5)
    “`
    以下列程式碼已成功執行相關LED控制
    ampy –port com3 run –no-output LED_run3.py

    並上傳至板中
    目前遇到的問題如下
    無法在PuTTY中執行出現問題

    >>> import LED_run3
    Traceback (most recent call last):
    File “”, line 1, in
    File “LED_run3.py”, line 3, in
    NameError: name ‘machine’ isn’t defined

    嘗試執行並沒有任何反應
    >>> import machine
    >>> import LED_run3

    1. 匯入程式庫的敘述,如果寫成:

      import machine

      建立Pin物件的敘述要寫成:

      p2 = machine.Pin(2, machine.Pin.OUT, value = 1)

      若匯入程式庫的敘述寫成(代表「只引用machine裡的Pin」)Orz

      from machine import Pin

      建立Pin物件的敘述要寫成:

      p2 = Pin(2, Pin.OUT, value = 1)

      否則會出現machine未定義的錯誤(NameError: name ‘machine’ isn’t defined)。

      thanks,
      jeffrey

  45. 請問一個問題,
    是否有可能用python的pyserial直接控制或讀取燒錄了micropython的firmata之ESP8266呢?

    1. 如果你有microPython的firmata前端程式的話,就可以在電腦端透過pyFirmata程式庫與它交流,直接用pyserial的話,你要自行編寫解析Firmata協議的程式。

      thanks,
      jeffrey

  46. 老師你好~~您有接專案開發嗎?(物聯網雲+8266開發)細節我門在MAIL裡面說明~~

發佈留言

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

Related Posts

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

Back To Top