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

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

  1. 恭喜Cubie又出新書了~~~ 5/1我就要衝去書店買了~~~
    這樣超圖解三本我就都入手了~~~

    1. 拍謝~4/30已印刷完畢,預計兩、三天才會陸續上架。
      編輯說:經驗顯示, 因為各通路有他們自己的物流體系, 所以入庫後要 1~2 個星期, 店頭才會真的看到上架。

      thanks,
      jeffrey

    1. 感謝告知!我昨天已經收到書了。

      另外補充說明,當初規劃這本書的時候,定位和《超圖解Arduino互動設計入門》相同,都是針對電子電路和微電腦控制應用感興趣的讀者,但是程式語言採用Python/MicroPython、控制板使用ESP8266系列的WEMOS D1 mini板,所以和《超圖解Arduino互動設計入門》是兩個不同的目標族群。

      如上文的「目錄」所示,為了讓內文完整連貫,《超圖解Python物聯網實作入門》書本也包含了基礎電子電路、電晶體、MOSFET和運算放大器等內容,而這些內容與《超圖解Arduino互動設計入門》雷同。

      thanks,
      jeffrey

    1. 我之前在北京的旅店连不上台湾的电商和书店,按照往例,香港的书店应该会贩售此书,只是不知道能不能从内地连上。

      thanks,
      jeffrey

  2. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第7-18頁的圖中,GPIO11應該改成GPIO1

    2. 在超圖解 Python物聯網實作入門書中的第9-23頁的參閱第12章介紹應改成參閱第13章

    3. 在超圖解 Python物聯網實作入門書中的第11-9頁的圖中,A0應該標示在右邊的輸入

    4. 請問在超圖解 Python物聯網實作入門書中的第17-30頁的自訂函式handleRequest,只有寫出if httpMethod = = GET的方法,請問if httpMethod = = POST程式該如何寫呢? 因為之前看過超圖解物聯網Node.js實作入門書中的第13-9頁也是使用POST方法傳參數給esp8266

    1. 非常感謝Alex的糾錯!!
      第3點沒有錯哦~A0腳確實有經過電阻分壓。

      我在實驗時沒有用到接收POST資料,所以當初也沒想到撰寫相關程式。
      不過,以解析17-27頁的POST資料為例,可以看出資料和HTTP欄位之間有一個空行分界,
      且資料的長度紀錄在Content-Length欄位,
      所以取出POST資料的大致流程如下:

      1. 使用迴圈執行readline(),讀入每一行。
      2. 在”Content-Length: “那一行,從冒號之後的字元,讀到最後,取出資料長度值。
      3. 若讀到空行,代表下一行是資料,執行read(資料長度值)讀入整個資料。

      thanks,
      jeffrey

  3. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第4-14頁下方應該改成time=15,才會大於等於6且小於等於18
    2. 在超圖解 Python物聯網實作入門書中的第5-19頁中,程式id=12應該改成num=12
    3. 在超圖解 Python物聯網實作入門書中的第7-28頁中下方,第13章應該改成第14章
    4. 在超圖解 Python物聯網實作入門書中的第8-19頁,色相值介於0~360應該改成色相值介於0~359
    5. 在超圖解 Python物聯網實作入門書中的第8-28頁,from machine import Pin應該改成from machine import Pin, PWM
    6. 在超圖解 Python物聯網實作入門書中的第9-22頁,馬達的兩端,有一端應該接到正極(+)而非負極(-),TIP120的E(射極)應該接地
    7. 在超圖解 Python物聯網實作入門書中的第7-20頁,GPS模組有支援3.3V,所以應該可以把GPS模組VCC直接接到3.3V,而不用將RX串接二極體,參考網址https://www.youtube.com/watch?v=mqOrciWRBcI

  4. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第10-2頁,參閱第10章應該改成參閱第8章
    2. 在超圖解 Python物聯網實作入門書中的第11-29頁,print(‘claps: ‘ + claps) 應該改成print(‘claps: ‘ + str(claps))
    3. 在超圖解 Python物聯網實作入門書中的第12-25頁,oled.framebuf.blit 應該改成oled.blit
    4. 在超圖解 Python物聯網實作入門書中的第12-30頁,self.oled.framebuf.blit 應該改成self.oled.blit

    1. 非常感謝!我已經將這些錯誤,訂正在上文的「內容勘誤」單元。

      thanks,
      jeffrey

  5. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第13-13頁,except Exception as e 應該改成except Exception as e:,pin.duty(pwm); 應該改成pin.duty(int(pwm)),led = Signal(ledPin, invert=True)似乎有問題,所以我把它註解,並將setPWM(dist, led)修改成setPWM(dist, ledPin),如果要反轉的話,我會將pwm = (dist-minDist) / (maxDist – minDist) * 1024修改成pwm = (maxDist-dist) / (maxDist – minDist) * 1024,我修改的程式如下:

    from hcsr04 import HCSR04
    from machine import Pin, PWM, Signal
    import time

    sr04 = HCSR04()
    ledPin = PWM(Pin(2), freq=1000) # led接在第2腳
    #led = Signal(ledPin, invert=True)

    minDist = 10
    maxDist = 30
    limitDist = 40

    def setPWM(dist, pin): # 依據輸入距離,調整輸出PWM。
    dist = max(minDist, min(dist, maxDist)) # 數值限縮在最低與最高限度之間
    pwm = (dist-minDist) / (maxDist – minDist) * 1024
    pin.duty(int(pwm)) # 控制指定腳位的PWM輸出

    while True:
    try:
    dist = sr04.distance()
    print(‘Distance:’, dist, ‘cm’)

    if dist < limitDist: # 若距離在指定範圍內,才需要調整亮度。
    setPWM(dist, ledPin)

    except Exception as e:
    print(e.args[0])

    time.sleep(1)

  6. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第13-31頁,動手做11-1應該改成動手做12-1
    2. 在超圖解 Python物聯網實作入門書中的第13-23頁,說明motorA.setMotor(wemotor.CW, 50)會以50%轉速朝順時鐘方向旋轉,可是在第13-29頁中,卻只有一個參數,如motorA.setMotor(wemotor.CW),而在第13-39頁的程式庫中,是有兩個參數,但看起來pwm_val這個轉速值,似乎不是轉速百分比,所以有些看不太懂
    3. 在超圖解 Python物聯網實作入門書中的第13-18頁,我只有如第13-18頁圖的TB6612FNG,請問如何將13-38頁的WEMOS馬達驅動程式庫改寫成如第13-18頁的TB6612FNG程式庫呢?

    謝謝老師的解答

    1. setMotor()方法的參數值的確是0~100沒錯,我是依照原廠的Arduino程式庫改寫,同樣在方法內部將此值乘上100,我想是因應馬達驅動板的STM32處理器的韌體需求。

      TB6612FNG程式庫可以參考「TB6612FNG直流馬達驅動∕控制板(一):簡介、程式庫與取代L298N模組」使用的SparkFun程式庫,定義drive, break,…等方法,從它的原始檔可看出比STM32的I2C程式單純許多。

      thanks,
      jeffrey

  7. 老師您好

    1. 在超圖解 Python物聯網實作入門書中的第16-32頁,wlan = network.WLAN(network.waln)應該修改成wlan = network.WLAN(network.STA_IF)
    2. 在超圖解 Python物聯網實作入門書中的第17-7頁,client.send(httpHeader.format(temp, humid))應該改成client.send(httpHeader.format(temp=temp, humid=humid))
    3. 在超圖解 Node.js物聯網實作入門第3-47頁的程式如下:

    var express = require(‘express’);
    var app = express();

    app.get(“/”, function(req, res) {
    res.send(“arduino資訊網頁”);
    });

    app.get(“/th”, function(req, res) {
    var temp = req.query.t; // 讀取查詢字串的t值
    var humid = req.query.h; // 讀取查詢字串的h值

    // 確認有收到溫度和濕度值(兩者都不是undefined)
    if (temp != undefined && humid != undefined) {
      console.log(“溫度: ” + temp + “,濕度: ” + humid);
      res.send(“溫度: ” + temp + “°C,濕度: ” + humid +”%”);
    } else {
    console.log(“沒收到資料!”);
    }
    });
    app.use(“*”,function(req,res){
    res.status(404).send(‘查無此頁!’);
    });

    var server = app.listen(5438, function () {
    console.log(“網站伺服器在5438埠口開工了!”);
    });

    在我的電腦執行node inde.js後,先在瀏覽器輸入http://192.168.50.192:5438/th?t=”22″&h=”25″,在我電腦執行的node.js伺服器程式可以收到資料,接著在超圖解 Python物聯網實作入門書中的第17-23頁,我參考老師的程式打算將esp82662取代瀏覽器上傳資料到我的網頁伺服器,修改如下

    def connectAP(ssid, pwd):
    import network
    wlan = network.WLAN(network.STA_IF)

    if not wlan.isconnected():
    wlan.active(True)
    wlan.connect(ssid, pwd)

    while not wlan.isconnected():
    pass

    print(‘network config:’, wlan.ifconfig())

    connectAP(‘CC111’, ‘12345678’)

    import urequests as req

    apiURL='{url}?t={temp}&h={humid}’.format(
    url = ‘http://192.168.50.192:5438/th’,
    temp = 22,
    humid = 25
    )

    r = req.get(apiURL)

    print(‘content:’, r.content)
    print(‘text:’, r.text)

    執行後,micropython終端機出現如下

    paste mode; Ctrl-C to cancel, Ctrl-D to finish
    === def connectAP(ssid, pwd):
    === import network
    === wlan = network.WLAN(network.STA_IF)
    ===
    === if not wlan.isconnected():
    === wlan.active(True)
    === wlan.connect(ssid, pwd)
    ===
    === while not wlan.isconnected():
    === pass
    ===
    === print(‘network config:’, wlan.ifconfig())
    ===
    === connectAP(‘CC111’, ‘12345678’)
    ===
    === import urequests as req
    ===
    === apiURL='{url}?t={temp}&h={humid}’.format(
    === url = ‘http://192.168.50.192:5438/th’,
    === temp = 22,
    === humid = 25
    === )
    ===
    === r = req.get(apiURL)
    ===
    === print(‘content:’, r.content)
    === print(‘text:’, r.text)
    network config: (‘192.168.50.91’, ‘255.255.255.0’, ‘192.168.50.1’, ‘192.168.50.1’)
    Traceback (most recent call last):
    File “”, line 24, in
    File “urequests.py”, line 112, in get
    File “urequests.py”, line 100, in request
    File “urequests.py”, line 58, in request
    OSError: [Errno 103] ECONNABORTED

    所以想請問老師是哪裡出錯了?

  8. 老師您好

    已經解決了,應該是我電腦其他程式的干擾,感謝老師的幫忙

    1. 在超圖解 Python物聯網實作入門書中的第17-25頁中,
    apiURL += ‘field1={temp}&field2={humid}’.format(
    temp = d.temperature(),
    humid = d.humidity()
    )
    因為apiURL是全域變數,會一直串接下去

    2. 在超圖解 Python物聯網實作入門書中的第18-10頁,動手做11-3應該改成12-3,在超圖解 Python物聯網實作入門書中的第18-11頁,第11章應該改成第12章

    3. 在超圖解 Python物聯網實作入門書中的第18-14頁,oled.framebuf.blit(fb, 0, 15)應該改成oled.blit(fb, 0, 15)

  9. 老師您好

    1. 在超圖解 Node.js物聯網實作入門第2-24頁中,可以讓Arduino輸出溫度和濕度的JSON訊息給網頁,所以想請問在超圖解 Python物聯網實作入門第17-7頁中,如何改成讓ESP8266輸出溫度和濕度的JSON訊息給網頁呢? 感謝老師的回答

    1. 參考18-4頁的ujson程式庫說明,修改「動手作17-1」的MicroPython網站伺服器程式,把HTTP標頭改成JSON類型的回應。
      假設傳回如下的JSON資料:

      {
          "updates": [{
              "temp": 18.5,
              "humid": 65.8
          }]
      }
      

      新增與修改「動手作17-1」的程式如下:

      import ujson
      
      jsonData = '''\
      {
          "updates": [{
      	    "temp": 18.5,
      	    "humid": 65.8
      	}]
      }
      '''
      
      data = ujson.dumps(jsonData)
      
      httpHeader = b"""\
      HTTP/1.0 200 OK
      Content-Type: application/json
      Content-Length: {length}
      
      {data}
      """.format(length=len(jsonData), data=jsonData)
      

      上傳到控制板,再開啟瀏覽器瀏覽到網站根路徑,即可看見傳回的JSON資料。

      thanks,
      jeffrey

  10. 老師你好

    ESP8266伺服器有收到資料,但是瀏覽器輸入http://192.168.50.91 沒收到資料,如下所示

    氣溫: – °C
    濕度: – %

    所以想請教老師那裡寫錯了,另外想請教如果要加上路由,該如何寫呢? 例如 http://192.168.50.91/th 才回傳ESP8266伺服器傳回來的溫溼度,感謝老師的回答

    1. 請參閱物聯網IoT第2-38頁的「AJAX的安全限制」一節,在HTTP檔頭加入 Access-Control-Allow-Origin,如下:

      httpHeader = b"""\
      HTTP/1.0 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json
      Content-Length: {length}
      
      {data}
      """.format(length=len(jsonData), data=jsonData)
      

      路由部份,可參閱Python物聯網17-13, 17-15以及17-31頁的例子,解析URL字串,針對路徑做不同的處置。我預計六月中旬會再補充一篇文章說明。

      thanks,
      jeffrey

  11. 老師你好

    加入Access-Control-Allow-Origin: * 之後,ESP8266伺服器有收到資料,但是瀏覽器輸入 http://192.168.50.91 依然沒收到資料,如下所示

    氣溫: – °C
    濕度: – %

    感謝老師的回答

    1. 我用物聯網IoT第2章的temp_json.html連接上述的MicroPython JSON程式,測試沒問題。
      請在瀏覽器中按F12鍵,查看Network的錯誤訊息。

      thanks,
      jeffrey

    1. 這是Python程式碼,在D1 mini板測試執行無誤:

      from machine import Pin
      import socket
      import dht
      
      d = dht.DHT11(Pin(5))
      
      s = socket.socket()
      HOST = '0.0.0.0'
      PORT = 80
      
      def readDHT():
          d.measure()    
          t=d.temperature()
          h=d.humidity()
          jsonData = '{"t":' + str(t) + ',"h":' + str(h) + '}' 
          return jsonData
      
      httpHeader = b"""\
      HTTP/1.0 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json
      Content-Length: {length}
      
      {data}
      """
      
      s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      s.bind((HOST, PORT))
      s.listen(5)
      print("Server running on port ", PORT)
      
      while True:
          client, addr = s.accept()
          print("Client address:", addr)
          
          req = client.recv(1024)
          print("Request:")
          print(req)
      
          data = readDHT()
          client.send(httpHeader.format(length=len(data),data=data))
      
          client.close()
          print('-----------------------')
      

      thanks,
      jeffrey

  12. 老師你好

    我是用Nodemcu V2板和esp8266-20180511-v1.9.4.bin的韌體環境下測試的,還是無法顯示,我再去買一個D1 mini板來測試好了,感謝老師的幫忙

  13. 老師您好, 請教一下 我照著書的封面貼紙跟旗標買D1 mini, 結果收到的是ESP8266MOD。這個跟ESP-12S 使用起來是否有差別?

    謝謝!

    1. 那個控制板是旗標科技販售的產品,ESP8266MOD是ESP-12F,書本1-21頁左下方繪製的圖片也是ESP-12F。ESP-12系列都內建4MB快閃記憶體和相同的微控器核心,在使用上沒有什麼差別。

      thanks,
      jeffrey

  14. 老師你好

    1. 之前的問題已解決,另外想請問在超圖解 Node.js物聯網實作入門第17-5頁中,寫的是req = client.recv(1024),但在第17-15頁,寫的是req = client.recv(1024).decode(‘utf8’),請問這兩處為何會用不同的寫法?

    2. 在超圖解 Node.js物聯網實作入門第17-14頁中,s[0] !=16384 以及fileSize=s[6],其中16384 和 s[6]是怎麼來的呢?

    感謝老師的回答

    1. 物聯網Python第17章,17-5和17-15頁的兩個敘述寫法是一樣的,請參閱6-24的「文字編碼與解碼」說明。

      17-14頁的16384與s[6],請參閱14-17頁「確認檔案是否存在以及檔案大小」一節。

      thanks,
      jeffrey

  15. 老師你好

    請問您有試過使用Cygwin 來操作附錄B嗎? 我操作到下載ESP-OPEN-SDK 後的make就有問題了.
    我已經用了一周 還是無法搞定, 請問是我哪邊出了問題嗎?
    我附上問題的資料給您參考.

    Makefile:184: warning: overriding recipe for target ‘ESP8266_NONOS_SDK-2.1.0-18- g61248df/.dir’
    Makefile:179: warning: ignoring old recipe for target ‘ESP8266_NONOS_SDK-2.1.0-1 8-g61248df/.dir’
    make -C crosstool-NG -f ../Makefile _ct-ng
    make[1]: Entering directory ‘/home/hp4421s/esp-open-sdk/crosstool-NG’
    ../Makefile:184: warning: overriding recipe for target ‘ESP8266_NONOS_SDK-2.1.0- 18-g61248df/.dir’
    ../Makefile:179: warning: ignoring old recipe for target ‘ESP8266_NONOS_SDK-2.1. 0-18-g61248df/.dir’
    ./bootstrap
    :無效選項p: 第 2 列:set: –
    set: 用法:set [–abefhkmnptuvxBCHP] [-o 選項名] [–] [引數 …]
    make[1]: *** [../Makefile:146: _ct-ng] Error 2
    make[1]: Leaving directory ‘/home/hp4421s/esp-open-sdk/crosstool-NG’
    make: *** [Makefile:143: crosstool-NG/ct-ng] Error 2

    1. 沒有,我是在Windows 10的Linux子系統和樹莓派3B+上編譯MicroPython。

      thanks,
      jeffrey

  16. 老師您好

    使用【超圖解 Python 物聯網實作入門實驗套件包】裡面的 Wemos D1 mini板 進行練習時,
    MicroPython的韌體(esp8266-20180511-v1.9.4.bin)透過[esptool]或是[Flash下載工具]
    皆可正常燒錄。
    但是透過putty連線時畫面只有綠色游標,黑色一片,無法操作。
    按下 Ctrl + D 也無反應。
    不知道是何原因?

    謝謝

    1. 老師您好

      關於上面的問題,後來再次比對了一下[Flash 下載工具]的燒錄參數,
      發現有些部分與書上不同,重新燒錄後。
      Putty可以連上了,但是鍵盤無法輸入,
      嘗試用另外一套Tera Term,可以連上,也可以輸入了。
      暫時先用 Tera Term 學習了。

      謝謝

    2. 我使用Flash下載工具,依照1-28頁的設定,先清除記憶體再燒錄1.9.4版韌體。

      燒錄完畢後,拔除USB線再重接。使用Putty連線,測試輸入沒問題:

      MicroPython韌體 1.9.4

    3. 老師您好

      今天換別台電腦重新燒錄之後,就可以了,燒錄完的 D1 mini 板拿到原電腦,
      一樣可以正常操作。不知原因為何,但也算是解決了。
      另外順便提一下書中 3-20 最上方的圖片內容有誤,
      錯誤:while i in range(3):
      正確:for i in range(3):

      謝謝

  17. 老師您好

    1. 超圖解 Python物聯網實作入門第17-14頁中,想把這個原本在esp8266執行的網頁伺服器移植到電腦或樹莓派上,程式中原本s[0] != 16384 我修改成 s[0] != 16895,執行後網頁還是無法出現,所以想請問老師該如何修改,謝謝老師的回答

    1. 在電腦或樹莓派上使用Python建置web服務,建議使用flask或django框架,許多Python書籍和網站都有介紹。

      thanks,
      jeffrey

  18. 想請教CUBIE版主, 想使用NodeMCU/ESP8266的SPI與GPIO來傳送自定義的資料, PC主機端拿Visual C#來開發的GUI控制軟體行嗎?
    是不是需搭配版子上USB to TTL IC型號的開發包? 請問有無相關上層PC端控制軟體開發的介紹? 非常感謝 ^.^

    1. 微控制板跟PC相連,最簡單的方法是透過USB序列埠,Visual C#一定有相關的序列埠通訊程式庫可用。

      have fun!
      jeffrey

  19. 老師您好
    想請問老師的這三本作品,有沒有出電子書版本? 如果有, 請問要去哪裡買?

    雖然手上已經擁有兩本超圖解系列實體書,新書已訂購,但是還是想買電子書版本。老師您書中的資料非常詳盡,常常會需要查閱,如果有電子書版本,直接點目錄(或書籤)翻頁,真的會快速方便很多。

    1. 非常感謝您的支持,書籍的出版和發行都是由出版社決定,目前沒有發行電子版的計畫。

      thanks,
      jeffrey

  20. 老師您好

    想請教 3-27 套用歐姆定律來計算由3.3V電源提供給LED (2V,10mA)時所需的電阻歐姆值之例子

    書上寫著 (3.3V-2V)/10mA = 1.1V/0.01A =110Ω,

    但3.3V – 2V 應該為1.3V ,而非1.1V,不是這樣子的嗎@@?

  21. 老師您好 :
    在 “超圖解 Python 物聯網實作入門” 中, 我發生了找不到模組的錯誤
    (1) PuTTY 不會產生錯誤
    (2) IDLE (Python 3.6 64-bit) 會產生錯誤
    (3) Python 3.6 (64-bit) 會產生錯誤
    底下是實作的過程, 請問這是什麼原因造成的呢 ?

    2018/07/03
    ==========
    安裝
    python-3.6.1-amd64.exe
    IDLE 中有 from machine import Pin

    Traceback (most recent call last):
    File “K:\blink.py”, line 1, in
    from machine import Pin
    ModuleNotFoundError: No module named ‘machine’
    路徑
    C:\Users\John\AppData\Local\Programs\Python\Python36\
    環境變數
    C:\Users\John\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\John\AppData\Local\Programs\Python\Python36\;

    2018/07/01
    ==========
    安裝
    python-3.6.5-amd64.exe
    IDLE 中有 from machine import Pin

    Traceback (most recent call last):
    File “K:\blink.py”, line 1, in
    from machine import Pin
    ModuleNotFoundError: No module named ‘machine’
    路徑
    C:\Users\John\AppData\Local\Programs\Python\Python36
    環境變數
    C:\Users\John\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\John\AppData\Local\Programs\Python\Python36\;

    2018/06/30
    ==========
    重新安裝 Windows7 SP1
    安裝 Python 3.6.5 & Python 3.7.0
    IDLE 中有 from machine import Pin

    Traceback (most recent call last):
    File “K:\blink.py”, line 1, in
    from machine import Pin
    ModuleNotFoundError: No module named ‘machine’
    路徑
    C:\Users\John\AppData\Local\Programs\Python\Python36-32
    C:\Users\John\AppData\Local\Programs\Python\Python37-32
    環境變數
    C:\Users\John\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\John\AppData\Local\Programs\Python\Python36-32\;

    2018/06/09
    ==========
    系統 Windows7 SP1
    安裝
    python-3.6.5-amd64.exe
    安裝完畢, 執行會產生錯誤訊息
    應用程式無法正確啟動 (0xc000007b)
    安裝
    python-3.6.5.exe
    路徑
    C:\Users\John\AppData\Local\Programs\Python\Python36-32
    環境變數
    C:\Users\John\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\John\AppData\Local\Programs\Python\Python36-32\;
    可用
    超圖解 Python 物聯網實作入門, 實作到第三章完, 沒問題

    1. 因為電腦版的Python沒有machine程式庫,所以程式編輯器會提示 No module named ‘machine’ (沒有名叫machine的模組)
      Python程式必須貼入連接MicroPython控制板的終端機,或者上傳到控制板才能被執行。

      thanks,
      jeffrey

  22. 18-4頁的”使用ujson程式庫建立與解析JSON”的程式碼, D1是否應該是”data”?

  23. 老師 您好

    不好意思,本人初心手,想請教一下,

    1. 4-21頁的 動手做4-3 下面的麵包板圖,這張圖當開關按下時電流方向是從D3流向電容及電阻嗎?
    2. 另外,動手做4-3 我嘗試將電阻拔除,直接將開關接在電容針下,好像也有消除彈跳訊號的效果,那麼電阻的作用是什麼呢?

    1. 1. 動手做4-3的RC開關電路就是4-20頁底下的電路圖,如4-9頁所示,D3腳已內建上拉電阻,所以麵包板只需連接一個電阻。按下開關時,電流會從Vcc流向R2和R1。
      2. 如4-20頁的說明,電阻值越小(電線本身也帶有阻抗),RC充放電時間越短。拿掉動手做4-3的電阻,只會縮短電容的放電時間;8-27頁的旋轉編碼器也只有連接電容。

      thanks,
      jeffrey

  24. 老師您好 :
    這些日子來, 我的問題還是沒有解決,
    您說要上傳到控制板才能被執行
    在 “超圖解 Python 物聯網實作入門” 中 (Page 3-21),
    我已上傳到控制板,
    ampy –port com3 put blink.py
    然後執行 IDLE → Open blink.py → Run → Run Module,
    依然
    Traceback (most recent call last):
    File “C:\blink.py”, line 1, in
    from machine import Pin
    ModuleNotFoundError: No module named ‘machine’

    1. hi johnson:

      「執行 IDLE → Open blink.py → Run → Run Module」這個操作,代表在電腦上執行blink.py

      依照3-21頁的說明,上傳程式碼到控制板之後,請用PuTTY或screen連線到控制板,在終端機裡面執行:

      import blink

      代表在控制板上,引用blink.py檔並執行。

      thanks,
      jeffrey

  25. 老師您好 :
    感謝您的答覆, 我是想在 IDLE 或 Thonny 中寫程式, 然後馬上執行, 馬上修改,
    方便除錯,
    如果在PuTTY或screen連線到控制板, 我覺得修改程式比較麻煩, 比如要直接修改
    那一行

  26. 老師您好,

    第12章 bigSymbol.py 除了最後面 def text 以外, 往上兩個 def temp 和 def humid 也都要把多的.framebuf 去掉。

    Good Day!

  27. 老師您好:
    我購買了超圖解Python物聯網實作入門這本書,並按照書p.5上所指示的網址準備下載書中的範例程式,但輸入幾次都只會進入www.flag.com.tw這個網頁,請問我該如何取得範例程式
    不好意思我是剛學python的新手,如果問了蠢問題敬請見諒

    1. 拍謝,應該是出版社的網頁改版導致網站程式出錯,我剛剛已通知出版社編輯。

      thanks,
      jeffrey

      補充:剛剛測試,資料下載頁已經修復完畢。

  28. 老師您好,

    跟著您書上講的一個一個做學習到很多,感謝!

    另外,第18-9與18-10在使用obj[‘ ‘]的時候似乎都要在前面加上當初儲存程式的名稱然後 .obj[‘ ‘]?

    Good Day!

    1. 很高興這本書對您有幫助,那個obj裡的資料類型是「字典」(請參閱18-4)
      所以存取其中的資料時,僅需要用obj[‘元素’]的語法即可。

      thanks,
      jeffrey

  29. 老师您好:
    我在《diy15-2》,遇到问题:
    点阵屏每次运行的时候都会 全亮,不会显示音符符号。
    用的型号:
    NodeMCU 开发板 ,书中的 MAX7219模块,固件1.9.3版
    测试:
    MAX7219模块在UNO上正常,用逻辑分析仪测 NodeMCU 开发板SPI(新手),发现
    数据全错了,不知道是什么原因?

    1. hi jock:

      请在宣告SPI对象的语句中,加入这些参数试试:

      spi = SPI(1, baudrate=1000000)

      或者:

      spi = SPI(1, baudrate=1000000, polarity=0, phase=0)

      另外,MAX7219的这份技术文档第2页的电子特性表的工作电压(Operating Supply Voltage)有提到,最低工作电压是4.0V;第3页的逻辑高电位(Logic High Input Voltage)最低是3.5V,但我用ESP8266控制板,逻辑高电位3.3V测试没有问题。

      thanks,
      jeffrey

  30. 老师您好:
    首先谢谢您!按照您的提示,困扰我多日的问题终于得已解决。
    我做了如下改变:
    修改后“spi = SPI(1, baudrate=1000000)”这条语句,
    ESP8266与MAX7219模块之间增加个逻辑电平转换芯片。
    在此想多说一些,老师您的书写的非常细致!期待您以后的书,在学习路上,感谢有您在! = )

  31. 超圖解 Python 物聯網實作入門 P6-17 中, PuTTY 顯示
    PYB: soft reboot
    #6 ets_task(40100130, 3, 3fff837c, 4)
    network config: (‘192.168.7.120’, ‘255.255.255.0’, ‘192.168.7.1’, ‘192.168.7.1’)
    WebREPL is not configured, run ‘import webrepl_setup’
    OSError: [Errno 2] ENOENT
    MicroPython v1.9.3-8-g63826ac5c on 2017-11-01; ESP module with ESP8266
    Type “help()” for more information.

    關閉 PuTTY 並重置 D1 mini
    打開 WebREPL 網頁, 輸入
    ws://192.168.7.120:8266/
    按 Connect
    顯示
    Disconnected
    請問是什麼因素連接失敗 ?

  32. 老師您好 :
    前面幾頁都有做過, 但始終沒有成功在瀏覽器連接 WebREPL 過, 不知道是我觀念的問題,
    還是操作環境的問題, 我再詳述一下過程

    CABLE 網路線接 WIFI 分享器
    WIFI 分享器接 PC (Windows7, Google Chrome)
    無線網路 DHCP
    D1 mini 的 boot.py 是 ch06 範例改 ‘無線網路ID’, ‘密碼’
    參閱6-11頁
    透過 USB 線與 PuTTY 連接

    PYB: soft reboot
    #7 ets_task(40100130, 3, 3fff837c, 4)
    network config: (‘192.168.7.120’, ‘255.255.255.0’, ‘192.168.7.1’, ‘192.168.7.1’)
    WebREPL is not configured, run ‘import webrepl_setup’
    OSError: [Errno 2] ENOENT
    MicroPython v1.9.3-8-g63826ac5c on 2017-11-01; ESP module with ESP8266
    Type “help()” for more information.
    >>>
    >>> 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)
    >
    No further action required
    >>>

    退出 PuTTY 再按下 D1 mini 的 Reset 鍵
    執行範例中的 webrepl.html
    ws://192.168.7.120:8266/
    按 Connect
    還是顯示
    Disconnected

    老師請指點迷津, 謝謝!

    1. 你之前應該有啟用過WebREPL,只需要啟用一次,不必每次都執行import webrepl_setup。
      控制板接上USB之後,不必用PuTTY連線,直接開啟瀏覽器連線即可。

      另外,許多無線網路分享器具備多組SSID設定功能,也可以分別設定網域。
      例如,假設網路分享器有SSID_A和SSID_B兩個AP名稱,
      連接到SSID_A時,自動分配的IP位址是192.168.1.x
      連接到SSID_B時,自動分配的IP位址是192.168.7.x
      如果電腦和ESP8266連到不同的SSID,彼此就不能相連。

      thanks,
      jeffrey

  33. 老師您好 :
    這麼說我的電腦沒有無線網卡, 是不能連到 SSID 的, 這樣對嗎 ?

    1. 可以連,只要位於相同網域即可。
      在Windows平台,執行ipconfig命令
      在macOS或Linux平台,執行ifconfig命令
      可查看本機網路卡的IP位址。

      thanks,
      jeffrey

  34. 老师您好:
    超图解Python物联网制作入门的P16-30 16-31 中代码
    httpHeader = b”’\
    GET /{path} HTTP/1.0
    Host:{host}
    User-Agent: MicroPython

    ”’
    s.send(httpHeader.format(path=path, host=host))
    在Python3中bytes不再支持format,是否可以这样修改:
    httpHeader = ”’\
    GET /{path} HTTP/1.0
    Host:{host}
    User-Agent: MicroPython

    ”’

    s.send(httpHeader.format(path=path, host=host).decode(‘utf-8’))

    1. 應該用encode():

      httpHeader.format(path=path, host=host).encode(‘utf-8’)

      thanks,
      jeffrey

  35. 老師 您好:
    請教如果我要用17章的http_query 的範例,中的判斷led的ON或OFF部份改成 ADC Read再將值回傳到用戶端(網頁)
    ,利用17-2的範例 httpheader 改成動態讀取ADC傳回用戶端網頁,一直失敗,有那裡要注意嗎?

    f rom machine import Pin, PWM, ADC
    temp = ADC(0)
    ========================
    if state == ‘on’:
    t = temp.read()
    else:
    t = temp.read()

    client.send(httpHeader(t))
    ====================================
    httpHeader = b”””\
    HTTP/1.0 200 OK

    ESP8266 Webserver

    Temperture:(t)

    “””

    1. 假設網頁的樣版如下:

      httpHeader = b"""\
      HTTP/1.0 200 OK
      
      <!doctype html>
      <html>
      <head>
        <meta charset="utf-8">
        <title>ESP8266 Webserver</title>
      </head>
      <body>
        Temperture: {temp}
      </body>
      </html>
      """
      

      讀取的程式碼如下:

      while True:
          client, _ = s.accept()
          val = adc.read()
          client.send(httpHeader.format(temp=val))
          client.close()
      

      thanks,
      jeffrey

  36. 老師您好:
    我用18-1
    import urequests
    r=urequests.get(“http://micropython.org/ks/test.html”)
    Traceback (most recent call last):
    File “”, line 2, in
    File “urequests.py”, line 108, in get
    File “urequests.py”, line 53, in request
    OSError: -2
    出現錯誤訊息,請問是什麼原因呢,謝謝

  37. 請問書本的 3-19 頁提及安裝 ampy 是在哪個命令列下透過 pip 安裝 ampy (windows系統)? PuTTY的?還是 Windows 的?而且安裝命令開頭是 “D:\python>” 可是我的 D 槽應該沒有相關檔案… 請確認。謝謝!

    1. 如果你用的是Windows系統,開啟命令提示字元之後,直接輸入書本上的pip指令就能進行安裝,它會自動從網路下載。關於pip的說明,請參閱1-18頁。

      thanks,
      jeffrey

  38. 老師您好:
    12-20 SSD1306

    === import ssd1306
    === from machine import Pin,I2C
    === i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
    === oled = ssd1306.SSD1306_I2C(128, 64, i2c)
    Traceback (most recent call last):
    File “”, line 4, in
    File “ssd1306.py”, line 112, in __init__
    File “ssd1306.py”, line 49, in __init__
    File “ssd1306.py”, line 74, in init_display
    File “ssd1306.py”, line 117, in write_cmd
    OSError: [Errno 110] ETIMEDOUT

    麻煩請您幫忙確認一下問題
    謝謝

    1. 從錯誤訊息看來,應該是你的OLED螢幕接線有誤;也有可能是導線接觸不良,請更換連接線測試看看。

      thanks,
      jeffrey

  39. 我買了二本您的書,帶來大陸之后發現這裡可以很便宜的買到您書中的各項零件,加上您的書,真是受益匪淺,現在想作一個計數器,当然用OLED也是OK,但想試試看用 TM1637這個七段顯示器,上網找不到可以參考的指令,不知有沒有像DHT這樣方便的程式庫可以直接引用,是否有可以參考的資料或網頁呢? 麻煩您了,您的書真的寫得很棒,很希望您能再出ESP8266+PYTHON的書,謝謝您。

  40. 您好,在下在練習 6-10的部份時,不論用chrome或是firefox,執行webrepl.html時,都會出現

    Terminal widget should be focused (text cursor visible) to accept input. Click on it if not.
    To paste, press Ctrl+A, then Ctrl+V

    的信息,按下connect后就一直沒有反應,在cmd模式下 ping 192.168.4.1 時都能正常的連線,有接上USB線,不論有沒有把PUTTY关掉,開發板重開机過,畫面和書上都一樣,就是差在會一直出現上述的錯誤訊息,無法連線。后來把開機啟用STA模式也設了,还是無法在webrrpl的頁面出現輸入密碼的畫面,請問还有什麼可能性嗎? 有其他方法可以取得ESP866上的档案嗎? 我想把ESP8266所取得的溫濕度信息寫入ESP866中,再用電腦取得ESP8266內的文件再作顯示,在您的書中是不是能找到所有的資料? 麻煩您了 謝謝。

    1. “Terminal widget should be focused (text cursor visible) to accept input. Click on it if not.” 並不是錯誤訊息,它只是告知瀏覽器裡的終端機物件應該要「取得焦點」,請在瀏覽器的終端機物件(黑色範圍)按一下滑鼠。

      我剛剛在一塊ESP8266板子重新燒錄MicroPython 1.9.4,並按照書本6-8頁的說明重新操作一次:

      啟用WebRepl

      連接到ESP8266的Wi-Fi AP,在瀏覽器中操作WebREPL沒有問題:

      操作WebRepl

      thanks,
      jeffrey

  41. 老師您好~
    我在進行第六章(6-11)練習時,網頁要求輸入password時,都無法輸入任何數字, 不知我是忽略了哪一個步驟
    , 麻煩老師您幫忙一下了~感恩

    1. 請問你有先按一下瀏覽器中的終端機(黑色部份)嗎?除了數字以外,都能輸入嗎??瀏覽器要用Chrome或Edge。

      thanks,
      jeffrey

  42. 老師您好~ 是使用Chrome並有按黑色部分 但所有文字都無法輸入 只有enter有反應 我換一台電腦使用也是卡在password那邊,麻煩您了~

    1. 使用PuTTY連接ESP8266板子時,有出現錯誤訊息嗎?我剛剛重新燒錄MicroPython韌體,上傳boot.py檔:

      PuTTY連線畫面

      連線測試都沒問題。

      thanks,
      jeffrey

  43. 我也練習第六章問題跟樓上網友差不多,上傳boot.py重開之後,仍無法顯示IP…
    後來上網查不能直接用一般記事本或其他Notepad++軟體來編譯py檔…命令get無法讀取py檔….
    乖乖用內建python程式編譯

    1. 感謝miho的補充,不過,我都是用vs code編輯程式再上傳,並沒有問題。

      thanks,
      jeffrey

  44. 老師您好:
    看了大家在此園地中如此熱烈討論,對大家認真學習的用心實在很很感動.
    聽說esp8266這種控制板,小朋友都已在玩了,所以4年級0段班的我也跟著跳下來試試(請勿見笑),
    自認還有些電子電路概念,唯缺電腦與控制語言這方面,想藉[超圖解]漫畫方式切入,
    因此,買了 “超圖解 Python 物聯網實作入門” 大著作研讀,
    但…..
    看到該書的P1-17就擱淺了,
    How to 開啟[命令提示字元] 輸入”python -v” ?
    P1-18~19 …使用pip安裝python套件,….如網頁說明,[套件可以透過pip套件管理員,在終端機(命令提示字元)進行安裝,
    P1-19上部的網頁圖也有看沒有懂,
    多次出現…[命令提示字元] .
    SOS Mayday ! Mayday !
    感恩 !!

    1. 請按下鍵盤上的Windows鍵,再輸入cmd,按下Enter鍵,即可開啟「命令提示字元」。

      thanks,
      jeffrey

發佈留言

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

Related Posts

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

Back To Top