1 of 207

智能機電整合開發板

Pomas V2

簡良諭

liangyuh@gmail.com

2024.10.10

2 of 207

研習資源

Genio Py.教學資源(V2.0)

3 of 207

腳位表

F3

F2

F1

F0

C3

C2

C1

C0

E3

E2

E1

E0

E7

E6

E5

E4

C15

C14

C13

C12

腳位編號

寫法

>>> led = Pin( 8 , Pin.OUT )

物件名稱

腳位編號

>>> led = Pin( 'E0', Pin.OUT )

物件名稱

腳位編號

>>> led = PWM( 0, freq=500, duty=0)

物件名稱

腳位編號

PWM編號

PWM3

PWM2

PWM1

PWM0

4 of 207

課程內容

5 of 207

Pomas V2外觀圖

6 of 207

腳位對照圖

物件宣告寫法

>>> led = Pin( 8 , Pin.OUT )

物件名稱

腳位編號

>>> led = Pin( 'E0', Pin.OUT )

物件名稱

腳位編號

>>> led = PWM( 0, freq=500, duty=0)

物件名稱

腳位編號

F3

F2

F1

F0

C3

C2

C1

C0

E3

E2

E1

E0

E7

E6

E5

E4

C15

C14

C13

C12

IC腳位編號

PWM

PWM3

PWM2

PWM1

PWM0

7 of 207

  1. Pomas開發板 V2

8 of 207

課程1

9 of 207

認識Pomas開發板

10 of 207

Pomas V2外觀圖

11 of 207

輸出/入腳位對照圖

寫法

>>> led = Pin( 8 , Pin.OUT )

物件名稱

腳位編號

>>> led = Pin( 'E0', Pin.OUT )

物件名稱

腳位編號

>>> led = PWM( 0, freq=500, duty=0)

物件名稱

腳位編號

7

6

5

4

3

2

1

0

11

10

9

8

15

14

13

12

F3

F2

F1

F0

C3

C2

C1

C0

E3

E2

E1

E0

E7

E6

E5

E4

LED3

LED2

LED1

LED0

C15

C14

C13

C12

IO腳位

IC腳位編號

PWM

PWM3

PWM2

PWM1

PWM0

12 of 207

支援軟體

  • 支援 MicroPython程式語言。
  • 支援 C 及 C++ 語言
  • 運用邊緣運算結合各式人工智慧。
    • 人臉辨識
    • 語音辨識
    • 手式辨識
    • 色球辨識

13 of 207

安裝驅動程式

14 of 207

安裝驅動程式

  • 驅動程式下載網址: https://www.geniopy.com.tw/dl/Driver/
  • 進入網址,下載「GPCDCDriverInstaller.msi」檔案

15 of 207

連接 USB 傳輸線並檢查連接埠編號

16 of 207

燒錄韌體更新

17 of 207

韌體燒錄更新

V2韌體下載網址: https://www.geniopy.com.tw/updates.html

1.將開發板「SW2」開關的2號腳位撥到ON位置,按「Reset」鈕將開發板重新啟動

重要提醒:如果Pomas開發板現在使用上很穩定沒有任何問題時,其實並不一定要一直操作更新韌體,可以當有新的需求時再進行更新。

18 of 207

韌體燒錄更新

2. 進入網址https://www.geniopy.com.tw/dl/pomas_firmware/ ,點選「更新工具」。

3. 下載「更新工具(Code_Ver12335).zip 」檔案並解壓縮

4. 進入「更新工具/USBMassProductionTool_For_GPL329XX」資料夾,6. 執行「 G+MassProductionTool For GPLXXxx.exe」。

19 of 207

韌體燒錄更新

5. 系統會自動偵測代入USB連接埠,按「Start Download」鈕。

6. 韌體燒錄完成(100%)後,按「Stop Download」鈕,離開更新程式。

7. 記得將開發板「SW2」開關的2號腳位撥到OFF位置,按「Reset」鈕將開發板重新啟動

20 of 207

燒錄韌體流程圖

21 of 207

燒錄完成

22 of 207

Thonny軟體

23 of 207

Thonny Python IDE

Thonny是一個免費的Python整合開發環境(IDE),也就是提供編碼、直譯/編譯和除錯的撰寫程式整合環境,主要目的是在簡化Python編程的過程。

  • Thonny官網: https://thonny.org/

24 of 207

安裝Thonny

25 of 207

繁體中文化

26 of 207

Thonny Python IDE操作界面

  • 點擊功能表「開始/Thonny」啟動Thonny。
  • 整合開發環境(IDE)分成上下二部分,上方是程式編輯區,下方是互動環境(Shell)區。

27 of 207

設定 Thonny

28 of 207

快速測試

29 of 207

REPL互動環境(Shell)

REPL代表「Real Eval Print Loop」,是一種常見的互動式編程環境。REPL環境允許用戶輸入代碼,立即執行它並返回結果。它通常包括以下部分:

  • Read(讀取):REPL環境會讀取使用者輸入的程式碼。
  • Eval(求值):REPL環境會評估使用者輸入的程式碼,並計算出結果。
  • Print(輸出):REPL環境會將結果輸出到屏幕上,以供使用者查看。
  • Loop(循環):REPL環境會一直循環,等待使用者輸入新的程式碼。

30 of 207

執行撰寫程式

  • 點選功能表「執行/執行目前程式」或按F5鍵。
  • 下方互動環境(Shell)視窗就可看到程式執行結果。

31 of 207

編輯環境設定

  • 點選功能表「工具/選項」
  • 點選「主題和字型」頁籤,調整介面主題、編輯器字型、輸入輸出字型及尺寸。

32 of 207

電子元件篇

33 of 207

課程2_1

34 of 207

課程2_2

35 of 207

電子元件接線

電子元件接線

以上述的例子,電路上放上的紅色LED燈時,則接線方法如下

  • 把LED燈的長腳及短腳分別插入麵包板中。
  • 把控制板上的GND腳位用杜邦線連接到接到LED燈的短腳(負極)
  • LED的長腳(正極)透過把電阻(220歐姆)接到開發板的3.3V腳位。

註: 電阻不分正負極

36 of 207

  1. 開發板內建LED燈

37 of 207

