作者:趙英傑
出版社:旗標科技股份有限公司
出版日期: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板:
採用D1 mini板的主要原因:
- 尺寸小、可插入麵包板。
- 有5V輸出和輸入,方便驅動各種週邊和感測器。
- 有多種現成的「擴展板」模組可用,而且擴展板的接腳採用標準2.54mm孔距的排母或排針,不像某些廠商採用特殊規格的插座。
擴展板雖然方便,但也有些缺點,像是配線彈性不足,有些擴展板佔用相同的微控器接腳,無法一同使用,有些則受限於擴展板的尺寸,像OLED顯示器和NeoPixel全彩LED,就採用解析度較低或者數量較少的元件,所以本書未全盤採用這些擴展板。
超圖解Python程式設計入門
為了清楚說明程式語法和執行結果,書本裡面的命令提示字元(終端機)視窗,也全都用手繪方式呈現:
底下是用Python語言建立網路用戶端和伺服器程式的流程和相關指令對照說明:
底下是在OLED螢幕呈現自訂符號的步驟和相關指令對照說明:
本書也有說明實用的物件導向程式設計(OOP)手法,自行編寫伺服馬達(Servo)、超音波距離感測器、直流馬達控制板…等程式庫。
這是用自製的超音波距離感測器程式庫,達成測量物體距離的Python程式解說:
書中也以範例實作說明物件導向程式設計中的「繼承」概念(註:實作內容與伺服馬達有關,不是拼裝獵雷鑑)。
最後的「附錄B」則說明如何運用Windows 10的WSL(適用於Linux的Windows子系統),安裝Debian Linux並且配置交叉編譯器(cross-compiler),讓讀者了解如何自行編譯客製化的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。
7-28頁,最後一段的第13章,正確是第14章。
7-48頁以及14-5頁,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(射極)要接地,馬達一端要接正電源。
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)。
老師您好~ 想請問您第13-28頁 自走車硬體與軟體 下面5V電源的板子 叫什摸名子~?
那個是DC-DC直流電壓降壓板,第9-22頁有說明。
thanks,
jeffrey
老師您好 第12-17頁
Traceback (most recent call last):
File “”, line 15, in
OSError: [Errno 110] ETIMEDOUT
請問是什摸問題 謝謝您~
請檢查I2C接線是否正確,也可能是導線有問題,建議換一條試試。
thanks,
jeffrey
老師您好 第12-17頁
我PUTTY上面的值都是b’\x00,轉動搖桿都沒有任何變化,想請問您是什摸問題,謝謝您~
請問搖桿模組有接3.3V嗎?取下PCF8591模組的AN2跳帽之前,轉動模組上的半固定可變電阻,數值有變化嗎?
thanks,
jeffrey
老師您好 第13-22頁的wemotor.py程式碼是在第幾頁? 謝謝您
程式的說明在13-30頁。
thanks,
jeffrey
老師:
我跟足了書中指示把D1 MINI 與家中WIFI路由器連接成基地台(已檢查控制板已拿到IP 地址). 我用流動裝置可接達MINI站台, 但D1 MINI 卻不能連上互聯網, 到底有何原因? 有勞老師告知.
(P.S. 其他流動裝置皆可透過家中路由器上網的)
「不能連上互聯網」這句話有點含糊,請問執行16-30頁的socket程式碼,可以取得遠端網站的HTML內容嗎?
thanks,
jeffrey
即是說, 我的手提電腦不能透過D1 MINI站台上網, 但卻可內聯連接在MICROPYTHON中打指令. 我希望正如在書中所說般, 當 WEBREPL ESP8266同時, 電腦亦可上網 . 請問明白我的意思嗎 ?
相關書頁 : P.6-12至6-17
了解,請問上傳boot.py並重新啟動之後,終端機有顯示什麼錯誤訊息嗎?
請下載這個動態IP的boot.py檔,修改其中的網路SSID和密碼之後,再上傳到D1 mini控制板。
你可能需要重新執行import webrepl_setup,並重置控制板。
thanks,
jeffrey
並無任何錯誤信息, 所有結果與你書中所描述的相同.
沒有錯誤訊息卻不能連網啊…執行16-30頁的socket程式碼,可以取得遠端網站的HTML內容嗎?
請確認:
1. 你的電腦和D1 mini板位於相同網域,亦即,IP的前三碼都一樣,例如:192.168.1.x
2. 使用chrome瀏覽器開啟webrepl.html
3. ws網址是你的D1 mini板的IP位址
thanks,
jeffrey
真怪 . 用SOCKET又可讀到HTML . 哪是否意味我塊板可以傳送及接收互聯網資料 ?
另外, 我發現打 import http_basic.py 後, 第一次能看到網頁內容. 但連續再打一次至多次, 卻沒有任何網頁內容顯示給我.
我要再次插板或斷線登入才成功執行程式. 但要再顯示HTML , 則又要再斷線及登入才成功. 請問這是正常現象嗎 ?有何解決辦法 ? 還是我用錯執行方法 ? 敬侯老師回覆
嗯,你的D1 mini板並沒有問題,建議重新燒錄一次韌體看看,記得要選擇「清除」韌體的選項。
早期的ESP8266板會有Wi-Fi連線不穩定的情況,現在比較沒聽說有連線方面的問題。
import http_basic
只有第一次有效,是正常的,除非你按下Ctrl+D重置再執行一次。
如果要重複運行相同的程序,你要將程式碼寫成一個函式。簡單的例子如5-11的greet()。
thanks,
jeffrey
老師您好:
我put 一個程式碼到 wemos d1 mini板子上後,要怎摸操作才能讓我接上外部電源時,只重複執行這個程式? 謝謝老師
請把要開機自動執行的檔案命名成main.py,如1-32頁第二段所示,謝謝!
thanks,
jeffrey
老師您好:
Putty 連上 WEMOS D1 mini 後,視窗會出現亂碼且像跑馬燈一樣跑,請問是那裡設定出現問題。
請依照第一章的說明,燒錄MicroPython韌體,燒錄之前,請先執行ERASE(清除)。
thanks,
jeffrey
請教一下,我買了你這本書,也查了很多的網站
但micropython好像都是透過終端機的方式去控制
就是查不到micropython怎樣跟其它的程式語言來進行溝通,
例如,我想要用python透過serial 去跟燒錄有micropython的D1 mini溝通
想要它將某個感應器的值回傳回來 這個要怎麼作呢
我週三之前會補充一篇文章說明。
更新:請參閱「使用Python的pySerial模組進行序列通訊:連接電腦與Arduino和MicroPython」
thanks,
jeffrey
感激 我現在非常需要這個
老師您好,我用兩個超音波感測器,一個伺服馬達(電源都接板子5V),板子接外部電源5v/2.1A下去執行,一開始都可以正常執行,但重複開機執行幾次後,MINI版子卻突然燒掉了,想請問您這是什摸問題~??
你接的週邊耗電流都不大,加上板子本身有個自恢復保險絲,如果是電源過載的話,放一陣子它就能恢復運作;你也可以嘗試不透過microUSB供電,從5V接腳供電試試看。
請問你的超音波感測器輸出腳有串接一個約2.2K的電阻嗎?如果不是直接輸入高於3.3V的訊號,微控器本體應該沒有故障。
thanks,
jeffrey
老師您好: 我板子到超音波皆有裝2.2K電阻,我剛剛把昨天那塊板子拿出來嘗試連接電腦一樣沒有反應,是要靜止較長的時間嗎? 有什摸辦法可以分辨是自恢復保險絲跳開,還是MINI板子燒掉? 謝謝老師您的回答。
自恢復保險絲只要經過短暫時間就復原了;請直接將5V電源,接板子的5V和GND供電(請參閱2-25頁),D1 mini的LED會閃爍一下,Wi-Fi也會有信號。如果LED沒有閃,那應該是本體故障了。
thanks,
jeffrey
看完老師的回答後,我還有個疑問,
有沒有辦法用電腦的python透過pyserial,直接傳送
import machine
led = machine.Pin(15, machine.Pin.OUT)
led.high()
給有micropython的板子,進而控制它呢
其實我是想要取代終端機,還請老師解惑一下
Python程式預設的執行介面就是終端機,無論是要透過電腦接收還是發送資料,你還是得先啟動電腦上的程式。你也可以在作業系統上設定讓Python程式在開機後自動執行。
「序列通訊」只是傳輸資料的一個介面,收到的資料不一定要呈現在終端機,例如,你可以直接將它寫入資料庫,或者寫個視窗介面來操控資料。
thanks,
jeffrey
想請問大家兩個可能笨笨的問題,
1. 依照書中所說, Micropython是不是只能在某些微處理器上運行呢?而此微處理器中沒有OS只有Python 的直譯器, 運行存在Falsh中的Micropython指令, 請問是這樣嗎?
2. 請問Micyro Python 能不能在Linux 的環境上跑呢?
非常感謝大家
對,只能在特定的處理器上運作。其實這很正常,就像手機App不僅分成Android和iOS版,還細分成不同的系統版本。
MicroPython兼任OS的工作。
快閃記憶體存有MicroPython執行環境、用戶自訂的程式和資料。
如果要在Linux上執行,安裝一般的Python版本即可。
thanks,
jeffrey
老師您好,想在詢問以下幾個問題
1. 想請問以下程式運行的流程是否正確
Python :
.py 程式–> Python 直譯器–> 中介碼 –> Standard 虛擬機 –> 輸出動作–> 呼叫Linux System Call–> Linux –> 硬體執行
MicroPython :
.py程式–> MicroPython 直譯器 –> 中介碼 –> 微控制器虛擬機–> 輸出動作 –> 硬體執行
2. 想請問為什麼MicroPython 的需要的運行環境空間跟Python 會差這麼多? 一個只要256K 另外一個大概需要16~20MB, 請問主要是因為Library 的差異嗎?
非常感謝
1. 正確
2. 因為目的和環境不一樣,就像日月潭的觀光遊艇不能和大海航行的郵輪相提並論,日月潭也無法容納郵輪這個龐然大物。MicroPython的專案網頁有提到它和電腦版CPython的不同點。由於微控器的資源有限,所以MicroPython無法實做所有Python 3的標準程式庫,耗用大量記憶體模組,例如sqlte3資料庫,或者需要硬體支援的功能(如:多處理器平行處理)也不支援。
thanks,
jeffrey
赵老师,您好,在15章中,您提到用SPI读写SD卡,请问在Wemos mini D1中如何读写Winbond-W25Q32-SPIFlash,我从网上pyboard中相关代码(https://github.com/manitou48/pyboard/blob/master/spiflash.py),但不会移植到esp8266中,烦请您指点。
我手边没有这个Flash芯片所以无法测试。建议先查找该芯片的技术文档,大致了解它的通讯协议,然后对照pyboard的SPI Flash代码。
因为pyboard和ESP8266版的MicroPython完全相同,所以移植代码应该蛮简单的。只是pyboard有它专属的对象(库),像控制脚位的pyb.Pin、计时器pyb.Timer…你要自己将它替换成ESP8266版本。
good luck!
jeffrey
老師您好
我按照範例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
請問我哪裡出錯。
實驗MicroPython程式時,你可以:
1. 直接在終端機輸入或貼入原始碼(請參閱3-16頁)
2. 使用ampy上傳在電腦端編輯好的Python程式檔並立即執行(請參閱3-20頁)
實驗成功後,要讓自訂程式在微控制板開機後自動執行,請將程式檔命名成main.py,上傳到控制板(參閱1-32頁第二段,以及14-7頁)
thanks,
jeffrey
老師您好,我在網站購買這本書的零件包,但我不確定這塊d1 mini版是哪個型號,所以驅動程式我CH340G 和CP2102都下載了,但是用microUSB連接到筆電,裝置管理員內沒有出現連接阜,請問怎麼辦呢?謝謝><
當你接上控制板時,Windows系統會自動找尋並下載驅動程式;如果接上控制板,裝置管理員沒有顯示新增裝置的話,請先確定:
1. 控制板在接上USB時,上面的LED有閃爍一下,代表有通電。
2. 有些microUSB線材只是電源線,也就是只接兩條線,資料傳輸線沒有接;請更換USB線再測試。
thanks,
jeffrey
謝謝老師。真的換一條線就自動搜尋到了 !
感謝告知!
thanks,
jeffrey
老師您好
範例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))
但還是不行
請問還有什麼原因呢??謝謝~
如果連接DHT22,用第七章的程式測試無誤,那問題應該是出在伺服器程式來不及同時應付用戶的連線和DHT資料請求,請嘗試把「用戶連線請求」和「讀取DHT感測器」的敘述分開執行。
例如,DHT22改用定時方式讀取。先引用Timer(參閱第八章說明):
溫濕度值改存在全域變數cache裡面:
每5秒更新溫濕度值:
處理用戶連線請求時,不再即時讀取DHT感測器:
請測試看看。
thanks,
jeffrey
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
請嘗試降低燒寫速度,例如改成460800,應該可以解決這個問題。
thanks,
jeffrey
老師 :
上傳完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.
>>>
請問這是什麼問題呢?? 謝謝~
真奇怪~如果上傳書本的範例檔也會出現類似的錯誤,請清空快閃記憶體再嘗試看看。
thanks,
jeffrey
請問老師
使用PuTTY 時終端一片黑, 如書上指示(P1-32)按Ctrl+D 没有反應
是那個地方有問題呢?
請問按下板子上的Reset鍵,有出現MicroPython的訊息嗎?如果沒有,應該是MicroPython韌體沒有燒錄好,請降低燒錄速度試試看。
thanks,
jeffrey
老師您好
之前燒錄正常,
重新再燒錄一次(baud 115200) 也没有異常訊息
但使用Putty 時仍是黑畫面
也有按下Reset 鍵, 但仍一樣黑畫面
再麻煩了
Thanks
補充:
按下Reset 鍵,畫面有出現一堆亂碼
請確認燒錄韌體的參數是否正確,例如,快閃記憶體的選項是32Mbit。另外,PuTTY預設的連線速度要選擇115200。
thanks,
jeffrey
老師您好
我改用Flash 燒錄(之前用esptool) , 完成後仍是黑畫面
按Ctrl+D没有反應
按下Reset 鍵後,此次有跑出訊息了, 和書上的資訊相同
但键盤輸入全無反應
請問可能是什問題呢?
Thanks
請改用附錄A介紹的Tera Term或uPyCraft試試看,再不行的話,我懷疑是硬體有瑕疵。
thanks,
jeffrey
已經OK 了
謝謝老師幫忙
感謝告知!
thanks,
jeffrey
老師,請問依照3-20 用ampy指令,每次執行指令都會造成D1 mini重開機,
(不論是ls, put, rm等指令,都會重開機,但命令都有執行成功。)
這是正常的情形嗎?
謝謝!
不正常…我手上幾個ESP8266板子都沒有出現執行ampy後重新開機的現象。
thanks,
jeffrey
赵老师,大陆何时可以出版?想买一本超图解python物联网实作入门,可是无法访问台湾地区网站购买,不知道赵老师能否代发一本邮寄大陆呢?我可以支付宝转账给您。
感谢您的关注,我目前没有计画出版简体版。我已经委托朋友跟您联系,谢谢!
thanks,
jeffrey
老师您好!我也非常希望能买到《超图解python物联网实作入门》,能否也麻烦您帮忙邮寄一本呢?坐标是广东省,谢谢您!
感谢您的关注,我已经委托朋友跟您联系,谢谢!
thanks,
jeffrey
請問書上python 完整CODE那里可下載
寫在序言頁的後面,謝謝!
thanks,
jeffrey
超圖解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’
>>>
ImportError: no module named ‘bigSymbol’
代表找不到名叫 ‘bigSymbol’ 的模組
請參閱12-31頁,上傳bigSymbol.py檔到控制板。
thanks,
jeffrey
感謝老師說明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’
拍謝,bigSymbol.py程式檔裡的所有這個敘述:
self.oled.framebuf.blit(fb, x, y)
都要改成:
self.oled.blit(fb, x, y)
或者,請重新下載書本的範例檔(於三月更新),謝謝!
thanks,
jeffrey
在請問老師這個問題,一 顆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. 請問另一個ESP8266板子的程式,是否有import dht敘述?
2. 程式檔名請不要跟程式模組同名,例如:DHT.py。
thanks,
jeffrey
抱歉老師昨天有事今天才回應!兩個板子傳送同一個程式,一個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]
報告老師可以了!我的import DHT大寫錯誤,改小寫即可
感謝告知!
thanks,
jeffrey
再請教一問題,我目前需要用到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)
我用ESP8266測試,燒錄1.10.x版韌體測試UART功能,序列埠也沒有反應,改用1.9.x版則正常。
thanks,
jeffrey
抱歉我用網路最後1.9.?版本通訊還是無法成功,不知道老師使用哪個版本?哪裡可以下載?
從micropython.org官網的ESP8266下載連結,可下載各個版本,我使用1.9.4版。
thanks,
jeffrey
之前這個程式可以執行,最近重新上傳到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’
為什麼錯誤訊息看起來不像是在控制板上執行的Python?請在控制板的REPL模式執行import urequests看看有沒有錯誤。
thanks,
jeffrey
>>> import urequests
Traceback (most recent call last):
File “”, line 1, in
ImportError: no module named ‘urequests’
請問你的microPython是那一版?我測試沒問題:
thanks,
jeffrey
老師終於發現問題,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,
不好意思,我目前都只有在ESP8266上執行MicroPython。
thanks,
jeffrey
再請教老師一個問題?在書上的範例程式,老師您是用甚麼軟體編輯及燒入?
我使用VS Code編寫Python程式,貼入PuTTY測試或用ampy上傳到控制板測試。
thanks,
jeffrey
老師您好
依課本6-8頁啟用WebREPL,
import webrepl_setup 輸入連線密碼…等操作後,從我筆電wifi連接D1板(AP模式)後,
開啟webrepl ; connect後,出現 password,凍結但無法輸入密碼,請問我哪個步驟出錯?
謝謝
剛剛在ESP8266上燒錄10.8版韌體,上傳設置wi-fi連線的boot.py、透過PuTTY啟用webrepl並設定密碼。連線測試沒問題。
請嘗試在PuTTY中按下Ctrl+D軟重置之後,重新整理瀏覽器畫面,再度連線試試看。
thanks,
jeffrey
感謝之前老師的解惑,最近測試第17章節程式,解析查詢字串的運用也完全沒問題。學生有個需求從232讀取rdif裝置後,再透過POST方法傳遞資料,但因為呼叫def main()後,ESP已無法執行其他程式(沒有呼叫時執行其他程式),不知道可以修改程式達到此要求嗎?如何寫?
可以在main()當中執行無限迴圈,不停地讀取RFID資料,只要有數值進來,就將它發送出去。
thanks,
jeffrey
我試了幾個地方沒有用!以底下程式中哪裡可以執行無限迴圈,執行我要的動作(如讀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())
我再測試幾個方式確認,一旦呼叫main()程式執行到client = s.accept()[0]指令後,ESP會等待到有人用網址下指令後,執行傳送的指令並回傳後,才會離開main()程式,有無方法偵測有人下網址時,才進行執行main()程式,其他時間就可以執行其他事情,舉例通訊有資料時(u.any())才進行接收,只是不知道可不可以這要寫程式?
我原本以為你的程式需求是讓控制板當作前端:當感應到RFID時,用POST方法傳送給某個伺服器。我本週會抽空更新文章說明避免accept()佔用整個迴圈的方法。
thanks,
jeffrey
感謝老師的更新!如果不用佔用整個迴圈,其實可以運用很多的功能,如顯示目前連線人數,已連線的時間等等,這樣ESP的實用性就更棒,再次感謝老師的解惑。
老师 大陆有没有购买链接,你的几本书我都买来学习了,这本超图解Python物联网实作入门的购买链接可以给我吗?
我不知道哪个台湾或香港书店不被和谐,我再请朋友跟你联系,谢谢!
thanks,
jeffrey
請問老師?不知道”抽空更新文章說明避免accept()佔用整個迴圈的方法”,甚麼時候可以完成,我剛剛重新下載範例程式,跟以前程式一樣沒有修正?
五天前我就已經發布「Python的非阻塞式(non-blocking)socket通訊程式(一)」這篇文章,這是完結篇。
thanks,
jeffrey
老師的專業真的很厲害!之前請益的問題目前都已解決,目前正在學習書上所提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())
抱歉老師!學生學藝不精就亂發問題,其實老師後面有教需要燒韌體,因為我只顧著買硬體,忘記詳讀後面的說明,剛剛燒韌體後即可以搜尋到了,再次抱歉!造成困擾深感抱歉。
不客氣,感謝告知!
thanks,
jeffrey
老師您好:我在實驗diy7_1.py的動手做時,一直出現OSError: [Errno 110] ETIMEDOUT的錯誤訊息,我試著用終端機及upycraft兩種方式跑書中的範例檔以及更改time.sleep(5)的時間都無法正常運作,請問老師我還可以做那些與修正?
出現OSError: [Errno 110] ETIMEDOUT錯誤,
原因通常是控制板收不到DHT11模組的訊號。
我遇過有問題的DHT11模組,
透過三用電錶的歐姆檔測試DHT11元件的接腳和模組的輸出接腳,
發現是「虛焊」,也就是模組的接腳焊接不良,
重新焊接之後就好了,
DHT11元件本身沒有故障。
我還遇過「連接線沒有導通」的情況,
也就是斷線了,但是導線外表(橡膠)看不出來。
thanks,
jeffrey
感謝老師的回覆,老師回覆後,我做了下列的嘗試:(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的運作有關…@@,最後還是再次感謝老師撥空回覆,謝謝老師。
感謝告知~我剛剛在D1 mini板子上燒錄全新的MicroPython韌體(1.11版),沒有修改boot.py,接第2腳執行diy7_1.py並沒有問題。如果在你的板子的第2腳接開關或LED,嘗試輸入或輸出控制,可以順利執行嗎?
thanks,
jeffrey
老師你好:
目前學習到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
匯入程式庫的敘述,如果寫成:
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
請問一個問題,
是否有可能用python的pyserial直接控制或讀取燒錄了micropython的firmata之ESP8266呢?
如果你有microPython的firmata前端程式的話,就可以在電腦端透過pyFirmata程式庫與它交流,直接用pyserial的話,你要自行編寫解析Firmata協議的程式。
thanks,
jeffrey
老師你好~~您有接專案開發嗎?(物聯網雲+8266開發)細節我門在MAIL裡面說明~~
謝謝您的來信,我目前沒有承接專案。
thanks,
jeffrey