(2022/10/15)
主題:NodeMCU與物聯網入門
時間:2022.10.15、16兩天的 13:00~17:30
地點:建工校區 育賢樓 4樓 育400教室
講師:黃文玉老師 (shspswenyu@gmail.com)
高雄市新上國小電腦老師
高雄市SCRATCH推廣教師
教育部中小學教師運算思維增能研習種子教師
Facebook S4A社團管理員之一
第一屆聯發科 2022 STEM造課師
致力Scratch、Arduino、micro:bit、Web:Bit、凱比機器人等程式教育及創客教育的推廣(分享一系列的文章)
一、認識ESP32
前一代晶片是ESP8266(可以連上網的晶片)
參考文章:
各開發板所使用的模組
樂鑫科技(ESPRESSIF):開發ESP32晶片 (工作電壓:3.0~3.6V)
主要特色:雙核心、32位元、支援Wi-Fi(2.4GHz)與藍牙低功耗通訊(4.2版)
樂鑫科技(ESPRESSIF):整合【ESP32-D0WDQ6雙核心系統單晶片】+【石英震盪器】+【4MB快閃記憶體(flash)】,組成一個【ESP32-WROOM-32模組】
最高階是ESP32-WROVER,主要是比ESP32-WROOM多了8MB的PSRAM的設定
各開發商:將【各類WROOM模組】+【直流電源降壓元件】+【UART轉USB通訊晶片】,就能組成一個基本的ESP32開發板。
Web:Bit:ESP32-WROOM-32
PocketCard:ESP32-WROOM-32D
DOIT NodeMCU:ESP32-WROOM-32
NodeMCU-32S:ESP32-WROOM-32
HaloCode:ESP32-WROVER
...
晶片/模組/開發板的關係,可從下面腳位那張圖中看出
我玩過的ESP32開發板
Web:Bit開發板
Webduino(慶奇科技)推出,高雄市前瞻計畫購買,很多學校都有
官方程式編輯軟體
Web:Bit教育版網頁版:https://webbit.webduino.io/blockly/?demo=default
Web:Bit教育版安裝版:可用USB連線、設定WIFI及韌體回復原廠,如果要將程式寫入板子,又要回復原廠,一定要裝安裝版!
各內建元件所使用的腳位及金手指腳位與GPIO的對照圖(很重要)
https://webbit.webduino.io/tutorials/doc/zh-tw/education/index.html
金手指腳位與micro:bit相容
PocketCard開發板
高雄凱斯電子推出 https://www.buyic.com.tw/product_info.php?products_id=7003&Twesid=1iht42nl67l0f5lp78vlg1oml0
官方無提供編輯軟體,但提供第三方的作法:https://kaise-ksrobot.github.io/docs/ch/MCU/ESP/PocketCard/PocketCard_home.html
前陣子九軸感測器(MPU9250)漲價改版成Lite版,將9軌改3軸(MSA301)
一樣要知道各內建元件所使用的腳位及金手指腳位與GPIO的對照圖
金手指腳位與micro:bit相容
Halocode(光環板)開發板
大陸Makeblock推出 https://mblock.makeblock.com/zh-cn/
官方程式編輯軟體
mblock5線上版:https://ide.makeblock.com/
mblock5安裝版
該公司另外一塊【童芯派】也是使用ESP32晶片
NodeMCU-32S (38隻腳位),今天上課的主角
Aithinker 安信可科技
尤濬哲老師推薦
不是DOIT NodeMCU (30隻腳位,體型比NodeMCU-32S大一點點,而且沒有5V輸出),不要買錯!
官方有 V1.2 及 V1.3 兩款,兩者差別在 usb 晶片不同. V1.2 -> CP2102 (價格較高) , V1.3 -> CH340 (便宜好用) 一般使用上無太大差異
腳位圖 :
下圖取自夜市小霸王尤老師 https://youyouyou.pixnet.net/blog/post/119410732
腳位36根,扣除系統使用約10根,還有約26根可用,腳位說明如下圖
下文取自夜市小霸王尤老師 https://youyouyou.pixnet.net/blog/post/119410732
這裡特別說明,如果你用過ESP8266系列產品,你會發現8266最大的問題是他的類比只有1個,而ESP32則有18個ADC,也就是說有18個腳位是不分數位類比,直接使用analogRead或digitalRead就可以分別做類別或數位讀取,光這點優勢你就可以換掉ESP8266了。
GPIO 6,7,8,9,10,11:與模組內部快閃記憶體(flash)相連,我們的程式無法使用這些腳位(最下方,兩邊各3腳位,淺灰色標示)
一般數位輸入與輸出腳位:
GPIO2、4、5、12~19、21~23、25~27、32、33,共19個
與ADC有一些腳位不同:5、16、17、18、19、21、22、23 (這些只能數位?)
18 x Analog-to-Digital(ADC):類比訊號輸入腳位(粉紅色標示)
可接類比或數位感測器 (雖然是類比,也可接數位感測器)
腳位如下:GPIO4、0、2、15、13、12、14、27、26、25、33、32、35、34、39、36,還有37、38(NodeMCU-32S沒有這兩個腳位)
GPIO 34,35,36,39:Input only(只能做輸入,不能作為輸出腳位,也就不能做PWM了)
3 x UART interfaces:藍芽、相機(不限腳位編號)
RX0(接收):GPIO3、TX0(發送):GPIO1(預設)
RX1:GPIO9、TX1:GPIO10 (不能用)
RX2:GPIO16、TX2:GPIO17
其實ESP32的UART介面可連接到任何接腳
2 x I2C interfaces(SDA,SCL) and I2S interfaces:LCD、氣壓、陀螺儀
SCL:GPIO22、SDA:GPIO21(預設)
SCL:GPIO17、SDA:GPIO16
3 x SPI interfaces(MOSI,MISO,SCK,SS):高速資料傳輸 SD card, TFT, RFID(藍色標示)
MOSI:GPIO23、MISO:GPIO19、SCK:GPIO18、SS:GPIO5(預設)
MOSI:GPIO13、MISO:GPIO12、SCK:GPIO14、SS:GPIO15
MOSI:GPIO8、MISO:GPIO7、SCK:GPIO6、SS:GPIO11 (不能用)
10 x Capacitive sensing GPIOs:觸摸感測器,提供觸控電容(棕色標示)
腳位如下:GPIO4、0、2、15、13、12、14、27、33、32
16 x PWM output channels:數位輸出也可類比輸出(不限定腳位編號,但需要宣告channel)
2 x Digital-to-Analog Converters (DAC):不太需要用
內建LED燈:GPIO2
EN(左邊編號18):重開機
還有一些個人遇到的問題(不清楚原因,但會搞死你)
1. DHT11不可以用GPIO 5、26
2. GPIO 12, 2燒錄時不可接任何裝置,請空接,燒錄完成後,再接回,否則會上傳失敗。
3.WiFi啟動後,2,4,12,13,14,15,25,26,27僅能數位讀取,無法使用這些類比輸入腳
由於我們這次使用擴展板來教學,所使用的元件腳位廠商都已經定好了,所以上面不了解也沒關係!
針對ESP32我使用過的軟體
積木式程式平台:
給中小學生或非專業人士用
其實把積木程式轉為
C語言,
再進行編譯及上傳,程式要花比較久的時間
下面的平台大都屬於此
MicroPython
直接上傳,花的時間很少
microBlock程式平台(本次上課以此平台的程式撰寫為主)
PictoBlox:建構在Scratch下的積木程式(印度公司)
這適合國小學生的使用,我玩Arduino也是用此軟體
mblock5:建構在Scratch下的積木程式(大陸公司)
bDesigner
桃園市八德國小蔡佳倫老師自行研發
motoBlockly
慧手科技提供
https://www.motoduino.com/wp-content/themes/storefront/moto_iot_blockly_v60/demos/code/index.html
BlocklyDuino
聯發科公司針對Linkit 7697所推出的積木程式(目前好像已停止更新了)
經過法蘭斯、劉正吉、ICSHOP幾位大神加以改良及增加很多積木讓功能更加完善
我現在大都用這個!(上學期開課時就打算用這個來教學,但上學期我因居家隔離,所以課程來延到今天,但後來有發現更簡單的東西,所以就不用這個來教學了!)
C語言
Arduino IDE:大都專業人士在使用
MicroPython語言
Python
直譯式語言
直譯語言(英語:Interpreted language)是一種程式語言類型。這種類型的程式語言,會將程式碼一句一句直接執行,不需要像編譯語言(Compiled language)一樣,經過編譯器先行編譯為機器碼,之後再執行。
認識Python語法:
等一下利用microBlock平台來執行Python程式
Thonny平台
下載【可攜帶版】即可,如 thonny-4.0.1-windows-portable.zip
MicroPython
使用在開發板的直譯式語言
要先上傳韌體(Python執行程式),程式上傳時間很快
參考資料:https://sites.google.com/site/wenyunotify/05-esp32/05-micropython
microBlock程式平台(本次上課以此平台的程式撰寫為主)
把積木程式轉為MicroPython語言
詳細使用說明如下:
二、microBlock的使用
認識microBlock
詳細內容參考:01 認識microBlock
利用積木程式來寫 ESP32 MicroPython 程式
microblock.app 官網:https://microblock.app/ (泰國網站)
台灣推廣網站:
由陳豐生先生 (Mason Chen)及蔡亞柏老師維護
ESP Gyro擴充板:https://sites.google.com/view/esp-gyro/mblock
microBlock中文版下載:
從【ESP Gyro擴充板】官網,下載客制化的 microBlock中文版:https://reurl.cc/ZAyVEl
使用我提供的:https://educase.kh.edu.tw/navigate/a/#/s/ABE60CED43CD4CE9B280B22C16BA94946BL
為 windows 的離線版本,解壓後(儘可能放至根目錄下(C:或D:),路徑不要太長)
打啟 microBlock IDE.exe ,可在桌面做此檔的捷徑
安裝NodeMCU-32S的驅動程式
如果電腦沒有抓到NodeMCU-32S,再安裝以下驅動程式(可從【裝置管理員】得知是否有抓到)
V1.2 -> CP2102 :https://educase.kh.edu.tw/navigate/a/#/s/5D80266AE7D34F859B15031691F88B2F6BL
V1.3 -> CH340 :https://educase.kh.edu.tw/navigate/a/#/s/DD4DC31A1D644C08ABA3F695BC1F63506BL
使用前的準備工作
第一件事是【更新ESP32的韌體】
先玩玩Python的基本語法
單行註解
使用#字號
#print("hello")
多行註解
使用一組 三個雙引號包起來
"""
aaa
bbb
ccc
"""
斷行處理
\n 斷行
print("hello\nworld")
輸入
score = input("請輸入你的成績:")
score = int(score)
if score >= 60:
print("及格")
else:
print('不及格')
我的第一個程式
認識【數位】/【類比】、【輸入】(讀取)/【輸出】(寫入)
數位:0、1(off 、on)不是0就是1
類比:數位以外的就是類比,像溫度有高低、聲音有大小
輸入(讀取):取得外面的訊息(好像外面控制電腦,如電腦的輸入裝置,如:鍵盤(按鍵)
輸出(寫入):輸出訊息給外部(好像對外部的控制,如電腦的輸出裝置,如:開關LED燈
讓內建LED燈一亮一滅
內建LED燈的腳位是GPIO2
高電位(3.3V,1,ON)/低電位(0V,0,OFF)
寫上如下程式:
簡單程式撰寫說明(如迴圈、等待...)
撰寫程式的三個主要結構:
循序結構
重複結構
選擇結構
這平台的另一個好處是可以把【積木程式】轉為【MicroPython程式碼】
補充說明:
更新韌體:就是在ESP32上安裝python程式及相關檔案
上傳檔案:就是把寫好的程式轉成python檔,然後存成main.py,將main.py及使用到的外掛模組,一併上傳到ESP32裝置去!注意:main.py檔是ESP32開機時會去執行的檔案(先boot.py,然後main.py)
可利用Thonny來進行ESP32裝置的檔案管理
EZ Start Kit+擴展板的使用
為方便外加元件的使用,減少自行接線所產生的錯誤,因此採用【擴展板】
Ez Start Kit+是高雄廠商ICShop的商品 https://www.icshop.com.tw/product-page.php?28443
小試身手一下
小試身手一:那你會不會點亮擴展板上的紅(GPIO16)、黃(GPIO12)、綠燈(GPIO13)了?
使用擴展板上的元件時,大都要從擴展板來供電
小試身手二:模擬紅綠燈的亮燈情形(評量一)
綠燈:5秒
黃燈:1秒
紅燈:3秒
利用【終端機】顯示資訊
【終端機】相當於序列埠監控視窗,是有用的小工具,方便一些資訊的顯示提供
NodeMCU-32S不能離線(必需用USB線與電腦連接,才能使用【終端機】)
終端機可以顯示中文
認識【數位】/【類比】、【輸入】(讀取)/【輸出】(寫入)
在終端機顯示
可變電阻(GPIO34)的值:類比輸入
光敏電阻(GPIO39)的值:類比輸入
按鍵A(GPIO5)的值:數位輸入
發現:
類比腳位具12位元解析度,讀值介於0~4095(2^12-1)
可變電阻器的值為0(順時針到底)~4095(逆時針到底)
光敏電阻的值為0(全暗)~4095(最亮)
按鍵的值:未按下時為1、按下時為0
在終端機顯示
顯示目前環境的溫度及濕度值
DHT11溫濕度感測器的腳位(GPIO15)
選擇結構的使用
如果...,就...,否則...
按A鍵啟動【繼電器】、按B鍵關閉【繼電器】
各元件的腳位
A鍵:GPIO5、B鍵:GPIO36
繼電器:GPIO25
繼電器是以小(電壓)摶大(電壓)的電子元件,如要啟動接市電的電器設備時,就要使用到它
按A鍵一下啟動【繼電器】、再按A鍵一下關閉【繼電器】
按A鍵點亮紅燈、按B鍵點亮綠燈、鍵A+B鍵關掉紅燈及綠燈
各元件的腳位
A鍵:GPIO5、B鍵:GPIO36
紅燈:GPIO16、綠燈:GPIO13
小試身手一下
現在的路燈系統或家中的小夜燈,到晚上時會自動點亮,白天時自動關閉
請你設計一個【天黑請開燈】的系統(評量二)
白天時,紅燈(或三顆燈)關閉;晚上時,紅燈(或三顆燈)點亮
蜂鳴器的使用
蜂鳴器腳位(IO0):GPIO14
播放全家便利商店歡迎音樂
簡譜:3 1 5(低音) 1 / 2 5~ 2 / 3 2 5(低音) 1
所使用的頻率:330、262、196、262、294、392、294、330、294、196、262
音階頻率表如下:
程式如下:
有兩種方法,方法2好像比較簡單一點
燈條的使用
WS2812B晶片,只占用1個腳位(IO16)GPIO26
點亮燈條上的燈
讓燈條上的燈一直向右跳動
紅外線遙控器的使用
紅外線接收器(IO3):GPIO33
取得遙控器按鍵的【編碼值】
利用【KEYES遙控器】的方向鍵編碼值
上:70
下:21
左:68
右:67
OK:64
按KEYES遙控器的方向鍵
按上鍵,全亮燈
按下鍵,全滅燈
按左鍵亮紅燈
按中鍵(OK鍵)亮黃燈
按右鍵亮綠燈
小試身手一下
小試身手一:按鍵開燈;按同一鍵關燈(上面教過)
OLED顯示器的使用
OLED顯示器的規格為I2C腳位(SCL:GPIO22、SDA:GPIO21)
解析度為128*64
顯示英文字、數字、畫直線、矩形、圖案
測試後發現:
座標起點為文字的左上角
【英文及數字】積木,每個字寛度8,且只顯示一行,超過的部份不會出現
【大型數字】積木每行可顯示6個數字或7個英文字,超過一行時會往下一行
【顯示圖像】積木很方便,直接上傳一張圖片就可以用黑白的方式顯示
顯示中文字
先建立所要顯示的點陣文字(中文、英文、數字)
到以下路徑去 microBlock.IDE.V2.2.0_Gyro_V1.5d\resources\app\extension\2e-OLED-extension-8\modules
執行fetch_big5_word.exe(建font11字型的圖檔)及fetch_big5_word24.exe(建font24字型的圖檔)
完成後就可以寫程式了
顯示QRCode
直接使用範例檔
左圖:我的手機掃不出來,可能原設計是針對0.96吋的OLED來設計,而這邊的1,3吋的OLED
右圖經反白處理:程式如下,我的手機還是掃不出來