直譯器設定

  1. 點選功能表「執行/設定直譯器」。
  2. 選取「MicroPython(一般)」。
  3. 依開發板的USB序列裝置選擇連接埠後,按「確認」鈕。
  4. 在互動環境(Shell看到「GP329XXXA」文字,就表示和Pomas開發板連接成功。

38 of 207

開機自動腳本

Pomas開發板可以點選所撰寫的程式來執行,但是若是想要在Pomas開發板開機時就自動執行指定的程式時,可以採取以下方式:

  • 當Pomas系統開機或重置時,如果SD卡中有boot.py這支程式時,系統就會第1優先直接自動執行boot.py。
  • 當SD卡中有main.py這支程式時,系統會第2優先自動執行。

所以只要撰寫的程式檔案

  • boot.py 第1優先
  • main.py 第2優先執行。

39 of 207

接線說明

本例的LED燈已內建在Pomas開發板上,故不用接線。

40 of 207

程式碼

from machine import Pin

from gpb import delay

L0 = Pin(‘C12’, Pin.OUT )

while True:

L0.on()

delay(1000)

L0.off()

delay(1000)

41 of 207

02. 外接LED燈

42 of 207

實作說明

設計一個外接LED燈程式,符合以下要求:

  • 透過麵包板方式,外接LED燈。
  • LED燈呈現閃爍的警示燈,重覆地一秒LED燈亮、一秒LED燈暗。

註: 本單元主要目的在學習利用麵包板、杜邦線進行簡單的電路接線。

43 of 207

開發板內建限流電阻

44 of 207

接線說明

  • LED燈長腳 接 8號腳位。
  • LED燈短腳 接 GND腳位。

45 of 207

程式碼

from machine import Pin

from gpb import delay

led1 = Pin( 8, Pin.OUT)

while True:

led1.value(1)

delay(1000)

led1.value(0)

delay(1000)

46 of 207

03. PWM呼吸燈

47 of 207

實作說明

設計一個呼吸燈的程式,模仿人類的呼吸動作,符合以下要求:

LED燈重複地慢慢地亮起後又慢慢地變暗。

註: 部分LED燈只能作為數位輸出,現今大多的LED燈已能作類比輸出。

48 of 207

PWM腳位

Pomas的GPIO腳位都是數位輸出/輸入,也就是只能輸出0或1值。

  • 在開發板上的GPIO的編號8,9,10,11的號碼前方都有一個「~」符號,這表示這幾個腳位使用了PWM(Pulse Width Modulation)脈衝寬度調變技術,PWM編號分別為0,1,2,3
  • PWM技術可以將數位腳位「模擬」為類比腳位,使它們可以讀取或寫入浮點數值,而不是只有0和1這二個數值。

49 of 207

PWM物件

在 MicroPython 中,要建立一個 PWM 物件,需使用PWM類別,並指定引腳、頻率和佔空比等參數。其語法如下:

led = PWM( N , freq , duty )

例如:

建立一個命名led1的PWM物件,使用引腳8作為PWM輸出(引腳的PWM編號為0),設置PWM頻率為500Hz,週期比值為0。

from machine import PWM

led1 = PWM( 0, freq=500, duty=0)

其中PWM有3個重要參數: N(PWM編號)、freq(頻率)、duty(佔空比)

  • N: PWM編號, 腳位8,9,10,11的PWM編號分別0,1,2,3
  • freq : 指 PWM 的頻率,PWM 信號的週期數,單位為 Hz(赫茲)
  • duty: 佔空比, 可以視為電壓強度比例, 主要控制LED亮度

50 of 207

接線說明

  • 長腳 接 8號腳位。
  • 短腳 接 GND腳位。

51 of 207

程式碼

from machine import PWM

from gpb import delay

led = PWM(0, freq=500, duty=0)

for i in range(5):

for n in range(0, 500, 50):

led.duty(n); delay(500)

print(n)

for n in range(500, 0, -50):

led.duty(n); delay(500)

print(n)

52 of 207

04. 按鈕開關

53 of 207

實作說明

設計一個利用按鈕來控制LED燈的亮與暗的程式,符合以下要求:

  • 按下按鈕時,燈亮
  • 放開按鈕時,燈暗。

註: 若沒有外接的按鈕元件,可以使用Pomas開發板上的二個按鈕(KET1、KEY2)來操作。

54 of 207

按鈕元件

機械式按鈕(二腳)

機械式按鈕開關依持續作用的狀態形式,可以分為以下二類:

  • 交替型: 按下為開(通電)、再按為關(不通電)
  • 瞬時型: 持續按下為開(通電)、放開為關(不通電)

機械式按鈕(四腳)

按鈕開關有四支腳時,彼此兩兩相通(相通腳像夾子),當按下開關時,四支腳就會全部連通。接線時也是一組腳接VCC端、另一組腳接IO腳位。

  • 1號、2號腳相通
  • 3號、4號腳相通

55 of 207

建立按鈕物件

按鈕元件在程式中控制數位腳位是使用Pin物件,要匯入machine模組中的Pin類別。

from machine import Pin

創建外接的按鈕燈物件時,必須指定它的GPIO編號及數位輸入。建立語法如下:

物件名稱 = Pin( GPIO編號 , Pin.IN)

Pin物件有2個參數,分別為:

  • GPIO編號: 也就是俗稱的腳位。
  • 輸入模式: 數位輸入(Pin.IN),因為要讀取按鈕是否按下狀態

如: 建立一個btn物件,使用引腳9作為按鈕輸入,設置為輸入模式。

btn = Pin( 9 ,Pin.IN)

56 of 207

讀取按鈕輸入值

之前介紹過可以使用value(數值)方法來輸出數位訊號值,其實只要value()方法內不要放參數,就可以讀取輸入的數位訊號值。

print(btn.value()) # 印出按鈕狀態

  • 當按下按鈕時,顯示的值為1
  • 當放開按鈕時,顯示的值為0

57 of 207

開發板的KEY1及KEY2按鈕

開發板上內建有二個按鈕,分別為KEY1、KEY2,可以作為按鈕之用,只是宣告為物件時,必須使用Pomas指定的腳位宣告方式

  • 按鈕1(KEY1)指定的IO腳位為E6

btn1 = Pin('E6' ,Pin.IN)

  • 按鈕2(KEY2)指定的IO腳位為E7

btn2 = Pin('E7' ,Pin.IN)

58 of 207

接線說明

LED燈

  • 長腳 接 8號腳位。
  • 短腳 接 GND腳位。

按鈕

  • 一腳 接 9號腳位。
  • 一腳 接 3.3V腳位。

59 of 207

程式碼

from machine import Pin

from gpb import delay

led = Pin( 8 ,Pin.OUT) # 8號腳位

btn = Pin( 'E6' ,Pin.IN) # KEY1

while True:

if btn.value() == 1:

led.value(1)

else:

led.value(0)

60 of 207

05. RGB七彩霓虹燈

61 of 207

共陽極、共陰極RGB腳位判斷

RGB三色燈,是把R燈、G燈和B燈三者放在同一個元件內,

  • 還是要分別指定R燈、G燈和B燈的腳位。
  • 共同腳是最長的那個腳位,可以先把共同腳插在GND檢查看看是否有作用? 若是沒有反應,再把共同腳插在VCC處檢查。

  • 共陽極: 共同腳接3.3V腳位
  • 共陰極: 共同腳接GND腳位

62 of 207

亂數模組

「隨機取數」是寫遊戲或是機率類的程式相當常用的技巧,在MicroPython中建議使用urandom模組,它提供了生成隨機數的功能。可以用來生成隨機的密鑰、種子等用途,

import urandom

常用的方法有取隨機整數randint()和取隨機浮點數uniform()。

urandom.randint(起始值a, 終止值b)

63 of 207

接線說明

  • R腳 接 8號腳位。
  • G腳 接 9號腳位。
  • B腳 接 10號腳位。
  • 共陰極腳 接 GND腳位。

若是共陽極腳 接 3.3V腳位。

64 of 207

程式碼

from machine import PWM

from gpb import delay

import urandom

LR = PWM(0, 200, 0 )

LG = PWM(1, 200, 0 )

LB = PWM(2, 200, 0 )

while True:

R = urandom.randint(0, 100)

G = urandom.randint(0, 100)

B = urandom.randint(0, 100)

LR.duty(R); LG.duty(G); LB.duty(B)

delay(1000)

print(R,G,B)

太亮時,數值可以改小一點

65 of 207

06. 亮度感測模組

66 of 207

實作說明

利用外接光敏電阻及紅色LED燈來設計一個程式,符合以下要求:

  • 先行偵測目前的光線數值30次求取現在環境的光線平均數值。
  • 依照環境的光線數值,當光線變暗時,LED燈亮;光線變亮時,LED燈暗。

註: 決定變亮及變暗的數值請依實際環境調整

67 of 207

光線感測器(又稱光敏電阻)

光敏電阻是一種基於光學效應的電子元件,可以用來檢測環境光線強度。

它的工作原理是當光線照射到光敏電阻上時,會使其電阻值產生變化,進而改變電路中的電流或電壓值。光敏電阻的阻值通常會隨著光線強度的增加而減小,因此可以用來檢測光線的強弱。

  • 光線越強、電阻值越小
  • 光線越暗、電阻值越大

這種只有2 個腳位的光敏電阻,沒有內建電阻,所以接線時接GND 建議要加上電阻(1K ~ 10K 都可以)

68 of 207

ADC-類比數位轉換器(Analog-to-Digital Converter)

Pomas開發板處理這種連續的類比訊號,是透過ADC技術來達成。ADC是類比數位轉換器(Analog-to-Digital Converter)的縮寫,它是一種將類比信號轉換為數位信號的電子元件。在電子系統中,類比信號通常是指連續的、可變的電壓或電流信號,而數位信號則是由這些連續的信號轉換而來的、離散的二進制數字信號。

69 of 207

ADC物件

在MicroPython中,可以使用machine模組中的ADC類別,來通過程式碼來讀取外部設備上的模擬信號。

首先需要匯入machine模組的 ADC類別。

from machine import ADC

再來創建名為A0的ADC物件,使用A0腳位作類比輸出入。

A0 = ADC(0)

這樣就可以透過read()方法來讀取A0物件的數值

A0.read()

read()值範圍在0到4095之間,光線越亮,數值越高

70 of 207

接線說明

光敏感測器

  • A0腳 接 A0腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

LED燈

  • 長腳 接 9號腳位。
  • 短腳 接 GND腳位。

71 of 207

程式碼

from machine import Pin,ADC

from gpb import delay

led = Pin( 9 , Pin.OUT)

light = ADC(0)

br =0

for i in range(30):

br = br + light.read()

delay(20)

avg = br/30 + 200

while True:

if light.read() > avg :

led.on()

else:

led.off()

print(light.read())

delay(100)

72 of 207

07. 可變電阻調光燈

73 of 207

實作說明

設計一個角度感測可變電阻程式,符合以下要求:

  • 當旋轉可變電阻時,LED燈會隨著角度不同而改變亮度。
  • 效果要如家中的旋鈕式枱燈,可連續性的調整光線亮與暗。

74 of 207

可變電阻模組(類比輸入)

可變電阻模組內建分壓電路,經由轉動旋鈕改變兩個固定端間電阻值。以B10K的型號為例,它有3支腳,如圖所示,如果直接量這兩個腳的電阻值,就是10K。如果只接AB或BC兩腳,可以依照旋鈕的角度產生不同的電阻值。

該可變電阻的3支腳並沒有標示,通常A腳接VCC端、B腳接訊號輸出、C腳接GND端,但是A和C兩支腳接法是可以互換的,但是交換之後的數值變化會相反。

75 of 207

接線說明

可變電阻

  • A腳 接 3.3V腳位。
  • B腳 接 A0腳位。
  • C腳 接 GND腳位。

LED燈

  • 長腳 接 9號腳位。
  • 短腳 接 GND腳位。

76 of 207

程式碼

from machine import PWM, ADC

from gpb import delay

led = PWM( 1 , 500, 0 )

a0 = ADC(0)

while True:

vr = a0.read()

led.duty(vr // 4)

print(vr , vr // 4)

delay(100)

77 of 207

08. TFT LCD螢幕

78 of 207

實作說明

設計二個程式可以在Pomas開發板上顯示圖片及文字,符合以下要求:

  • 程式一:
    • 可以在指定位置顯示文字。
    • 可以指定顯示圖片,並指定圖片顯示位置。
  • 程式二
    • 將程式一的函數修改為函數庫,可以供其他程式匯入(import)使用。

79 of 207

圖形模式LCD顯示模組

圖形模式LCD顯示模組可以顯示文字、數字、符號、圖像,它的螢幕為寬320、高240的座標以左上角為(0,0),右下角為(319,230)。

80 of 207

display模組

display模組是MicroPython中的一個顯示設備控制模組,

  • 要使用LCD螢幕必須先匯入display模組,並呼叫display.start()函數啟動LCD顯示設備。

import display

display.start()

  • 而display.vflip()方法是要控制LCD螢幕的顯示方向是否上下翻轉,當display.vflip(1)上下翻轉時,它會翻轉座標讓 (0, 0) 與 (319, 239) 對調。
    • display.vflip( 0 ): 正常顯示、不翻轉
    • display.vflip( 1 ): 上下翻轉、倒立顯示

81 of 207

image模組建立影像流程

82 of 207

image模組

image模組是MicroPython中的一個圖像處理模組,它提供了對圖像進行處理和轉換的功能,例如” 改變圖像大小、旋轉圖像、調整圖像亮度和對比度等。

  • 在LCD螢幕中使用image 模組來建立 image.Image 物件,才能開始進行顯示圖形、文字等動作。
  • image模組提供一系列類別和方法,可以用來讀取、創建、處理和顯示圖像。

其中一些常用的類別和方法包括建立螢幕物件

  • 首先要使用image.Image()先建立螢幕物件,建立了一個名為 scr 的螢幕物件,該物件有一個大小為 320x240 像素的畫布,使用了 RGB565 的顏色空間,後續的程式則是在這個main_scr螢幕物件上進行處理。

scr = image.Image(320, 240, image.RGB565)

83 of 207

畫矩形

import display

import image

display.start()

display.vflip(0)

scr = image.Image(320, 240, image.RGB565)

# 在(0,0)處畫一個紅色矩形, X寬50, Y高100

scr =scr.draw_rectangle(0,0,50,100, (255,0,0),fill=True)

# 在(100,100)處畫一個綠色矩形, X寬100, Y高50

scr =scr.draw_rectangle(100,100,100,50,(255,0,0),fill=False)

display.set_frame(m_scr)

84 of 207

顯示圖片

如果是要把指定的圖片顯示在螢幕上,需要用到二個函數:

Image(圖片來源): 創建一個圖片物件,source為圖片的來源。

draw_image(圖片物件, x ,y): 在(x,y)位置繪製圖片

p_pict1 = image.Image('demo.bmp')

scr = scr.draw_image(p_pict1, 20, 20)

以上所介紹的都是希望在螢幕上顯示圖片、文字等設定,但是它並不會顯示在螢幕上,必須在最後加上set_frame ()這個指令才會真正顯示在螢幕上。

display.set_frame(scr)

85 of 207

顯示文字

顯示文字要使用draw_string()在螢幕物件上”繪製”文字,目前Pomas開發板的文字部分只能顯示英文字及數字。其語法如下:

draw_string(x , y, "string",(R, G, B), scale=n)

參數說明:

  • x , y : 文字的座標
  • string: 要顯示的英文文字,必須加上雙引號”。
  • RGB: 文字的顏色
  • scale: 文字的大小尺寸

例如: 在(20,180)位置顯示”Hello”文字,顏色綠色、文字尺寸比例為3

scr = scr.draw_string(20,180,"Hello",(0, 255, 0), scale=3)

86 of 207

程式一: 顯示圖片及文字

import display

import image

display.start()

display.vflip(0)

scr = image.Image(320,240, image.RGB565)

scr = scr.draw_rectangle(0,0,320,240, (0,0,0), fill=True)

pict1 = image.Image('demo.bmp')

scr = scr.draw_image(pict1, 20, 20)

scr = scr.draw_string(20,180, "Hello", (0,255,0), scale =3)

display.set_frame(scr)

87 of 207

程式2-1: 自定程式庫-LCDshow.py

import image

display.start()

display.vflip(0)

scr = image.Image(320,240,image.RGB565)

def clear():

global scr

scr = scr.draw_rectangle(0,0,320,240,(0,0,0),fill=True)

display.set_frame(scr)

88 of 207

def put_str(y1,str1):

global scr

y1 = y1 * 30

scr = scr.draw_rectangle(10+50, y1, 50, 30,(0,0,0),fill=True)

scr = scr.draw_string(10,y1,str1,(255,255,255),scale=3)

display.set_frame(scr)

def put_pict(ppict1,x3,y3):

global scr

p_pict1 = image.Image(ppict1)

scr = scr.draw_image(p_pict1,x3,y3)

display.set_frame(scr)

89 of 207

程式2-2: 呼叫自定程式庫

import display

import image

from LCDshow import clear, put_str, put_pict

from gpb import delay

scr = image.Image(320,240, image.RGB565)

clear()

pictx = put_pict('demo.bmp',200,60)

for i in range(100):

put_str(1, "T="+str(i))

put_str(2, "C="+str(i))

put_str(3, "B="+str(i))

delay(100)

90 of 207

09. DHT11數位溫溼度計

91 of 207

實作說明

設計一個DHT11數位溫溼度計,符合以下要求:

  • 可以連續偵測環境中的溫度與溼度
  • 將偵測結果在LCD螢幕顯示數值。

92 of 207

DHT11數位溫溼度模組

DHT11數位溫溼度模組是屬於數位輸入,所以未必一定要使用具有類比(PWM)功能腳位。

  • 溫度的測量範圍為0~50度(誤差±2度)
  • 溼度的測量範圍為20~90%(誤差±5%)

93 of 207

接線說明

DHT11溫溼度計

  • DATA腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

94 of 207

from sensor import DHT11

from gpb import delay

dht = DHT11(8) # 8號腳位 dht = DHT11(8)

while True:

T = str(dht.temperature()) + "C"

H = str(dht.humidity()) + "%"

print(T,H)

delay(2000)

95 of 207

V2_09DHT配合LCD模組

from sensor import DHT11

import display, image

from LCDshow import clear, put_str, put_pict

from gpb import delay

scr = image.Image(320,240,image.RGB565)

dht = DHT11('E0') # 8號腳位

clear()

while True:

put_str(1, "T= "+str(dht.temperature()))

put_str(2, "H= "+str(dht.humidity()))

print(str(dht.temperature()) + "C")

print(str(dht.humidity()) + "%")

delay(2000)

clear()

96 of 207

10. 文字型LCD顯示模組(1602A)

97 of 207

實作說明

設計一個文字型LCD顯示模組,可以符合以下要求:

  • 顯示DHT11所偵測的溫度與濕度的數值。
  • 溫度和溼度分成二行顯示。

98 of 207

載入外部程式庫

當遇到韌體內部沒有支援的模組時,網路上有許多現成的 「 程式庫 」可供使用,例如現在要使用1602A LCD 模組,只要查詢關鍵字 「1602A」 「micropython」,就能找到可以直接匯入應用的程式庫,可簡化程式開發工作。

  • 使用者 dhylands 在 Github 提供了 「Python_lcd」的二個程式庫i2c_lcd.pylcd_api.py,只要將上面這兩個檔案放入Pomas開發板的SD記憶卡中,就能當成模組直接呼叫並執行

99 of 207

LCD顯示對應位置及指令

文字型LCD顯示模組的液晶螢幕可以顯示兩行資訊(第0行及第1行),每行16個字元(由0至15格),而每個字元只能在固定格內顯示,這二行的字元都有相對應的座標。

它只能顯示英文及數字,不能顯示中文字,常用的指令有

  • lcd.move_to(1,1)指定就是移到第1行第1格位置
  • lcd.putstr( "T" )則是放入文字內容”T”。
  • lcd.clear()則是清除文字

100 of 207

接線說明

DHT11數位溫溼度計

  • DATA腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

1602A LCD顯示模組

  • GND腳 接 I2C GND腳位
  • VCC腳 接 I2C 3V腳位
  • SDA腳 接 I2C的DAT腳位
  • SCL腳 接 I2C的SCK腳位

101 of 207

from sensor import DHT11

from machine import I2C

from gpb import delay

from i2c_lcd import I2cLcd

from lcd_api import LcdApi

I2C_ADDR = 0x27 ; I2C_NUM_ROWS =2 ; I2C_NUM_COLS=16

i2c = I2C(scl='A10', sda='A11', freq=400000)

lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)

dht =DHT11(8)

while True:

lcd.move_to(0,0)

lcd.putstr ( "T= "+str(dht.temperature()))

lcd.move_to(0,1)

lcd.putstr ( "H= "+str(dht.humidity()))

delay(2000)

102 of 207

11. 超音波感測器-倒車雷達

103 of 207

實作說明

設計一個倒車雷達程式,符合以下條件

  • 隨時在互動環境(Shell)視窗顯示超音波感測器測距的數值。
  • 若測距的距離小於20公分, 蜂鳴器發出警告聲。
  • 若測距的距離大於20公分, 蜂鳴器停止發聲。

104 of 207

超音波感測器

常見的HC-SR04超音波傳感器主要是用來偵測距離,模組上有兩個超聲波元件,一個用來發射,一個用來接收,就能利用一發一收,去算出距離。

  • VCC : 工作電壓5V
  • Trig : 觸發腳(發射訊號)
  • Echo : 回應腳(接收返回訊號)
  • GND : GND

105 of 207

蜂鳴器

蜂鳴器基本上分為有源蜂鳴器和無源蜂鳴器,二者的外型很相似,一般有源蜂鳴器會在上面貼一個白色貼紙,另外,有源蜂鳴器底部也會有膠封,無源蜂鳴器的底部可以直接看到電路板。

有源蜂鳴器 無源蜂鳴器

106 of 207

無源蜂鳴器

播放旋律主要是靠這個函式:

tone(pin, melody[thisNote], Duration);

//tone(PIN腳,音調,拍子)

要靜音則使用

noTone(pin);

107 of 207

其音高-音頻(單位Hz)對照表

108 of 207

接線說明

HC_SR04超音波感測器

  • Trig腳 接 8號腳位。
  • Echo腳 接 9號腳位。
  • VCC腳 接 VCC(3.3V)腳位。
  • GND腳 接 GND腳位。

蜂鳴器

  • (+)端 接 11號腳位。
  • (-)端 接 GND腳位。

109 of 207

from sensor import HC_SR04

from machine import PWM

from gpb import delay

sr04 = HC_SR04 ( 8 , 9 )

buzzer = PWM(3 ,freq=1000, duty=1000 )

while True:

x =sr04.Ultrasound()

if x < 20:

buzzer.duty(700)

else:

buzzer.duty(0)

print(str(x) + "cm" )

delay(500)

110 of 207

12.揚聲器SPK

111 of 207

實作說明

設計一個程式,符合以下要求:

  • 執行程式時,可以由揚聲器播放指定聲音檔案。

112 of 207

揚聲器(Speaker)

揚聲器(Speaker)是一種將電信號轉換成聲音信號的電子元件,通常用於播放音樂、語音、警報等聲音訊號。透過改變頻率來改變音調,屬於PWM的應用。

揚聲器有很多種類,其中最常見的是動圈式揚聲器,它由喇叭振膜、線圈和磁鐵系統等組成,通過電信號作用在線圈上,產生磁場,進而產生振動,使得喇叭振膜產生聲音,應用電磁鐵將電流轉化為聲音。

揚聲器有2根腳位,模組上沒有特別標示腳位,也沒有正負極之分。

113 of 207

製作音檔-文字轉語音

進入 https://soundoftext.com/ 網站

1. 在Text區,輸入【歡迎進入Pomas的奇妙世界】文字。

2. Voice區選擇「Chinese(中文)」。

3. 按下「Submit」鈕。

114 of 207

audio_decode 模組

audio_decode 模組用於解碼和播放音訊檔案模組。它主要提供了以下功能:

  • init() 函數: 初始化音訊解碼器。
  • volume_up() 函數: 加大音量,數值參數(範圍:0 ~ 63)。
  • volume_down():減少音量,數值參數(範圍:0 ~ 63)。
  • start() 函數: 開始播放音訊,表示要播放的音訊檔案名稱,可以是 MP3、WAV 等格式。這個函數會在另一個執行緒中運行,並且會阻塞主執行緒,直到音訊播放結束或者被停止。
  • pause()函數: 暫停播放音訊。
  • resume() 函數:繼續播放被暫停的音訊。
  • stop() 函數: 停止播放正在播放的音訊,並釋放相關的資源。
  • mute()函數: 將當前播放的音訊靜音。
  • unmute()函數: 將當前靜音播放的音訊取消靜音。

115 of 207

音效播放流程

116 of 207

接線說明

  • 揚聲器(+)腳 接 SPK右側腳位。
  • 揚聲器(-)腳 接 SPK左側腳位。

117 of 207

程式碼

import audio_decode

audio_decode.init()

audio_decode.volume_up(90)

audio_decode.start('demo.mp3')

118 of 207

13. 麥克風錄音機

119 of 207

實作說明

設計一個錄音程式,符合以下要求:

  • 程式開始執行,紅色LED燈亮起開始錄音(錄音時間5秒),紅色中LED燈暗後,停止錄音。
  • 錄音完成後,黃色LED燈亮1秒後,開始播放錄音檔。

120 of 207

麥克風

Pomas開發板內建有音效處理晶片及麥克風(MK!腳位),內建的麥克風屬於是感測器的一種,可以錄音、聲音偵測及語音辨識。

121 of 207

audio_encode 模組

audio_encode 模組用於進行音訊編碼的模組。它提供了以下函數:

  • start() 函數: 開始錄音,它接受一個參數,表示要錄音的音訊檔案名稱,可以是 MP3、WAV 等格式。
  • stop() 函數: 停止錄音,將依指定檔案名稱儲存。

這些函數可以用於在 MicroPython 環境下進行音訊編碼,例如將原始音訊數據進行壓縮後保存到文件中。需要注意的是,這些函數只能進行編碼,不能進行解碼。如果需要解碼,可以使用 audio_decode 模組進行解碼操作。

122 of 207

接線方式

揚聲器

  • 揚聲器(+)腳 接 SPK右側腳位。
  • 揚聲器(-)腳 接 SPK左側腳位。

LED燈

  • 開發板紅色LED0
  • 開發板黃色LED1

123 of 207

from machine import Pin

from gpb import delay

import audio_decode,audio_encode

ledR = Pin( 'C12' ,Pin.OUT) # 開發板LED0

ledY = Pin( 'C13' ,Pin.OUT) # 開發板LED1

audio_decode.init()

audio_encode.init()

audio_encode.start('record.wav') #錄音

ledR.on(); delay(5000); ledR.off()

audio_encode.stop()

ledY.on(); delay(2000); ledY.off() #播放

audio_decode.volume_up(100)

audio_decode.start('record.wav')

124 of 207

14. 可調速電風扇

125 of 207

實作說明

設計一個程式製作一個可以調整轉速的電風扇,符合以下要求:

  • 程式執行時,風扇靜止不動。
  • 旋轉可變電阻可以調整風扇馬達的速度,讓風向前吹出。

126 of 207

風扇馬達(型號L9110)

風扇模組有標準4個腳位,分別為:

  • INB : 控制馬達反轉
  • INA : 控制馬達正轉
  • VCC : 接5V電壓
  • GND : GND

也可應用在船隻

語法:

inb = PWM( 腳位 ,Freq , duty )

  • Freq : 固定200Hz
  • Duty : 開始先預設為0(停止)

如: inb = PWM( 0 , 200 , 0 )

INB: 馬達反轉,風向前吹

127 of 207

接線說明

可變電阻

  • SIG腳 接 A0腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

風扇馬達

  • INB腳 接 8號腳位。
  • INA腳 接 9號腳位。
  • VCC腳 接 5V腳位。
  • GND腳 接 GND腳位。

128 of 207

程式碼

from machine import PWM, ADC

from gpb import delay

inb = PWM (0,freq=200,duty=0) # 8號腳位

vr = ADC(0)

while True:

fan = vr.read()

inb.duty(fan // 4)

print(fan , fan // 4)

delay(100)

129 of 207

15. 滾珠開關

130 of 207

實作說明

設計一個螢幕調整程式,符合以下要求:

  • 滾珠開關數值0時,LED燈暗。
  • 滾珠開關數值1時,LED燈亮。

131 of 207

滾珠開關

滾珠開關也叫鋼珠開關,原理是通過珠子滾動接觸導針,控制電路的接通或者斷開的。當開關觸碰到內部的金屬板就亮燈、離開就關燈。利用開關中的小珠的滾動,可以透過金屬端子的觸碰就能產生導電或不導電的效果。

132 of 207

接線說明

滾珠開關

  • SIG腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

LED燈

  • 長腳 2號腳位
  • 短腳 GND端

133 of 207

from machine import Pin

from gpb import delay

shake = Pin('E0',Pin.IN) # 8號腳位

led1 = Pin('C2',Pin.OUT) # 2號腳位

prev = 0 # 建立變數 : 上一次的狀態

while True:

curr = shake.value()

print(curr)

if curr != prev:

led1.value(curr)

print("shake it!")

prev = curr

delay(100)

134 of 207

16. 震動開關

135 of 207

實作說明

設計一個居家安全程式,符合以下要求:

  • 開門(震動)時,LED燈亮,0.5秒後關關。
  • 關門(未震動)時,LED燈暗。

136 of 207

震動開關

震動開關的結構如下圖所示,裡頭有一個金屬導電彈簧以及金屬導電腳,金屬彈簧延伸到塑膠外殼外部是一條比較細的金屬線,因此在晃動的時候,內部互相接觸進而短路導電,原理和之前所提到的按鈕類似,只是震動開關利用震動的方式,控制電路的開或關。

  • 平時靜止斷電時,讀值為0
  • 震動發生通電時,讀值為1

請注意:晃動需要達到一定的幅度才能感測判斷為震動。

應用範圍:防盜警報系統、省電喚醒功能、自動斷電安全裝置等,各類需偵測震動之應用。

137 of 207

接線說明

震動開關

  • S腳 接 開發板的8號腳位。
  • VCC腳 接 開發板的3.3V腳位。
  • GND腳 接 開發板的GND腳位。

LED燈

  • 長腳 接 開發板的2號腳位。
  • 短腳 接 開發板的GND腳位。

138 of 207

from machine import Pin

from gpb import delay

sw = Pin('E0', Pin.IN) # 8號腳位

led1 = Pin('C2', Pin.OUT) # 2號腳位

while True:

sw_state = sw.value()

if sw_state == 0:

led1.on()

delay(500)

led1.off()

else:

led1.off()

139 of 207

17. 聲音偵測傳感器

140 of 207

實作說明

設計一個噪音檢測器居家安全程式,符合以下要求:

  • 當音量超過指定值時,LED燈亮,0.5秒後關關。
  • 當音量未超過指定值時,LED燈暗。

141 of 207

聲音偵測傳感器

聲音感測模組它的功能並不是用來講話或是偵測聲音的分貝值,主要作用只是偵測是否有聲音。聲音感測模組最常見的是以下這個紅色模組,這塊聲音感測模組價格便宜,但是缺點就是敏感度並不好,要很靠近發出聲音,而且音量要夠大超過門檻值,它才會有反應。接到類比腳位及數位腳位的差別是:

  • 類比腳位(A0~A5),測得的音量大小為0~1023的數值。
  • 數位腳位(D0),依Threshold Value(門檻值),來決定輸出LOW或HIGH。

142 of 207

接線說明

聲音偵測傳感器

  • S腳 接 A0號腳位。
  • VCC腳 接 5V腳位。
  • GND腳 接 GND腳位。

LED燈

  • 長腳 接 2號腳位。
  • 短腳 接 GND腳位。

143 of 207

from machine import Pin, ADC

from gpb import delay

led1 = Pin('C2',Pin.OUT) #2號腳位

a0 = ADC(0)

while True:

s_value = a0.read()

if s_value > 300:

print("聲音數值:", s_value)

led1.on()

delay(500)

led1.off()

delay(50)

144 of 207

18. 語音辨識

145 of 207

實作說明

設計一個用聲控電燈(LED燈)程式,符合以下要求:

  • 當唸出「打開電燈」,電燈(LED燈)打開變亮。
  • 當唸出「關閉電燈」,電燈(LED燈)關閉變暗。

註: 以LED燈代替電燈,讀者也可以採用繼電器及小夜燈施作實驗。

146 of 207

音頻輸出入/麥克輸入

在Pomas開發板上有內建麥克風(MIC)及外接耳機連接器、外接麥克風連接器。

  • 麥克風連接器。 (注意 :插入時,將斷開內建麥克風的連接。 )
  • 耳機連接器。
  • SPK是揚聲器的輸出接頭和外部放大器(喇叭)的腳位 。

147 of 207

語音辨識原理

語音辨識是指透過電腦對人類語言的聲音信號進行分析,並識別出語音的內容。其基本原理是通過信號處理和模式識別技術,將語音信號轉換為數字信號,然後進行模式識別,最終識別出語音內容。

  • 若是對於語音建模有興趣的伙伴,可以自行到GenioPy.官網的教學資源區,下載「語音建模說明書.pdf」來參考。 https://www.geniopy.com.tw/dl/Copywriting/

148 of 207

智慧管家: 口令集1

149 of 207

語音辨識操作流程

150 of 207

接線說明

LED燈

  • 長腳 接 開發板的2號腳位。
  • 短腳 接 開發板的GND腳位。

也可以使用

ledR = Pin('C12', Pin.OUT )

151 of 207

import voice_recognition

from machine import Pin

led = Pin(2, Pin.OUT) # 2號腳位

#ledR = Pin('C12', Pin.OUT ) #使用開發板上LED紅燈

led.value(0)

voice_recognition.start(1)

while True:

cmd = voice_recognition.get_id()

if cmd == 2:

led.value(1)

if cmd == 3:

led.value(0)

152 of 207

19. 人臉辨識

153 of 207

實作說明

設計一個人臉辨識程式,符合以下要求:

  • 進行人臉辨識訓練,進行建模完成後,播放「訓練完成」語音。
  • 訓練成功後進行人臉辨識,如果有辨識成功,則播放「認出你了」語音。

154 of 207

鏡頭模組

鏡頭模組是連接在Pomas開發板上,用來輸入傳感器圖像原始數據,開發板中內建人臉偵測晶片。

鏡頭模組搭配LCD螢幕,可以讓鏡頭拍攝的影像即時顯示在LCD螢幕。

155 of 207

使用流程

156 of 207

測試鏡頭模組與LCD模組是否能正常運作

import sensor, display

sensor.start() # 啟用相機

display.start() # 啟用螢幕

while True:

img = sensor.snapshot() # 取得攝影機影像

display.set_frame(img) # 顯示剛剛取得的影像

157 of 207

接線說明

揚聲器

  • (+)腳位 接 SPK右側腳位。
  • (-)腳位 接 SPK左側腳位。

158 of 207

import face_recognition

import audio_decode

from gpb import delay

audio_decode.init()

audio_decode.volume_up(60)

face_recognition.start()

face_recognition.set_process(1)

while face_recognition.train() == 0:

pass

audio_decode.start('train_ok.wav')

face_recognition.set_process(0)

delay(2000)

face_recognition.recognize_start()

while True:

if face_recognition.get_face_id(0) != 0:

audio_decode.start("get_face.wav")

delay(2000)

face_recognition.recognize_start()

159 of 207

專題應用

160 of 207

專題

161 of 207

A1. 智慧植栽

162 of 207

專題說明

設計一個可以智慧植裁的程式,符合以下要求:

  • 可以隨時偵測土壤中的濕度,並顯示在LCD螢幕
  • 當濕度低於1000時,會自動補水,高於1000時,停止補水。
  • 補水時會亮起LED燈提醒正在補水,停止補水時則LED燈熄滅。

註: 補水的濕度值可以依實際狀況自行調整。

163 of 207

土壤濕度感測器模組

土壤濕度感測器模組是一種用於測量土壤濕度的電子元件,通常由兩個主要部分組成:探針和模組。當溼度越高導電度也越高,將土壤濕度轉換成信號輸出,土壤濕度偵測模組有三支針腳,

  • S腳 接在 A0 腳位、
  • VCC 腳接 5V腳位、
  • GND腳 接 GND腳位。

164 of 207

繼電器

控制端: 有3個接腳,

  • +腳: 接5V腳位
  • -腳: 接GND腳位
  • S腳(或IN腳): 控制繼電器的開或關。

被控端: 有3個接腳,負責接電源線。

  • NO (Normal Open常開) :它是不通電的。
  • COM (Common Ground共接電):把外電接到這個COM接腳,再從NO或NC接到外部設備上。
  • NC (Normal Close常閉):它在是接通的。

其中NO和NC一次只會接一個,至於要接哪一個,就要看實際的情況了。

165 of 207

微型水泵

水泵本身有兩個開口,一個負責吸水、另外一個負責放水。只需要將電源線接上相應的電源,即可開始運轉。一些微型水泵還配備了控制電路,可以實現自動調節流量或壓力的功能。

水泵有兩條電線,一條接5V電源、一條接GND端,通電之後就會啟動內部的馬達開始抽水,所以在電路上使用一個繼電器作為開關,透過控制繼電器,就可以控制啟動水泵或關閉水泵。

166 of 207

接線說明

土壤濕度感測哭

  • A0腳 接 A0號腳位。
  • VCC腳 接 5V腳位。
  • GND腳 接 GND腳位。

繼電器

  • IN腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。
  • 公共端 接 微型水泵5V腳。
  • 常開端 接 開發板的5V腳位。

微型水泵

  • 5V腳 接 繼電器的 公共端。
  • GND腳 接 GND腳位。

LED燈

  • 長腳 接 2號腳位。
  • 短腳 接 GND腳位。

167 of 207

接線說明

土壤濕度感測哭

  • A0腳 接 A0號腳位。
  • VCC腳 接 5V腳位。
  • GND腳 接 GND腳位。

繼電器

  • IN腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。
  • 公共端 接 微型水泵5V腳。
  • 常開端 接 開發板的5V腳位。

LED燈

  • 長腳 接 2號腳位。
  • 短腳 接 GND腳位。

168 of 207

程式1: 檢查土壤濕度感測器的偵測數值。

from machine import ADC

from gpb import delay

soil = ADC(0)

while True:

print ("濕度=",soil.read())

delay(1000)

169 of 207

程式2: 檢查繼電器運作

from machine import Pin

from gpb import delay

relay = Pin( 8 , Pin.OUT) #8號腳

led = Pin( 2 , Pin.OUT) #2號腳

while True:

relay.value(1); led.value(1)

print(1)

delay(2000)

relay.value(0); led.value(0)

print(0)

delay(2000)

170 of 207

專題程式-直接匯入LCDshow.py程式庫使用

from machine import ADC,Pin

import display,image

from gpb import delay

from LCDshow import clear, put_str, put_pict

main_scr = image.Image(320,240,image.RGB565)

soil = ADC(0)

relay = Pin( 8 , Pin.OUT) #8號腳

led = Pin( 2 , Pin.OUT) #2號腳

while True:

clear()

put_str(1, "S="+str(soil.read()))

if soil.read() < 1000:

relay.value(1); led.value(1)

delay(2000)

else:

relay.value(0); led.value(0)

delay(2000)

171 of 207

A2. 藍牙遠距搖控

172 of 207

實作說明

設計一個使用藍牙控制燈光、車門閘道程式,符合以下要求:

  • 輸入1,開燈(LED燈亮);輸入2,關燈(LED燈暗)。
  • 輸入3,車門匣道開啟(90度);輸入4,車門匣道關閉(0度)

註:伺服馬達可以套上吸管,較能呈現閘門的效果。

173 of 207

藍牙模組

要呼叫BT-RT6M 藍芽模組工作,可以自行撰寫程式,或是使用名威科技所設計的程式庫ble_uart.py,只要將這個ble_uart.py檔案放入Pomas開發格的SD卡中,就能當成模組直接匯入並使用它,

該程式庫定義了一些方法,其功能說明如下:

  • cmd_AT():用於向藍牙模組發送AT指令,並讀取藍牙模組的返回信息。
  • cmd_mode_entry():用於進入命令模式,就是與藍牙模組通訊的模式。
  • data_mode_entry():用於進入數據模式,就是與其他藍牙設備進行數據傳輸模式。
  • read_device_name():用於讀取藍牙模組的名稱。
  • set_device_name():用於設置藍牙模組的名稱。
  • reboot():用於重啟藍牙模組。
  • read():用於從UART串口讀取指定大小的數據。
  • write():用於向UART串口寫入指定的數據。

174 of 207

藍牙遠端搖控APP

使用手機下載「 MeoW BLE」APP,它是一套藍牙通用工具,可以掃瞄以下QRCODE來進行安裝。如果無法使用此APP,可以下載其他免費的藍牙APP程式,如: FeasyBlue或是 LIGHTblue及Serial Bluetooth Terminal等做連線測試等。

175 of 207

伺服馬達(型號SG90)

伺服馬達有標準 3個腳位,模組上沒有特別標示腳位,而是以顏色區分。

  • 橘色 : 訊號線
  • 紅色 : VCC
  • 咖啡色 : GND

常見的伺服馬達SG90有二種,請注意!二者的外觀跟型號都是一樣的。

  • 90~180 度:可控制角度
  • 360度:不能控制角度,只能控制正轉或反轉的方向。

176 of 207

接線說明

藍牙模組(BT-RT6M)

  • UART0 接頭,為串行 BT-RT6M 藍芽模組
    • BT-RT6M 模組(BLE Module) /(WIFI Module)可共用同一個接口。
    • 模組 「向外」 置入對應腳位。

伺服馬達(SG90)

  • 橘色線(訊號端) 接 8號腳位。
  • 紅色( VCC端) 接 3.3V腳位。(依馬達實際為為3.3V或5V)
  • 咖啡色( GND端) 接 GND腳位。

LED燈

  • 長腳 接 2號腳位。
  • 短腳 接 GND腳位。

177 of 207

178 of 207

程式1: 伺服馬達檢測

from gpb import Servo, delay

ser = Servo(0) # 使用 PWM8 腳位操控 Servo1

while True: # True 代表成立

ser.angle(0) # 停止

delay(500) # 等 0.5 秒

ser.angle(-50) # 順時針轉 50度

delay(500)

ser.angle(0)

delay(500)

ser.angle(50) # 逆時針轉 50度

delay(500)

179 of 207

程式2:檢測藍牙模組能否正常啟動

from ble_uart import BleUart

from gpb import delay

ble = BleUart( 2 , 115200 ) #Pomas V2用2, V4用0

delay(200)

ble.cmd_mode_entry()

ble.cmd_AT()

ble.set_device_name('lynn') #要改用自己設的英文名

print(ble.read_device_name())

180 of 207

專題程式: 藍牙遠距搖控匣門

from ble_uart import BleUart

from machine import Pin

from gpb import Servo, delay

ble = BleUart( 2 , 115200 ) #Pomas V2用2, V4用0

delay(200)

ble.cmd_mode_entry()

ble.cmd_AT()

ble.set_device_name('lynn') #要改自己的英文名

print(ble.read_device_name())

led = Pin ( 2, Pin.OUT)

ser = Servo(7)

181 of 207

while True:

cmd = str(ble.read(30), 'utf-8').strip('\0')

if cmd != '':

print(cmd)

if cmd == '1':

led.on()

ble.write('LED ON')

elif cmd == '2':

led.off()

ble.write('LED OFF')

elif cmd == '3':

ser.angle(90)

ble.write('OPEN DOOR')

elif cmd == '4':

ser.angle(0)

ble.write('CLOSE DOOR')

delay(10)

182 of 207

手機藍牙搖控

183 of 207

A3. 互連網應用

184 of 207

實作說明

設計一組2個互連網MQTT程式,符合以下要求:

  • (A開發板)程式1: 可以透過WIFI接收MQTT指定欄位訊息。
  • (B開發板)程式2: 可以透過WIFI傳送MQTT指定欄位訊息。

提示: 本專題建議採用二張開發板,可以體會由B開發板(程式2)傳送MQTT訊息到A開發板(程式1)的互連網效果。若沒有2個Pomas開發板也可以逐一練習程式1及程式2。

185 of 207

UART WIFI模組(MW-RT10BX)

本專題採用MW-RT10BX這個WIFI模組

wifi函數庫

本專題採用MW-RT10BX這個WIFI模組,可以自行撰寫程式,或是使用名威科技所設計提供的程式庫wifi_uart.py,只要將這個wifi_uart.py檔案放入Pomas開發格的SD卡中,就能當成模組直接匯入並使用它。

  • wifi_uart.py內的參數修改

class WifiUartRT10(): # 適用模組 MW-RT10BX

EN_PIN = 'B8' # for Pomas (Tinka請改為'B6')

186 of 207

wifi函數庫

要呼叫BT-RT6M 藍芽模組工作,以下為使用WIFI時常用的函數:

from wifi_uart import WifiUartRT10

  • wifi = WifiUartRT10(2, 115200) # Pomas V2用2, V4用0
  • wifi.vccReboot() # UART0電源重新上電
  • wifi.sendAT('VER') # read version
  • wifi.wifiConap('ssid',' password ') # 設定wifi的ssid,password
  • wifi.wifiGetip() # 取得IP
  • wifi.wifiState() # 取得Wifi目前連線狀態

187 of 207

MQTT函數庫

本專題採用MQTT GO網站作為訊號主機,因為它免費、免註冊、簡單易用。

MQTT GO網址: https://broker.mqttgo.io/

以下是程式庫wifi_uart.py在使用MQTT時會使用的函數列表及說明:

  • wifi.mqttSetup('lynnlin0707' , '123321'): 設定登錄MQTT Server的user name跟password,注意:如果使用的MQTT主機不需設定username及password時,請不要使用此函數,不然會導致無法登錄MQTT 主機。
  • wifi.mqttCon('主機網址' , '1883' , ' clientID(可自訂)'): 連線至MQTT Serve。
  • wifi.mqttSub('主題' , 'QoS號碼' , 秒數): 訂閱主題及QoS號碼 。
  • wifi.mqttRecv() : 接收mqtt訊息。
  • wifi.mqttPub('QoS號碼' , ' Retain ' , '訂閱主題' , 訊息內容)): 通過訂閱的topic傳送(發佈)訊息。

188 of 207

接線說明

UART WIFI模組

  • UART WIFI模組(MW-RT10BX)� 「向外」 置入U13腳位。

DHT11溫溼度計

  • S腳 接 8號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

189 of 207

程式1: 等待由MQTT伺服器接收訊息

from wifi_uart import WifiUartRT10

from sensor import DHT11

from gpb import delay

wifi = WifiUartRT10(2, 115200)

wifi.vccReboot()

wifi.sendAT('VER')

wifi.wifiConap('ABC','1234567890')

wifi.wifiGetip()

wifi.wifiState()

wifi.mqttCon('mqttgo.io','1883','8703896498')

wifi.mqttSub('humi','2',3000)

wifi.mqttSub('temp','2',3000)

while True:

wifi.mqttRecv()

delay(1000)

依實際值填入

190 of 207

程式2: 向MQTT主機傳送MQTT訊息

from wifi_uart import WifiUartRT10

from sensor import DHT11

from gpb import delay

dht = DHT11(8) #8號腳位

wifi = WifiUartRT10(2, 115200)

wifi.vccReboot()

wifi.sendAT('VER')

wifi.wifiConap('ABC','1234567890')

wifi.wifiGetip()

wifi.wifiState()

wifi.mqttCon('mqttgo.io','1883','8703896498')

wifi.mqttSub('humi','2',3000)

wifi.mqttSub('temp','2',3000)

while True:

wifi.mqttPub('2','0','temp',str(dht.temperature()))

delay(2000)

依實際值填入

191 of 207

A4. 智慧家庭

192 of 207

實作說明

設計一個智慧家庭專案,隨時偵測可以用語音控制家中家電的程式,符合以下要求:

  • 即時監控家中溫度與溼度,顯示資訊在LCD螢幕
  • 即時監控室外燈光亮度,若戶外光線不足,則室外燈光(LED燈)會亮起,若光線充足,則室外燈光(LED燈)會關閉。
  • 即時監控戶外是否有人接近住家,若有人接近,警示燈會亮起,若無人接近,警示燈會關閉。
  • 語音控制家中數位家電,使用前要講關鍵字「小愛管家」後,再下指令:
    • 打開電燈:開啟室內燈光,LCD顯示開燈圖示。
    • 關閉電燈:關閉室內燈光,LCD顯示關燈圖示。
    • 打開風扇:啟動風扇馬達,LCD顯示風扇啟動圖示
    • 關閉風扇:關閉風扇馬達,LCD顯示風扇關閉圖示
    • 播放音樂:開啟播放音樂,LCD顯示音樂播放圖示
    • 停止音樂:停止播放音樂,LCD顯示音樂停止圖示
    • 大門解鎖:伺服馬達轉動90度後,停止3秒,再轉回0度,並播放「歡迎回來」語音。

193 of 207

智慧家庭架構圖

194 of 207

語音小愛管家-智慧居家流程

195 of 207

接線說明

LED接線圖

  • 紅色LED長腳 接 2號腳位。
  • 紅色LED短腳 接 GND腳位。
  • 黃色LED長腳 接 3號腳位。
  • 黃色LED短腳 接 GND腳位。

光敏感測器

  • S腳 接 J48的A0腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

DHT11溫溼度計

  • DATA腳 接 4號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

揚聲器(Speaker)

  • 揚聲器(+)腳 接 (SPK)右側腳位。
  • 揚聲器(-)腳 接 (SPK)左側腳位。

HC_SR04超音波感測器

  • Trig腳 接 5號腳位。
  • Echo腳 接 6號腳位。
  • VCC腳 接 3.3V腳位。
  • GND腳 接 GND腳位。

伺服馬達(SG90)

  • 橘色線(訊號) 接 7號腳位。
  • 紅色( VCC) 接 VCC(3.3V)腳位。(依馬達實際為3.3V或5V)
  • 咖啡色( GND) 接 GND腳位。

風扇馬達(L9110)

  • INB腳 接 8號腳位。
  • VCC腳 接 5V腳位。
  • GND腳 接 GND腳位。

196 of 207

接線說明

197 of 207

END

198 of 207

補充篇

199 of 207

Python基本語法

200 of 207

變數

Python變數並不需要宣告,只要直接指定變數值,就可以建立變數了,而電腦就會配置一塊記憶體給該變數使用。

變數的命名必須遵循以下規則:

  • 變數名只能包含字母、數字和底線_。
  • 變數名的第一個字必須是大小寫字母或底線_。
  • 變數名不能是Python中的保留字(如if、while、print等)。
  • 變數名有區分大小寫。

201 of 207

變數實作

x = 0 ; y=1

a = b = c = 30 # 註解: 多重指定,同時將3個變數值指定為30

age, name = 20, "王大明"

print(x, y)

print(a, b, c)

print(age, name)

202 of 207

資料型態

在Python中,資料型態是用來表示不同的數據類型,常見的資料型態包括整數、浮點數、字串、布林值、串列、元組、字典等。

因為要相同的資料型態才能運算,Python在具有簡單的資料型態自動轉換功能:

  • 整數和浮點數運算: 先將整數轉換為浮點數再運算,結果為浮點數。
    • num1 = 3 + 4.1 # 結果為7.1,浮點數
  • 數值和布林值運算: 先將布林值轉換為數值再運算(True=1、False=0)。
    • num2 = 3 + True # 結果為4,整數
    • num3 = 3.1 +False # 結果為 3.1,浮點數

203 of 207

資料型態轉換

其他的資料型態無法自動進行轉換時,就需要以函數來強制進行資料型態的轉換。是常見的資料型態轉換方法:

  • 轉換為整數(int):使用int()函數轉換為整數。例如:
    • x = int(3.14) # x的值為3
    • y = int("42") # y的值為42
  • 轉換為浮點數(float):使用float()函數轉換為浮點數。例如:
    • x = float(42) # x的值為42.0
    • y = float("3.14") # y的值為3.14
  • 轉換為字串(str):使用str()函數轉換為字串。例如:
    • x = str(42) # x的值為"42"
    • y = str(3.14) # y的值為"3.14"

204 of 207

算術運算式

205 of 207

判斷式

程式的設計常會遇到需作一些判斷,再依照判斷的結果來進行不同的流程。這種判斷流程也稱之為選擇結構,Python語言以冒號「:」及縮排來表示程式區塊,縮排為1個Tab鍵或4個空白

score = 89

if score >= 90:

print("甲等")

elif score >= 80:

print("乙等")

else:

print("不及格!")

206 of 207

串列(list)

程式中的資料通常是以變數來儲存,但是當有大量的資料要使用大量的變數時,單單變數命名就是個很大的問題,所以往往會改使用串列來處理。

串列(清單或列表)具有以下的特徵:

  • 串列中每一個資料稱為「元素」,每一個元素就相當於一個變數。
  • 元素置於中括號[ ]內,元素以逗號「,」分隔
  • 以元素的位置作為索引,來存取串列中指定的元素。

list1 = [1, 2, 3, 4, 5]

#元素皆為整數

list2 = [“芭樂”, “香蕉”, “蘋果”, “橘子”]

#元素皆為字串

list3 = [1, "水果", True]

#不同資料型態元素

207 of 207

常用的列表操作

  • 定義串列
    • fruits = ["apple", "banana", "cherry"]
    • numbers = list(range(1, 11))
  • 存取串列元素-fruits[1]
  • 修改串列元素
  • 切分串列-fruits[1:3]
  • 迭代串列-使用 for 迴圈來迭代串列中的元素
  • 判斷元素是否在串列中-使用 in 關鍵字來判斷一個元素是否在串列中
  • 串列長度-使用 len() 函式來獲取串列中元素的數量