Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

164
113 Lab10 PSꝏC ꝏ PC 網際網路傳輸......................... 137 Lab11 即時變更連線對象..................................... 163 Lab12 HTTP 訊息處理........................................... 106 Lab09 GPS 全球定位系統..................................... 94 Lab08 RFID 身分辨識與加值............................... 81 Lab07 橋樑傾斜偵測 G-eꝏ 與 GPRS ........ 70 Lab06 智慧電網 OMU監控用電 ..................... 61 Lab05 智慧微塵 Sile Nꝏde蒐集資料 ........ 47 Lab04 快速建構WSN ZigBee 自動組網 ........ 27 Lab03 環境監控系統 UART傳輸 ................... 11 Lab02 自動空調系統 - 溫濕度感測器應用 ....... 01 Lab01 Chi Leel初體驗-控制按鈕與馬達

Transcript of Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Page 1: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

113Lab10 PSoC to PC 網際網路傳輸.........................

137Lab11 即時變更連線對象.....................................

163Lab12 HTTP 訊息處理...........................................

106Lab09 GPS 全球定位系統.....................................

94Lab08 RFID 身分辨識與加值...............................

81Lab07 橋樑傾斜偵測 – G-sensor 與 GPRS ........

70Lab06 智慧電網 – OMU監控用電 .....................

61Lab05 智慧微塵 – Simple Node蒐集資料 ........

47Lab04 快速建構WSN – ZigBee 自動組網 ........

27Lab03 環境監控系統 – UART傳輸 ...................

11Lab02 自動空調系統 - 溫濕度感測器應用 .......

01Lab01 Chip Level初體驗-控制按鈕與馬達

目 錄

Page 2: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Lab0Lab0Lab0Lab01111 ChipChipChipChip----Level Level Level Level 初體驗初體驗初體驗初體驗

----控制控制控制控制按鈕與馬達按鈕與馬達按鈕與馬達按鈕與馬達

實驗目標實驗目標實驗目標實驗目標 熟悉 PSoC Chip-Level 的開發流程, 分別透過點亮 LED 燈以及開

關風扇,了解 PSoC 基本輸出、輸入的運作方式。

實驗器材實驗器材實驗器材實驗器材 � FLAG-1605A � 5V DC 3 線風扇 � 2N2222 NPN 電晶體 � 330 歐姆(Ω)電阻

工具工具工具工具軟體軟體軟體軟體 � 無

設計與原理設計與原理設計與原理設計與原理 實驗所使用的 FLAG-1605A 開發板 (以下簡稱開發板) 採用

CY8C29466 晶片, 該晶片共有 3 個 8-bits 的 GPIO Port, 分別編號為

Port0、Port1、Port2。以 Port0 為例, 8 位元對應到 P0[0] ~ P0[7] 這

8 支接腳。在 C 程式中, 可用預先定義好的 PRT0DR、PRT1DR、

PRT2DR 三個變數來控制 Port0、Port1、Port2 這 3 個 Port, 讀取

或設定這 3 個變數的值, 就可以取得或設定對應 Port 的腳位值。

※註:P0[0] = P00 =Port0_0 = Port0、Pin0,依此類推。

實驗中會將開發板上的 LED1 連接到 P0[0] , 將 K1 按鈕連接到

P1[7] 。讀取 P1[7] 的值可判斷是否按下 K1 按鈕, 並據以改變

P0[0] 的值,以決定 LED1 的亮或滅。之後將 P0[0] 改接到風扇,

變成用按鈕來控制風扇。

另外, 每支 I/O 接腳有多種驅動模式 (各模式的說明請參考晶片的

Technical Reference Manual), 本實驗中 P0[0] 因為是要用來點亮

LED 與推動風扇, 所以必須選用 Strong 模式;而 P1[7] 因為是要

用來偵測按鈕的狀態, 所以必須選用 Pull Down 模式。

1

Page 3: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

麵包板麵包板

7-9VDCINPUT

US

B

LC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P17

P16

P15

P14

P13

P12

P11

P10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LG

LB

BZ

BL

T

RF

_RX

RF_T

X

VR

VR

1

VR2

PSoC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

P00----LED1

P17----K1

麵包板麵包板

7-9VDCINPUT

US

B

LC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P17

P16

P15

P14

P13

P12

P11

P10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LG

LB

BZ

BL

T

RF

_RX

RF_T

X

VR

VR

1

VR2

PSoC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

P00----LED1

P17----K1

實驗步驟實驗步驟實驗步驟實驗步驟

1. 在 PSoC Designer 的【Start Page】按下【New Project】, 或是執

行『File \ New Project』命令

1

2

3

接著要選擇晶片型號 (如果已經建立過專案, 【Device】欄位會

顯示前一次使用的型號, 如果顯示的型號已經是

2

Page 4: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

CY8C29466-PXI, 則可直接按【OK】、跳到步驟 2.):

4

若視窗太小, 可使用底部的捲軸往右邊捲動, 或是利用視窗邊

框拉大視窗, 即可看見【Package】欄:

4

56

7 接著選擇使用 C 程式語言:

3

Page 5: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

8

9

2. 接下來要設定連接 LED1 與 K1 按鈕的接腳的驅動模式, 請

在 PSoC Designer 視窗的左下角找到【Pinout】視窗, 首先設定

連接 LED1 的 P0[0] 為【Strong】模式:

1 2

3

接著再設定連接 K1 按鈕的 P1[7] 為【Pull Down】驅動模式:

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

4 5

6

4

Page 6: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設定 P0[0] 為 0將 LED1 熄滅

取得 K1 按鈕狀態, 即PRT1DR 的最高位元

按鈕狀態與前次不同?

按下 K1?

將 P0[0] 的值在0 與 1 間切換,

以點亮或熄滅LED

記錄此次按鈕狀態值

Y

Y

N

N

設定 P0[0] 為 0將 LED1 熄滅

取得 K1 按鈕狀態, 即PRT1DR 的最高位元

按鈕狀態與前次不同?

按下 K1?

將 P0[0] 的值在0 與 1 間切換,

以點亮或熄滅LED

記錄此次按鈕狀態值

Y

Y

N

N

1. 接著請在右上角的 Workspace Explorer 視窗如下操作:

1

2雙按

展開

5

Page 7: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

自動產生的程式

2. 請鍵入以下的程式碼:

3. 輸入完畢後, 請按 F6 執行編譯及建置作業, 如果正確無誤, 會

看到顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

4. 接著請將 PSoC MiniProg 燒錄器插到開發板:

6

Page 8: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P 07

P 06

P 05

P 04

P 03

P 02

P 01

P 00

P 27

P 26

P 25

P 24

P 23

P 22

P 21

P 20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P 07

P 06

P 05

P 04

P 03

P 02

P 01

P 00

P 27

P 26

P 25

P 24

P 23

P 22

P 21

P 20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

燒錄器接這裡

5. 按下 Ctrl+F10 進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

7

Page 9: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

燒錄中

驗收成果驗收成果驗收成果驗收成果::::

1. 如果燒錄時有接上變壓器, 燒錄完成後即會供電, 可跳至下一

步驟驗收成果。如果燒錄時沒有接上變壓器, 則可如下操作由

燒錄器供電:

燒錄成功

8

Page 10: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

未接變壓器時可按此由燒錄器供電

2. 按一下開發板上的 K1 按鈕, LED1 會點亮, 再按一次則會熄

滅, 依此切換:

按 K1 按鈕LED1 亮燈

9

Page 11: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 確認以上操作正確無誤後, 再將 P0[0] 改為推動風扇, 請依照

下圖接線 (電晶體為針腳朝下由上俯視為半圓形的電子零件,

此時半圓形若朝左針腳由上至下依序為 C、B、E 腳;330Ω電

阻為「橙橙棕」色環):

4. 正確接上風扇後, 即可如同之前點亮 LED1 一樣,利用 K1 按

鈕控制風扇是否轉動。

10

Page 12: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Lab0Lab0Lab0Lab02222 自動空調自動空調自動空調自動空調----溫濕度感測器應用溫濕度感測器應用溫濕度感測器應用溫濕度感測器應用

實驗目標實驗目標實驗目標實驗目標

感測器是 WSN 的基石, 本實驗就要透過溫濕度感測器的使用,

了解如何將類比訊號轉換成數位數值 (ADC), 並進而利用溫濕度

值自動切換開關上一個實驗完成的風扇, 達到自動控制空調的功

能。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-1613A 溫濕度模組 � LCD 模組 � 5V DC 3 線風扇 � 2N2222 NPN 電晶體 � 330Ω 電阻

軟體清單軟體清單軟體清單軟體清單

� 無

11

Page 13: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要是練習讀取類比訊號並轉換為數位數值的方法, 由於

在 WSN 中會遇到許多以類比訊號輸出的感測器, 因此只要學會

本實驗的方法, 就可以應用在各種不同的感測器上。

為了讀取溫濕度模組的輸出值, 我們使用一個 PSoC 內建的多工器

(Multiplexer) 來切換腳位,輪流讀取溫度值和濕度值, 並透過一個

放大率(Gain)為 1 的 PGA 模組來避免訊號衰減, 確保訊號的完整

性, 最後再使用 ADC 模組將類比的電壓訊號轉成數位數值。

此外, 本實驗也會接上一個可顯示兩列文字、每列 16 個英文字母

的 LCD, 並將計算出的溫度與濕度顯示在 LCD 上。程式會依據

溫度是否高於 28℃, 或是相對濕度是否高於 65% 而打開風扇調

節溫濕度。

溫度 濕度

12

Page 14: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

本實驗保留上一個實驗的風扇接線, 而原本接按鈕控制風扇從

K1 到 P1[7] 的單芯線則不再需要, 其他實體接線如下:

F1613A 溫濕度模組

+5V +5V

Hum P0[7]

GND GND

Temp P0[5]

LCD 模組 排線 開發板的 LCD 插槽

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

C

E

B

2N2222電晶體

風扇

紅線黑線

330Ω

FLAG

+5VHumGNDTem

LCD 模組

F1613A溫濕度模組

Hum----P07

Tem----P05

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

C

E

B

2N2222電晶體

風扇

紅線黑線

330Ω

FLAG

+5VHumGNDTem

LCD 模組

F1613A溫濕度模組

Hum----P07

Tem----P05

實驗步驟實驗步驟實驗步驟實驗步驟

1. 在 PSoC Designer 的【Start Page】按下【New Project】, 或是執

13

Page 15: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

行『File \ New Project』命令建立 Chip-Level 專案 WSN_02

1

2

3

接著選擇使用 C 程式語言:

4

5

2. 本實驗仍沿用上一個實驗透過 P0[0] 推動風扇的設計, 因此要

設定 P0[0] 腳位的驅動模式:

1 2

14

Page 16: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 接下來要設定連接溫濕度模組的腳位, 由於溫度與濕度都是類

比輸入, 因此必須設定 P0[5] 與 P0[7] 腳位為【AnalogInput】類型, 驅動模式為【High Z Analog】:

12

3

45

6

4. 前面提過, 我們要使用一個多工器來切換讀取溫度與濕度的輸

入值, 因此這裡要加入一個 AMUX4 模組, 請在 PSoC Designer 右下角找到【User Modules】視窗, 展開【MUXs】:

雙按

5. 接著要設定剛剛加入的 AMUX4 模組, 請在右上角找到

【Workspace Explorer】視窗, 按一下【AMUX4_1】:

15

Page 17: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1

請在 PSoC Designer 左方找到【Properties】視窗, 並設定屬性:

1

2

由於 PSoC Designer 會為每個新增的模組自動命名, 但我們的

程式使用到的 API 事先定義好了個模組的名稱, 因此這裡務

必要將模組名稱更改為畫面設定的名稱, 編譯時才不會出錯。 PSoC 具有 4 個 4 位元的多工器, 編號分別為 0~3, 這些多工

器都只能從 Port0 讀取輸入, 編號 0 與 2 的多工器只能從單

號腳位讀取訊號, 而編號 1 與 3 的多工器則只能從雙號腳位

讀取訊號。由於我們將溫度與濕度的訊號接到 P0[5] 與 P0[7]

兩個單號腳位上, 因此這裡將【Analog Column Mux】設為

【AInMux_0】, 表示要使用編號 0 的多工器。

6. 新增完多工器後, 要再加上保持訊號完整性的 PGA 模組, 請

在【User Modules】視窗中展開【Amplifiers】:

16

Page 18: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

雙按

由於 PGA 要從多工器取得訊號, 而上一步驟中將 AMUX4 模組的【Analog Column Mux】設為【AInMux_0】, 所以這裡要

確認新增的 PGA 模組是放置在 ACB00 這個類比區塊中, 這

樣才能從與之連接的 0 號多工器讀取訊號:

7. 然後在【Workspace Explorer】視窗中選取剛剛新增的 PGA 模

組:

17

Page 19: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1

並在【Properties】視窗中如下設定 PGA 模組的屬性:

2

34

5

上圖中【Gain】設定放大率為 1, 將 PGA 做為 emitter follower, 放

在 ADC 前面可以保持訊號的完整性;【Input】設定為

【AnalogColumn_InputMUX_0】, 表示要從 0 號多工器讀取訊

號。

8. 接著就是要加入真正進行類比訊號轉數位的 ADC 模組:

18

Page 20: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

雙按

1

2

由於 ADC 模組要由 PGA 模組讀取訊號, 因此最好將 ADC 模組放在 ASC10 類比區塊中, 才能將 PGA 模組所在的 ACB00 區塊當成輸入來源:

19

Page 21: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

ADC 模組

之前加入的P GA 模組

9. 接著設定 ADC 模組:

1

23

45

【DataFormat】設定要轉換為有號或無號的數位值, 由於

【Resolution】中設定 ADC 的取樣解析度為 12 Bit, 所以如果選

擇 Unsigned 表示數位值的範圍為 0~4095, 若選擇 Signed 表示

數位值的範圍為 -2048~2047。這裡因為溫濕度均為正值, 所以

20

Page 22: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設為【Unsigned】;【Data Clock】表示其時脈來源, 【PosInput】

則設定其輸入端, 由於要從 PGA 模組取得訊號, 而在上一頁

的圖中可以看到 PGA 放置於 ACB00 區塊, 所以此處設定輸入

端為 ACB00。

10. 接著我們加入用來顯示溫濕度的 LCD 模組:

雙按

1

2

由於開發板上的電路已經預先將 LCD 插槽連接到 Port2, 因

此這裡【LCDPort】就要設為【Port_2】

11. 最後要設定專案的【Global Resources】, 才能讓所有的模組正

常運作:

21

Page 23: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1

23

4

其中【Power Setting】設定的是系統的工作電壓和時脈, 【CPU_Clock】設定的是 CPU 的執行時脈, 這裡設為和系統時

脈一樣。由於剛剛設定 ADC 的【Data Clock】為 VC1, 而 ADC 模組可接受的時脈為 0.032~8.0 MHz, 因此這裡設定 VC1 為 SysClk/8, 以符合此範圍。另外, 因為溫濕度模組輸出的電壓範

圍為 0~5V, 所以這裡【Ref Mux】必須設定為

【(Vdd/2)+/-(Vdd/2)】。

12. 接著要撰寫程式, 請在右上角的 Workspace Explorer 視窗如下

操作開啟程式碼編輯視窗:

1

2雙按

展開

刪除原先自動產生的程式碼:

22

Page 24: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

全部選取後刪除

13. 請用【記事本】開啟 \Workshop\原始程式碼\WSN_02.txt, 複製

到程式碼編輯視窗中:

全選後複製

將程式碼貼入main.c

14. 程式碼鍵入完畢後, 請按 F6 編譯及建置專案, 如果正確無誤,

會看到顯示錯誤與警告數量均為 0:

23

Page 25: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

編譯結果無錯誤與警告

15. 接著請將 PSoC MiniProg 燒錄器插到開發板, 按下 Ctrl+F10

進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

利用 ADC 轉換取得溫度與濕度

將溫度與濕度顯示在 LCD 上

溫度 > 28℃濕度 > 65%

開啟風扇

關閉風扇

Y

N

24

Page 26: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式使用溫濕度模組的 API 來讀取溫濕度, 其說明如下:

� int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)

此 API 用來讀取溫度資料, 回傳值為攝氏溫度 *10 的整數, 所

以要再除 10 才是實際溫度。參數說明如下:

� amuxPinamuxPinamuxPinamuxPin:AMUX4 所要切換到的腳位。

� strstrstrstr:函式會將溫度存入的字串 (精確至小數 1 位), 若 str==0

表示不存入。

� int int int int Flag_1613_getHumidityFlag_1613_getHumidityFlag_1613_getHumidityFlag_1613_getHumidity(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)

此 API 用來讀取溼度資料, 回傳值為 0~100 的整數, 假設傳回

80, 表示濕度為 80%。其參數用法與上一個函式相同。

另外, 程式也使用到了 LCD 模組的 API:

� LCD_Start LCD_Start LCD_Start LCD_Start ()()()()

啟動 LCD。

� void LCDvoid LCDvoid LCDvoid LCD_Position(BYTE bRow, BYTE bCol)_Position(BYTE bRow, BYTE bCol)_Position(BYTE bRow, BYTE bCol)_Position(BYTE bRow, BYTE bCol)

設定後續顯示文字的位置, 各參數的意義如下:

� bRowbRowbRowbRow:顯示在第幾橫列 (0:第 1 列;1:第 2 列)。

� bColbColbColbCol:顯示在第幾格。

� void LCD_PrString(CHAR * sRamString);void LCD_PrString(CHAR * sRamString);void LCD_PrString(CHAR * sRamString);void LCD_PrString(CHAR * sRamString);

在目前位置顯示字串。

驗收成果驗收成果驗收成果驗收成果::::

1. 供電開發板後, LCD 會顯示目前的溫度與濕度值

25

Page 27: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

溫度 濕度

2. 如果對著溫濕度模組吐氣, 則溫度與濕度都會升高, 當溫度超

過 28℃或濕度超過 65%, 風扇就會自動轉動;當溫度或濕度降

下來時, 風扇則會自動停止。

26

Page 28: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab00003333 環境監控系統環境監控系統環境監控系統環境監控系統----UARTUARTUARTUART 傳輸傳輸傳輸傳輸

實驗目標實驗目標實驗目標實驗目標

UART 是許多通訊模組以及數位式感測器採用的通訊介面, 本實

驗就要學習 UART 的使用, 了解如何將感測器蒐集的數據透過

USB 線傳輸到個人電腦, 同時又可以反方向由個人電腦下達指

令,控制接在開發板上的風扇。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-1613A 溫濕度模組 � LCD 模組 � 5V DC 3線風扇 � 2N2222 NPN 電晶體 � 330Ω 電阻

軟體清單軟體清單軟體清單軟體清單

� AccessPort

27

Page 29: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要是練習 UART 介面使用的方法, 由於我們所使用的開

發板上有一個 UART 轉 USB 的橋接晶片, 因此可以藉由這顆晶

片當媒介, 從 UART 經過 USB 線連接到個人電腦, 達到 PSoC

與個人電腦雙向傳輸的目的。本實驗的架構圖如下:

F1613A溫濕度計

F1605AP S oC開發板

UARTTo

US B

風扇

UART USB

個人電腦

除了如同前一個實驗將溫濕度值顯示在 LCD 上以外, 本實驗還

會將溫濕度值傳遞到個人電腦上, 而從個人電腦端可以下達

"ON"、"OFF"、"AUTO" 指令來控制風扇的模式, "ON" 模式會讓風

扇一直轉動, 而 "OFF" 模式則會讓風扇停止不動, "AUTO" 模式

則是讓風扇如同上一個實驗一樣依據溫度與濕度的值決定是否開

啟風扇, LCD 上同時也會顯示目前的風扇模式。

UART (Universal Asynchronous Receiver Transmitter, 非同步式串

列資料傳輸)又稱為『起止式同步方式』, 其資料的基本結構是由

起始位元 (start bit)、資料位元 (data bit)、同位位元 (parity bit) 及 停止位元 (stop bit) 所構成, 如下圖所示。

起始位元

資料位元

1-bit 8-bit

同位位元

1-bit

結束位元

1-bit

其中, 同位位元的檢查方式可分為『不檢查』、『偶同位』或『奇同

位』等 3 種, 在 PSoC UART 模組中可透過函式來設定。

28

Page 30: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

PSoC UART模組的 baud rate, 是由模組的輸入時脈 (Clock屬性) 來設定, baud rate必定是輸入時脈的 8 分之一,若希望 baud rate為19200 bps, 則輸入頻率需為 19200 × 8 = 153600 Hz。以 PSoC預設

的系統時脈 24 MHz來說, 必須除以 156才會得到近似值( 24 MHz ÷ 156=153846 Hz ≈ 153600 Hz)。在本實驗就是用此方式產生

UART 模組的輸入時脈:

如果有兩個模組要利用 UART 介面互傳資料, 由於 UART-TX 端只

負責傳送資料, UART-RX端只負責接收資料, 因此 UART 的 TX 端

必須接到對方的 RX 端。此外, 連線雙方要有相同的準位才能正確

地進行傳遞與接收, 因此兩邊的接地線 (GND) 也必須對接。

本實驗的另一個重點在於了解 PSoC 特殊的內部佈線功能, 以便

決定 UART 介面的輸出接腳與輸入接腳。PSoC 的字首 "P" 除了

代表可程式化以外, 也代表其晶片內部的佈線也一樣可以動態調

整, 以符合實際需要。因此, 同樣使用 UART 介面, 但實體的輸出

或輸入接腳可以彈性變動, 而非固定在某些接腳。

硬體線路硬體線路硬體線路硬體線路

本實驗保留上一個實驗的硬體接線, 但增加了 PSoC UART 接到

UART to USB 橋接晶片的線路:

TX

TX RX

RX

GND GND

系統時脈

24 MHz ÷156 UART 24 MHz 153846 Hz

29

Page 31: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

P1[4] - RX1

P1[5] - TX1

實驗步驟實驗步驟實驗步驟實驗步驟

1. 本實驗會沿用上一個實驗的專案, 請開啟 WSN_02 專案,執行

『File \ Save Workspace As』命令將專案另存成 WSN_03

1

2

30

Page 32: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3

4

2. 首先設定【Global Resources】, 以便提供對應後續 UART

baudrate 的時脈:

2

1

3

如同前述, 由於希望 PSoC UART 的 baudrate 為 19200bps, 因此這裡將【Power Setting】設為 5.0V/24Mhz、【VC3 Source】設

為 SysClk/1,表示 VC3 時脈來源為 24MHz, 再將【VC3 Divider】設為 156, 即可讓 VC3 的時脈為最接近且大於或等於 19200 × 8。

3. 接著要加入一個 UART 模組, 才能透過 UART 介面傳輸資料,

請到【User Modules】視窗:

31

Page 33: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

展開雙按

4. 接下來要設定 UART 模組的屬性:

2

45

1

3

由於範例程式係假設 PSoC UART的名稱是 UART, 因此

【Name】必須設定為 UART,否則編譯連結時就會出現錯誤。

【Clock】則設定為上一步驟已經設好的 VC3, 由於 VC3 是由 24MHz 的系統時脈除頻而得, 所以【ClockSync】也要設為 Sync to SysClk。另外, 因為此實驗會使用 PSoC 所提供處理 UART 傳輸的 Command Buffer 機制, 因此必須將【RxCmdBuffer】設

定為 Enable, 並將【CommandTerminater】設為 13, 表示會以 ASCII 碼 13 的字元 (也就是 Enter) 作為單一列文字的結尾。

5. 接著要設定 UART 模組的內部佈線, 以便將 UART 的 RX

32

Page 34: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

連接到 P1[4] 腳位、而 UART 的 TX 連接到 P1[5] 腳位:

2

1

請先按一下代表 UART 輸入的區塊 (即標示有 UART RX 字

樣的數位區塊) 中紅色 RX Input 字樣, 即會出現選擇腳位的

清單, 如果想要連接到某暫存器中編號為 0~3 之間的腳位, 就

直接選取 Row_0_Input_X, 其中 X 就是腳位的編號;若是要連

接到腳位 4~7, 則要對應選取 Row_0_Input_Y, 其中 Y 為腳

位編號 – 4。由於我們想將 UART 的輸入腳位定在 P1[4], 所以這裡選取 Row_0_Input_0。選取後可以看到 RX Input 的線

連接到上方排線 (代表輸入線路) 的第 1 條橫線 (由於編號由 0 開始, 所以這條橫線代表 0 號腳位或 4 號腳位)。

33

Page 35: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2

1

3

4

接著點選上方第 1 條橫線, 會開啟【Digital Interconnect】視窗, 點選中間紅色梯形內部, 就會顯示選擇清單, 如果要連接到單

號的暫存器, 就要配合腳位編號選擇 GlobalInOdd 開頭的選項, 否則就要選取 GlobalInEven 開頭的選項, 由於我們是要將 UART 的 RX 連接到 P1[4] 腳位, 為單號暫存器, 所以選取 GlobalInOdd_4。

1

23

可以看到上方第一條橫線已經連結到 GIO (代表 GlobalInOdd) 下方的第 5 條直線 (腳位編號由 0 開始, 所以這條直線代表 4 號腳位), 按此條直線即會出現選擇腳位的畫面, 由於我們前

面指定了要連接到單號暫存器的 4 號腳位, 因此畫面中只會

出現 Port1_4 可選, 這是因為我們所使用的晶片只有 0、1、2

34

Page 36: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

這 3 個暫存器, 因此單號暫存器只有 Port1。請選取 Port_1_4。

可以看到現在 GlobalInOdd4 已經連到 Port_1_4 了。這樣, 我

們就完成將 UART 模組的 RX Input 連接到 P1[4] 腳位了。

6. 使用同樣的方法, 我們可以將 UART 的 TX Output 連接到

P1[5] 腳位:

21

35

Page 37: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

一樣先在 UART TX 區塊的 TX Output 字樣上點一下, 由於

要將 TX Output 連接到 P1[5] 腳位, 所以選取 Row_0_Output_1。

2

1

3

可以看到 TX Output 已經連接到下方排線 (代表輸出線路) 的

第 2 條橫線, 點選該橫線會出現【Digital Interconnect】視窗, 由

於我們要連接到單號暫存器的 5 號腳位, 因此必須選取最下

方連接到 GOO (代表 Global Out Odd) 下第 6 條 (腳位編號

由 0 開始, 所以這條直線代表 5 號腳位) 直線的三角形。

21

3

36

Page 38: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

這樣就會連接到 GDD 下的第 6 條直線, 點選該直線後即可

選擇腳位, 請選取 Port_1_5。

這樣就把 UART TX Output 連接到 P1[5] 腳位, 也完成了 UART 模組的全部設定了。

7. 接著要撰寫程式, 請在右上角的 Workspace Explorer 視窗如下

操作開啟程式碼編輯視窗:

1

2雙按

展開

刪除上一個實驗的程式碼:

37

Page 39: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

全部選取後刪除

8. 請用【記事本】開啟 \Workshop\原始程式碼\WSN_03.txt, 複製到

程式碼編輯視窗中:

全選後複製

貼入程式碼

9. 程式碼鍵入完畢後, 請按 F6 編譯及建置專案, 如果正確無誤,

38

Page 40: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

會看到顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

10. 接著請將 PSoC MiniProg 燒錄器插到開發板, 按下 Ctrl+F10

進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

39

Page 41: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

利用 ADC 轉換取得溫度與濕度

將溫度與濕度顯示在 LCD 上

風扇模式為 ON或模式為 AUTO 且

(溫度 > 28℃或濕度 > 65%)

開啟風扇

Y

N

據上次送資料已過 8 秒

如果收到字串

顯示目前風扇模式

關閉風扇

從 UART 送出溫度與濕度值

N

Y

N

Y

依據 ON、OFF、AUTO設定風扇模式

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式使用 UART 模組的 API 來傳輸資料, 其說明如下:

� void UART_IntCntl(BYTE bMask)void UART_IntCntl(BYTE bMask)void UART_IntCntl(BYTE bMask)void UART_IntCntl(BYTE bMask)

用來啟用控制 UART 傳輸資料的中斷, 參數的意義如下:

� bMaskbMaskbMaskbMask:要啟用或是禁用的 RX 或是 TX 中斷, 本實驗傳

入 UART_ENABLE_RX_INT, 表示啟用 RX 中斷, 這樣才

能讓後續用到的 Command Buffer 機制運作。

� void UART_Start(BYTE bParitySetting)void UART_Start(BYTE bParitySetting)void UART_Start(BYTE bParitySetting)void UART_Start(BYTE bParitySetting)

用來啟動 UART, 參數的意義如下:

� bParitySettingbParitySettingbParitySettingbParitySetting:指定同位校驗的方式, 本實驗傳入

UART_PARITY_NONE 表示不進行同位校驗。

40

Page 42: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� BYTE UART_bCmdCheck(void)BYTE UART_bCmdCheck(void)BYTE UART_bCmdCheck(void)BYTE UART_bCmdCheck(void)

用來檢查是否已經從 UART 收到【CommandTerminator】屬性

所指定的字元, 若收到即表示已經收到一列完整的字串。

� void UART_CmdReset(void)void UART_CmdReset(void)void UART_CmdReset(void)void UART_CmdReset(void)

用來重置 Command Buffer 機制的暫存區, 以便可以接收新的

資料。由於 Command Buffer 機制會在 UART 收到

【CommandTerminator】屬性所指定的字元後等待程式讀取資料,

暫停從接收新資料的動作, 因此當程式已經讀取完 Command

Buffer 中的資料後, 必須呼叫此一函式通知 Command Buffer

機制可以繼續接收新資料, 否則就收不到後續的資料。

� char * UART_szGetRestOfPachar * UART_szGetRestOfPachar * UART_szGetRestOfPachar * UART_szGetRestOfParams(void)rams(void)rams(void)rams(void)

用來讀取 Command Buffer 目前收到的字串。

� void UART_PutString(char * szRamString)void UART_PutString(char * szRamString)void UART_PutString(char * szRamString)void UART_PutString(char * szRamString)

從 UART 送出一個以 0 字元結尾的字串:

� szRamStringszRamStringszRamStringszRamString:要送出的字串。

程式中還會使用到以下 C 函式:

� int cstrcmp(const char *s1, char *s2);int cstrcmp(const char *s1, char *s2);int cstrcmp(const char *s1, char *s2);int cstrcmp(const char *s1, char *s2);

用來比較兩個字串是否相等, 要注意的是 PSoC 中會區分

ROM 與 RAM 中的變數, 兩者不可混用, 標示有 const 的為

ROM 中的變數, 程式中不能更改其值, 如果有此類參數, 通常

函式名稱就會加上 "c", 像是本函式就是 "cstrcmp", 此類函式

都會有對應無 ROM 變數的版本, 像是 strcmp 就是 cstrcmp

的無 ROM 變數版本。參數的意義如下:

� s1s1s1s1:要比較的字串之一, 要注意的是標示有 const 的變數必

須是存放在 ROM 中無法變更值的變數。

� s2s2s2s2:要比較的另一個字串, 這個變數必須是存放在 RAM 中

的變數。

41

Page 43: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 傳回值傳回值傳回值傳回值:若兩個字串內容相同, 就傳回 0, 否則傳回非 0

值。

整個程式與前一個實驗的差異為以下幾段:

這裡主要是依據風扇目前的模式判斷是否要開啟風扇。如果風扇

是 FanOn (開啟) 模式, 或是風扇是在 FanAuto (自動) 模式, 但

溫度與濕度高過標準值時, 就開啟風扇, 否則就關閉風扇。

這一段是利用變數 i 記錄迴圈執行的次數, 如果是第 300 次, 就

將溫度與濕度值透過 UART 傳出去, 這樣的作法可以避免連續

不斷送出資料, 造成接收端的負荷。以本實驗時脈的設定, 這個間

隔大約是 8 秒鐘。

這一段則依據從 UART 收到的字串來更改風扇的模式。比較字串

內容時使用的就是之前介紹過的 cstrcmp 函式。

驗收成果驗收成果驗收成果驗收成果::::

42

Page 44: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1. 為了透過 PC 的螢幕和鍵盤來觀察結果與輸入資料, 我們要用

USB 線連接開發板與 PC。請在燒錄後將 USB 線連接燒錄器的

一端拔除, 改接到 PSoC 開發板上的 USB 接頭。

2. 由於 PSoC 開發板上的 UART to USB 橋接晶片會在 Windows

模擬出一個串列埠, 因此我們要先查出該埠的編號, 才能使用

軟體從該埠收發資料。請開啟【控制台】:

2

1

3

找到 Silicon Labs CP210x 開頭的即為模擬的串列埠, 記下該

埠的編號 (此處為 COM9)。

3. 請開啟『\Workshop\工具程式』資料夾下的 AccessPort 軟體:

發送區

接收區

1.按此鈕設定串列埠

43

Page 45: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2.選取剛剛查到的埠號

3.依此設定

4

4. 這樣就會在 AccessPort 上方的接收區中看到由 PSoC 開發板

送過來的溫濕度值:

P SoC 送來的溫濕度

5. LCD 也會顯示目前的溫度與濕度值, 以及預設的風扇模式

Auto:

44

Page 46: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

溫度 濕度

風扇模式

6. 如果在 AccessPort 的輸入區鍵入 "ON"(大寫字母) 並按一下

Enter, 再按下【發送資料】, 就會看到 LCD 顯示風扇模式改為

"ON", 且不論溫度與濕度是否高於標準, 都會強制啟動風扇:

1.鍵入 ON, 以及 Ente r 鍵

2

45

Page 47: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

風扇變成 ON 模式

7. 你也可以鍵入 "OFF"(大寫字母)強制電扇停止, 或是鍵入 "AUTO" (大寫字母)讓電扇回到自動模式(依據溫濕度值來決

定)。

※因為 Access發送區的游標經常會『失蹤』,導致我們在輸入指令

時,無法確定是否已經全數清除先前的指令。因此建議的操作順

序如下:先按先按先按先按【【【【清空數據清空數據清空數據清空數據】】】】鈕之後鈕之後鈕之後鈕之後,,,,再輸入指令再輸入指令再輸入指令再輸入指令、、、、按按按按 Enter 鍵鍵鍵鍵,

最後才按【發送資料】鈕!

46

Page 48: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab00004444 快速建構無線網路快速建構無線網路快速建構無線網路快速建構無線網路----ZigBeeZigBeeZigBeeZigBee

自動組網自動組網自動組網自動組網

實驗目標實驗目標實驗目標實驗目標

本實驗將使用低耗電、可自動組網的 ZigBee 模組無線傳輸, 達到

遠端無線監控溫濕度, 並且可以從遠端無線遙控開發板上的風扇。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-1613A 溫濕度模組 � FLAG-N002 ZigBee 模組 � LCD 模組 � 風扇 � 2N2222 NPN 電晶體 � 330Ω 電阻

軟體清單軟體清單軟體清單軟體清單

� Flag WSNDashboard

47

Page 49: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要透過 ZigBee 模組, 達到 PSoC 與個人電腦遠端雙向

無線無線無線無線傳輸資料的目的。本實驗的架構圖如下:

F1613A溫濕度計

F1605AP S oC開發板

風扇

個人電腦

IOT S e rve r雲端資料庫

ZigBe e ZigBe e

本實驗會將開發板所偵測到的溫濕度值透過 ZigBee 無線網路傳

遞到講師的個人電腦上, 並在講師的電腦上顯示出來, 同時也會

將資料上傳到雲端的資料庫。講師也可由個人電腦端經特定節點

編號的 ZigBee 模組向連接的開發板下達 "ON"、"OFF"、"AUTO"

指令來控制風扇的模式, 達到遠端雙向無線溝通的目的。

實驗所用到的 ZigBee 模組是透過 UART 介面傳送資料, 因此只

要使用上一個實驗所加入的 UART 模組, 就可以相近的方法透過

ZigBee 進行無線傳輸。

ZigBee 規格具有低耗電、自動組網的功能, 本實驗就是利用

ZigBee 模組自動組成 Mesh 網路, 達到即使兩個模組之間相距甚

遠, 也能夠透過中介模組自動轉送而能互相收發資料, 輕易地建

立無線感測網路。

48

Page 50: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

本實驗要透過 ZigBee 模組傳輸資料,所以要將 UART 的 RX 與

TX 改成接到 ZigBee 模組:

P1[4] - RF_R

P1[5] - RF_T

ZigBee 模組的接法如下:

RX (Pin3, 黃線) - RF MODULE TX

TX (Pin4, 藍線) - RF MODULE RX

GND (Pin6, 黑線) - RF MODULE GND

3.3V (Pin7, 紅線) - 3.3V

麵包板麵包板

7-9VDCINP UT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P 07

P 06

P 05

P 04

P 03

P 02

P 01

P 00

P 27

P 26

P 25

P 24

P 23

P 22

P 21

P 20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_R

X

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

C

E

B

2N2222電晶體

風扇

紅線黑線

330Ω

FLAG

+5VHumGNDTem

LCD 模組

F1613A溫濕度模組

ZigBee 模組(針腳在背面)

藍線

黑線

ZB藍線藍線藍線藍線----RX

ZB黃線黃線黃線黃線----TX

ZB紅線紅線紅線紅線----3V3

P14----RF_R

P15----RF_T

ZB黑線黑線黑線黑線----GND

※本實驗沒用到 ZigBee 的『綠線』和『白線』!

要特別留意的是 ZigBee 模組要接 3.3V 3.3V 3.3V 3.3V 的電源, 因此要將紅線接

到變壓器插座左下方的 3V3 3V3 3V3 3V3 插槽插槽插槽插槽。

49

Page 51: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 本實驗會沿用上一個實驗的專案, 請開啟 WSN_04 專案,執行

『File \ Save Workspace As』命令將專案另存成 WSN_05

1

2

3

4

2. 由於程式中會用到旗標的 ZigBee 模組 API, 所以必須更改

【Name】屬性內容為 ZigBee_UART:

3

1.展開

2

4

此外, 由於 ZigBee API 會自行處理 UART 收送資料,不使用

之前採用的 Command Buffer 機制, 因此將【RxCmdBuffer】設

為 Disable。

3. 接著要加入旗標 ZigBee API 所需要的引入檔:

50

Page 52: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1.展開

2.按右鈕

3

2

1

3

4

4. 接著要撰寫程式, 請在右上角的 Workspace Explorer 視窗如下

操作開啟程式碼編輯視窗:

51

Page 53: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1

2雙按

展開

刪除上一個實驗的程式碼:

全部選取後刪除

5. 請用【記事本】開啟 \Workshop\原始程式碼\WSN_05.txt, 複製到

main.c 中:

52

Page 54: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

全選後複製

貼入程式碼

6. 鍵入完畢後, 請按 F6 編譯及建置專案, 如果正確無誤, 會看到

顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

7. 接著請將 PSoC MiniProg 燒錄器插到開發板, 按下 Ctrl+F10

進行燒錄。

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

53

Page 55: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

利用 ADC 轉換取得溫度與濕度

將溫度與濕度顯示在 LCD 上

風扇模式為 ON或模式為 AUTO 且

(溫度 > 28℃或濕度 > 65%)

開啟風扇

Y

N

據上次送資料已過 8 秒

如果收到字串

顯示目前風扇模式

關閉風扇

從 ZigBee 模組傳出溫度與濕度值

N

Y

N

Y

依據 ON、OFF、AUTO設定風扇模式

設定傳送目的為 0 號節點

初始化 ZigBee 模組取得節點編號

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式雖然仍是透過 UART 傳遞資料, 但 UART 介面改為連接

到 ZigBee 模組,所以會用到 ZigBee API,主要的 API 說明如下:

� void Flag_Zivoid Flag_Zivoid Flag_Zivoid Flag_ZigBee_Start(void)gBee_Start(void)gBee_Start(void)gBee_Start(void)

初始化 ZigBee 模組, 由於 ZigBee API 會用到先前所介紹的

SleepTimer API, 因此會自行初始化 SleepTimer 模組, 不必再

額外呼叫 Flag_SleepTimer_Start()。

54

Page 56: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� int Flag_ZigBee_GetNodeID(unsigned int *nodeID)int Flag_ZigBee_GetNodeID(unsigned int *nodeID)int Flag_ZigBee_GetNodeID(unsigned int *nodeID)int Flag_ZigBee_GetNodeID(unsigned int *nodeID)

取得 ZigBee 模組節點編號, 若發生錯誤, 會傳回 -1, 參數意

義如下:

� nodeIDnodeIDnodeIDnodeID:指向用來存放節點編號的無號整數的指標

� void Flag_Zivoid Flag_Zivoid Flag_Zivoid Flag_ZigBee_SetTarget(unsigned int target)gBee_SetTarget(unsigned int target)gBee_SetTarget(unsigned int target)gBee_SetTarget(unsigned int target)

設定傳輸目的的節點編號:

� targettargettargettarget:目的節點的編號, 如果傳入 65535, 則會廣播資料。

� int Flag_ZigBee_SendString(char *str)int Flag_ZigBee_SendString(char *str)int Flag_ZigBee_SendString(char *str)int Flag_ZigBee_SendString(char *str)

傳遞字串到 Flag_ZigBee_SetTarget() 所指定的目標節點, 若傳

送失敗, 會傳回 -1:

� strstrstrstr:要傳送的字串。

� char *Flag_ZigBee_GetString(char *buff,BYTE maxLen)char *Flag_ZigBee_GetString(char *buff,BYTE maxLen)char *Flag_ZigBee_GetString(char *buff,BYTE maxLen)char *Flag_ZigBee_GetString(char *buff,BYTE maxLen)

將 ZigBee 模組接收到的資料當成字串傳回, 如果呼叫時沒有

可接收的資料, 就會傳回 NULL, 否則傳回參數 buff:

� buffbuffbuffbuff:指向用來接收字串的暫存區的指標。

� maxLenmaxLenmaxLenmaxLen:暫存區可存放的字串最大長度, buff 實際的大小必

須大於此數值 + 1, 才能額外放入表示字串結尾的 0 字

元。

整個程式與前一個實驗的差異都是與 ZigBee API 相關的部份:

在變數宣告的地方新增了一個無號整數 nodeID, 用來存放 ZigBee 模組的節點編號。

55

Page 57: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

接著在初始化的段落中, 針對 ZigBee 進行初始化, 並設定傳輸

的目的節點編號為 0 (這個節點會連接到講師的電腦, 由講師電腦

收取資料), 然後取得自身節點的編號, 後續傳輸溫濕度時, 就會

連同節點編號一起送出去。

而在主迴圈內, 除了原本傳送的溫濕度以外, 會再額外加上節點

的編號, 並且傳送資料的動作改由前面介紹過的 ZigBee API 來

進行。

而原本接收資料的地方也改由 ZigBee API 來處理, 並依照取得

的字串內容更改風扇模式。

驗收成果驗收成果驗收成果驗收成果::::

1. 開發板供電後程式會先進行 ZigBee 模組的初始化, 此時 LCD

上會顯示 Init ZigBee 字樣:

56

Page 58: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 等待初始完畢 (通電後約 6 秒鐘), LCD 就會顯示如同前一個

實驗的溫濕度及風扇模式畫面:

溫度 濕度

風扇模式

3. 此時就會透過 ZigBee 模組每 8 秒送出一次節點編號加溫濕度

值, 講師端的電腦則會執行一個 Flag WSN Dashboard 的程式負

責接收資料:

57

Page 59: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

溫濕度值

講師端節點編號

講師可下指令控制學員風扇

雲端儲存成功

雲端伺服器IP 位址

這個程式會將講師端電腦所連接的 ZigBee 模組收到的溫濕度

資料依照傳送端的節點編號顯示在該號碼的位置, 以上圖為例,

編號 38 的節點傳來的溫濕度值就會顯示在 38 號位置處, 模

組的節點編號可以看模組上的貼紙

而講師可以透過程式畫面上方的按鈕, 傳送 ON、OFF、AUTO

等指令控制連接到指定節點編號模組的風扇。

4. 這個程式同樣也會將溫濕度值傳送到雲端的伺服器儲存下來, 您可以透過瀏覽器查詢儲存的資料:

58

Page 60: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1

2

3

4

開啟瀏覽器後, 鍵入前一步驟講師電腦畫面上方【IOT Server IP】欄位的 IP, 即可進入雲端查詢頁面:

1.設定查詢區間

2 3

4

5

首先設定好查詢區間, 建議選擇以文字顯示, 較容易觀察細項

59

Page 61: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

資料, 感測器編號是 ZIGBEE 字頭加上模組節點編號, 以 38 號模組為例, 其感測器編號就是 ZIGBEE38。按下查詢後即可

在網頁上看到細部資料, 如此, 就完成從感測器到雲端的無線

傳輸。

60

Page 62: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab00005555 智慧微塵智慧微塵智慧微塵智慧微塵監監監監測測測測----Simple NodeSimple NodeSimple NodeSimple Node 蒐集蒐集蒐集蒐集

資料資料資料資料

實驗目標實驗目標實驗目標實驗目標

本實驗將會針對建置感測網路時為避免多個感測點之間同時傳輸

資料產生的碰撞, 實作輪詢的機制, 讓主控端可以逐一輪流詢問

感測節點, 依序取得感測值, 避免因為資料碰撞而發生資料漏失

或是無法傳輸的狀況。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-N002 ZigBee 模組 � Simple Node 模組 � LCD 模組 � 5V DC 3 線風扇 � 2N2222 NPN 電晶體 � 330Ω 電阻

軟體清單軟體清單軟體清單軟體清單

� 無

61

Page 63: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要透過 ZigBee 模組, 達到兩個 PSoC 之間以輪詢方式輪詢方式輪詢方式輪詢方式

雙向無線傳輸資料的目的。本實驗的架構圖如下:

F1605APSoC

開發板

風扇

ZigBee ZigBee

F1613A溫濕度計

F1605APSoC

開發板

請提供溫濕度$GET

$100,25.6,55

Simple Node

本實驗要實作的是左側的主控端, 右側的 Simple Node 事先已經

製作好, 可以背負電池盒隨處放置, 偵測不同區域的溫濕度。主控

端會定時傳遞 "$GET" 訊息給 Simple Node, Simple Node 收到此

訊息後, 即會將目前的溫濕度值以 "$節點編號,溫度,濕度" 的格

式傳回給主控端。如果放置多個 Simple Node, 主控端即可以輪流

查詢的方式, 一一取得各個偵測點的數值, 此即為所謂『輪詢輪詢輪詢輪詢

(polling)(polling)(polling)(polling)』的方式

本實驗仍然會依據查詢得到的溫濕度值開啟或是關閉風扇, 如果

比照 Simple Node 的模式, 將風扇加上 ZigBee 模組設置在不同

位置, 即可由主控端控制遠端位置的風扇開關。

62

Page 64: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

本實驗保留上一個實驗的硬體接線, 但因為改由向 Simple Node

查詢溫濕度, 因此不會用到溫濕度模組:

P1[4] - RF_R

P1[5] - RF_T

ZigBee 模組的接法如下:

RX (Pin3, 黃線) - RF MODULE TX

TX (Pin4, 藍線) - RF MODULE RX

GND (Pin6, 黑線) - RF MODULE GND

3.3V (Pin7, 紅線) - 3.3V

麵包板麵包板

7-9VDCINP UT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P16

P15

P14

P13

P12

P11

P10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

C

E

B

2N2222電晶體

風扇

紅線黑線

330Ω

LCD 模組

ZigBee 模組(針腳在背面)

黃線

藍線

黑線

紅線

63

Page 65: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 本實驗在模組使用與內部佈線等都與上一個實驗相近, 因此不

再重複練習, 請直接開啟事先製作好的 WSN_06 專案檔:

2.雙按

1

2. 由於已經沒有接上溫濕度模組, 因此用來讀取溫濕度值的

ADC、AMUX、PGA 模組已經都拿掉了, 只剩下與 ZigBee 模

組溝通的 UART 模組、ZigBee API 與控制計時都會用到的

SleepTimer 模組以及顯示資訊用的 LCD 模組:

64

Page 66: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 接著要修改程式碼, 填入要查詢的 Simple Node 節點編號:

實驗現場我們已經擺放了 4 個 Simple Node 模組, 請依據您的 ZigBee 模組節點編號, 設定 Simple Node 節點編號, 如果 ZigBee 模組編號為 1~10, 這裡的編號請設為 100, 如果是 11~20, 請設為 200, 如果是 21~30, 請設為 300, 若是 31~40, 請設為 400。

4. 程式碼修改完畢後, 請按 F6 編譯及建置專案, 如果正確無誤,

會看到顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

5. 接著請將 PSoC MiniProg 燒錄器插到開發版上, 按下

Ctrl+F10 進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

65

Page 67: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式沿襲上一個實驗的程式架構, 使用相同的 ZigBee API, 但額

外加上一個從字串解析溫濕度值的函式:

� int getTempHumiFromStr(char *str,int *temp,int *humi)int getTempHumiFromStr(char *str,int *temp,int *humi)int getTempHumiFromStr(char *str,int *temp,int *humi)int getTempHumiFromStr(char *str,int *temp,int *humi)

由於 Simple Node 會將溫濕度以 "$節點編號,溫度,濕度" 的格

66

Page 68: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

式傳回, 因此我們特別撰寫了一個拆解出節點編號與溫濕度的

函式:

� strstrstrstr:從 Simple Node 收到的字串

� temptemptemptemp:指向用來存放 (溫度值×10) 的整數變數的指標

� humihumihumihumi:指向用來存放濕度值的整數變數的指標

� 傳回值傳回值傳回值傳回值:Simple Node 節點編號

程式首先新增一個用來存放目標 Simple Node 節點編號的變數:

除了原本用來控制回報溫濕度的計時器外, 另外增加了一個用來

判斷等待 Simple Node 回覆溫濕度值的計時器, 避免 Simple Node 不存在或是停止運作時, 程式還一直等待而無法繼續運作

的情況:

reportTimeout 就是用來判斷逾時的計時器。主程式會在初始化 ZigBee 模組後, 將變數 simpleNodeID 的值設定為目標節點, 並

設定 reportTimer 倒數計時 0 秒, 以便讓主迴圈第一次執行時就

會向 Simple Node 詢問溫濕度:

而在主迴圈內, 首先就是判斷是否已經間隔 4 秒, 需要再次向 Simple Node 詢問溫濕度。如果是, 就設定 reportTimer 倒數計時 1 秒作為逾時判斷, 並送出 "$GET" 字串給 Simple Node, 表示

要查詢溫濕度。接著的 while 迴圈只有在逾時或是收到溫濕度資

料時才會跳出:

67

Page 69: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

如果計時器尚未倒數到 0, 就表示沒有逾時, 程式會呼叫 getTempHumiFromStr() 函式從收到的字串解析出 Simple Node 節點編號與溫濕度值, 顯示在 LCD 上, 並依據溫濕度值判斷是

否要開啟或是關閉風扇:

在主迴圈最後, 就設定倒數 4 秒的計時器, 以便在 4 秒之後重

新向 Simple Node 詢問一次溫濕度:

驗收成驗收成驗收成驗收成果果果果::::

1. 開發板供電後程式會先進行 ZigBee 模組的初始化, 此時 LCD

上會顯示 Init ZigBee 字樣:

68

Page 70: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 等待初始完畢 (通電後約 6 秒鐘), 就會開始向 Simple Node

查詢溫濕度, 並顯示在 LCD 上, 並依據溫濕度值控制風扇:

S imple Node 節點編號

Simple Node 傳來的溫度與濕度

69

Page 71: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Lab06Lab06Lab06Lab06 智慧電網智慧電網智慧電網智慧電網----OMUOMUOMUOMU 監控用電監控用電監控用電監控用電

實驗目標實驗目標實驗目標實驗目標

本實驗將會採用 OMU (Oulet Monitor Unit) 模組遠端監控一個市

電插座的用電狀況, 並透過開發板上的按鈕控制插座開關。透過這

樣的機制, 即可監控用電量, 達成節能省電的目標。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-N002 ZigBee 模組 � FLAG-N005 OMU 模組 � LCD 模組

軟體清單軟體清單軟體清單軟體清單

� 無

70

Page 72: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要透過 ZigBee 模組, 向 OMU 模組查詢用電狀況, 架

構圖如下:

OMU(OutletMonitor Unit)

F1605APSoC

開發板

ZigBee ZigBee請提供用電資訊

110V,…….

主控端

市電插座燈泡

K1(On)

K2(Off)

程式會將查詢到的用電狀況顯示在 LCD 上, 並且可以使用 K1

按鈕開啟 OMU 上的插座電源, 使用 K2 按鈕關閉 OMU 上的插

座電源, 達到遠端控制電源開關的目的。

71

Page 73: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

本實驗保留上一個實驗的硬體接線, 但不會用到風扇, 並再加上

連接 K1 與 K2 按鈕的接線:

P1[4] - RF_R

P1[5] - RF_T

ZigBee 模組的接法如下:

RX (Pin3, 黃線) - RF MODULE TX

TX (Pin4, 藍線) - RF MODULE RX

GND (Pin6, 黑線) - RF MODULE GND

3.3V (Pin7, 紅線) - 3.3V

K1、K2 按鈕

K1 - P17

K2 - P16

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BLT

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

LCD 模組

N002ZigBee 模組

(針腳在背面)

黃線

白線

黑線

紅線

※本實驗沒用到 ZigBee 的『綠線』和『白線』!

72

Page 74: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 本實驗在模組使用與內部佈線等都與上一個實驗相近, 因此不

再重複練習, 請直接開啟事先製作好的 WSN_07 專案檔:

2.雙按

1

2. 由於要使用 K1 與 K2 按鈕來控制 OMU 上電源插座的開與

關, 因此必須設定連接 K1 與 K2 的腳位的驅動模式:

展開

1

2

73

Page 75: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 接著要修改程式碼, 填入要查詢的 OMU 節點編號:

請找到程式中這一行呼叫, 將這裡的數值改為講師公布的

OMU 節點編號 (本例為 500)。

4. 程式碼修改完畢後, 請按 F6 編譯及建置專案, 如果正確無誤,

會看到顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

5. 接著請將 PSoC MiniProg 燒錄器插到開發版上, 按下

Ctrl+F10 進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

74

Page 76: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

N

Y

設定目標 OMU節點編號

初始化 ZigBee 模組

像 OMU 模組詢問用電資訊

據上次取資料已過 3 秒?

成功取得資訊?

在 LCD 上顯示用電資訊

開啟 OMU 插座電源

N是否按了K1 按鈕?

Y

N

Y

關閉 OMU 插座電源

是否按了K2 按鈕?

N

Y

顯示錯誤訊息

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式會使用 OMU API 來向 OMU 詢問用電資訊與開關插座電

源, 相關說明如下:

� Flag_OMU_DataFlag_OMU_DataFlag_OMU_DataFlag_OMU_Data

這是自訂結構的資料型別, 用來存放從 OMU 查詢到的資料,

其定義如下:

75

Page 77: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

其中電源插座狀態 1 表示開, 0 表示關。

� int Flag_OMU_Get(Flag_OMU_Data *data)int Flag_OMU_Get(Flag_OMU_Data *data)int Flag_OMU_Get(Flag_OMU_Data *data)int Flag_OMU_Get(Flag_OMU_Data *data)

向 OMU 查詢用電狀況, 若無法取得會傳回 -1, 參數的意義

如下:

� datadatadatadata:指向 Flag_OMU_Data 結構體的指標, 用來存放查詢

到的用電狀況值

� int Flag_OMU_TurnOff(void)int Flag_OMU_TurnOff(void)int Flag_OMU_TurnOff(void)int Flag_OMU_TurnOff(void)

要求 OMU 關閉插座電源, 若失敗會傳回 -1。

� int Flag_OMU_TurnOint Flag_OMU_TurnOint Flag_OMU_TurnOint Flag_OMU_TurnOnnnn(void)(void)(void)(void)

要求 OMU 開啟插座電源, 若失敗會傳回 -1。

另外, 程式中撰寫了一對便利的 LCD 函式, 方便我們可以在

LCD 上顯示資訊:

� void showMsg(int row,char *msg)void showMsg(int row,char *msg)void showMsg(int row,char *msg)void showMsg(int row,char *msg)

在 LCD 上指定的列顯示字串, 個別參數意義如下:

� rowrowrowrow:列編號, 0 表示第 1 列、1 表示第 2 列

� msgmsgmsgmsg:指向存於 RAM 中的字串, 在顯示此字串前會先將

LCD 目前顯示的內容清空, 避免遺留舊資料造成混淆

76

Page 78: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� void showvoid showvoid showvoid showCCCCMsg(int row,Msg(int row,Msg(int row,Msg(int row,const const const const char *msg)char *msg)char *msg)char *msg)

與 showMsg 函式功用相同, 唯一的差別就是參數 msg 必須

是指向存於 ROM 的字串, 也就是必須是以 const 宣告的指

標:

程式大體架構和上一個實驗類似, 這裡要注意的是確認 OMU 的

節點編號, 如此才能正確取得用電資訊:

而在主迴圈內, 首先就是判斷是否已經間隔 3 秒, 需要再次向 OMU 詢問用電狀態。如果是, 就使用 OMU API 查詢用電狀態, 並在 LCD 上顯示查詢結果:

77

Page 79: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

這裡我們分成兩列在 LCD 上顯示資訊, 第一列顯示電壓、電流、

插座電源開關狀態, 而第二列顯示的是視在功率、有功功率、功率

因素, 您也可以自行修改程式來顯示累積用電, 但要注意的是 OMU 為了傳回整數值, 因此都將實際值乘上若干倍數, 顯示時要

記得調整。如果取得用電資訊失敗, 就會顯示錯誤訊息。接著, 重

設倒數計時器, 以便下一次查詢數據。

接著, 程式會檢查是否有按下 K1 或是 K2 按鈕, 這裡的作法和

第一個實驗相同, 若有按下按鈕, 則依據按鈕呼叫 OMU API 來

開啟或是關閉插座電源:

78

Page 80: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

驗收成果驗收成果驗收成果驗收成果::::

1. 開發板供電後程式會先進行 ZigBee 模組的初始化, 此時 LCD

上會顯示 Init ZigBee 字樣:

2. 等待初始完畢 (通電後約 6 秒鐘), 就會開始向 OMU 查詢用

電狀態, 並顯示在 LCD 上:

79

Page 81: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

電壓 電流插座開關狀態

1=On;0=Off

有功功率 視在功率 功率因數

3. 你可以按住 K1 或 K2 鈕, 此時應該會聽到 OMU 上控制開

關的繼電器 (Relay) 動作的『恰』聲, 若是插座上插有夜燈之

類的電器, 就會看到開關的效果, 也可對照 OMU 的 LCD 顯

示內容:

按住 K2 按鈕 按住 K1 按鈕

插座電源關閉 插座電源開啟

80

Page 82: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Lab07Lab07Lab07Lab07 橋樑傾斜偵測橋樑傾斜偵測橋樑傾斜偵測橋樑傾斜偵測示示示示警警警警----GGGG----Sensor + Sensor + Sensor + Sensor +

GPRS/SMSGPRS/SMSGPRS/SMSGPRS/SMS

實驗目標實驗目標實驗目標實驗目標

本實驗會採用 G-Sensor 監控傾斜狀況, 並在過度傾斜或是震動幅

度過大時透過 GPRS/SMS 模組發出簡訊通知, 以便能夠即時處理

異常狀況。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A PSoC 開發板 � FLAG-N004 GPRS 模組 � RS232 to UART 轉板 � FLAG-1609A 三軸加速計 (G-Sensor) � LCD 模組

軟體清單軟體清單軟體清單軟體清單

� 無

81

Page 83: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

設計與原理設計與原理設計與原理設計與原理

本實驗主要透過 G-Sensor 模組取得三軸的加速度值, 並依據 X

與 Y 軸的加速度值判斷是否過度傾斜, 並依據 Z 軸加速度值判

斷是否有劇烈震動, 若有過度傾斜或是震動幅度過大的情況, 就

透過 GPRS/SMS 模組發出簡訊:

F1605AP S oC開發板

GPRS / SMS模組

F1609AG-S ensor

XYZ 三軸重力加速度值

傾斜異常要求發送簡訊

送出簡訊

我們所使用的 G-Sensor 是以輸出的電壓值表示加速度值, 可表示

±3G 範圍的加速度值, 當加速度值為 0G 時, 電壓值為 3.3V / 2,

而每 1G 的加速值在電壓上的變化為 3.3V / 10。三軸的方向如下:

CN1 C5 C4 C3 CN2

ADXL1

Xo

GND

Yo

GND

Zo

GND

3V3

GND

3V3

5V

TST

GND

GND

FLAG-1609A

Y

X

針腳在背面Z 軸朝上方

當模組平放在桌上時, Z 軸朝上, 加速度值為 1G, 若將模組整個

翻過來針腳朝上, 則 Z 軸朝下, 加速度值為 -1G;當模組直立起

來, 與桌面垂直時, 若是 Y 軸指向天, 則 Y 軸加速度值為 1 G,

反之若是 Y 軸指向桌面, 則 Y 軸加速度值為 -1G;同理, 若是

X 軸指向天, 則加速度值為 1G, 若 X 軸指向桌面, 則加速度值

為 -1G。

82

Page 84: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

為了從電壓值換算 G 值, 我們必須比照第二個實驗透過 ADC

的方式將電壓值轉換成數位值, 在此實驗中我們一樣會將電壓值

轉換成 12 個位元的數位值, 程式一開始會先以開發板平躺時取

得的數據當成基準, 分別以此時 Z 軸應為 1G、X 與 Y 軸分別為

0G 的假設, 計算出三軸在 0G 時的 ADC 轉換值。後續只要取得

三軸的 ADC 轉換值, 就可以和三軸在 0G 時的 ADC 值比較,

計算出 ADC 轉換值與 0G 時的差異。

由於 G-Sensor 輸出的電壓範圍在 066~2.64V 間, 所以我們在

【Global Resources】中設定【Ref Mux】為 (Vdd/2)+/-(Vdd/2) , 才能

涵蓋輸入電壓的範圍, 這表示完整可接受的電壓範圍為 0~5V, 因

此 ADC 數位值 4095 就代表 5V, 而 G-Sensor 用來表示 1G 加

速度變化值的 3.3V/10, 如果換算成 ADC 數位值就會是 3.3V /

5V * 4095 / 10, 程式就以此值為除數去除上一段所算出的 ADC

轉換值與 0G 時的差異值, 就可算出加速度值了。

另外, 為了能夠即時發送簡訊, 我們也使用了一個 GPRS/SMS 模

組, 不過由於這個模組採用的是 RS232 介面, 其邏輯準位與之前

實驗所使用的 UART 介面不同, 因此必須以一個轉換邏輯準位的

轉板為中介, 才能正確傳遞資訊, 這是要特別注意的地方。

83

Page 85: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

UART

P1[4] RF_RX

p1[5] RF_TX

UART to RS232 轉板 (轉板上的 RX/TX 腳位已經與轉換晶片的

RX/TX 反接了, 所以與 PSoC 開發板不用再反接)

RX RF MODULE RX

TX RF MODULE TX

GND RF MODULE GND

VCC 5V

G-Sensor

5V +5V

GND GND

Xo P0[7]

Yo P0[5]

Zo P0[3]

VCCGND

TXRX

VC

CG

ND

TX

RX

麵包板麵包板

7-9VDCINP UT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P07

P06

P05

P04

P03

P02

P01

P00

P27

P26

P25

P24

P23

P22

P21

P20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

CN1 C5 C4 C3 CN2

ADXL1

Xo

GND

Yo

GND

Zo

GND

3V3

GND

3V3

5V

TST

GND

GND

FLAG-1609A

LCD 模組

RS232

GPRS / SMS模組

RS232 to UART 轉板

84

Page 86: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 本實驗在模組使用與內部佈線等都與之前的實驗相近, 因此不

再重複練習, 請直接開啟事先製作好的 WSN_08 專案檔:

2.雙按

1

2. 由於要使用 P0[3]、P0[5]、P0[7] 輸入三軸的電壓值, 因此必須

注意要設定這三個腳位的驅動模式:

85

Page 87: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

展開1

2

3

3. 而由於輸入的電壓值範圍在 0.66~2.64V 間, 所以【Global

Resources】中的【Ref Mux】也要設定正確, 才能涵蓋此段電壓

值範圍:

1

其他設定以及模組的使用都與之前的實驗類似, 就不再贅述

了。

4. 接著要修改程式碼, 填入要發送簡訊對象的門號:

86

Page 88: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

5. 程式碼修改完畢後, 請按 F6 編譯及建置專案, 如果正確無誤,

會看到顯示錯誤與警告數量均為 0:

編譯結果無錯誤與警告

6. 接著請將 PSoC MiniProg 燒錄器插到開發版上, 按下

Ctrl+F10 進行燒錄:

有外接變壓器時選此項

沒有接變壓器時選此項

按此鈕開始燒錄

87

Page 89: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

Y

取得開發板平躺時的感測值為基準值

初始化GPRS/SMS 模組

•顯示警示訊息•發出過度傾斜簡訊

X 或 Y 軸 G 值絕對值 > 0.3

N

依據基準值計算三軸的 G值

•顯示警示訊息•發出地震簡訊

Z 軸 G 值 > 2?

N

Y

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 API API API API 說明說明說明說明::::

本程式會使用 GPRS/SMS API 來發送簡訊, 相關函式說明如下:

� void Flag_GPRS_Start(void)void Flag_GPRS_Start(void)void Flag_GPRS_Start(void)void Flag_GPRS_Start(void)

初始化 GPRS/SMS 模組。

� int Flag_SMS_CSendCSMS(const char *tel,const char *msint Flag_SMS_CSendCSMS(const char *tel,const char *msint Flag_SMS_CSendCSMS(const char *tel,const char *msint Flag_SMS_CSendCSMS(const char *tel,const char *msg)g)g)g)

依據存於 ROM 中的電話號碼與簡訊內容發送簡訊, 個別參

數意義如下:

� teltelteltel:指向存於 ROM 中的字串, 字串內容為電話號碼

� msgmsgmsgmsg:指向存於 ROM 中的字串, 字串內容為簡訊, 可包含

中英文。

程式另外還撰寫了透過 ADC 讀取值以及計算三軸加速度值的函

88

Page 90: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

式:

� static int getAdc(BYTE amuxPin)static int getAdc(BYTE amuxPin)static int getAdc(BYTE amuxPin)static int getAdc(BYTE amuxPin)

從指定的腳位讀取 ADC 轉換值, 個別參數意義如下:

� amuxPinamuxPinamuxPinamuxPin:指定多工器要從哪個腳位讀取數值, 可使用

AMUX4 模組預先定義好的常數, 例如 AMUX4_PORT0_7

表示 P0[7], 其它依此類推。

� float Flag_1609A_getGX(void)float Flag_1609A_getGX(void)float Flag_1609A_getGX(void)float Flag_1609A_getGX(void)

取得 X 軸方向的加速度值。

� float Flag_1609A_getGfloat Flag_1609A_getGfloat Flag_1609A_getGfloat Flag_1609A_getGYYYY(void)(void)(void)(void)

取得 Y 軸方向的加速度值。

� float Flag_1609A_getGfloat Flag_1609A_getGfloat Flag_1609A_getGfloat Flag_1609A_getGZZZZ(void)(void)(void)(void)

取得 Z 軸方向的加速度值。

程式一開始宣告了用來儲存三軸加速度值的變數, 以及記錄三軸

0G 值 ADC 轉換值的變數, 另外也宣告了代表三軸輸出腳位的變

數, 最後的 smsSent 變數只是為了實驗方便, 用來控制在送出過

簡訊後就不再送簡訊:

接著程式的初始化動作主要是在計算代表 1G 加速度值的 3.3V/10 對應的 ADC 值, 以及剛開始開發板平躺在桌上時先計

算出各軸 0G 加速度時的 ADC 值, 以便作為後續計算加速度值

的基準:

89

Page 91: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

而在主迴圈內, 首先就是呼叫 float Flag_1609A_getGX 等函式取

得三軸的加速度值, 並將 X 與 Y 軸的值顯示在 LCD 第一列、Z 軸的值顯示在第二列:

如果 Z 軸的加速度值 > 2, 就會判斷為巨幅震動, 除顯示地震訊

息於 LCD 外, 也會發送異常狀況簡訊。相同的, 如果 X 或是 Y 軸的加速度值的絕對值 > 0.3, 就會當成傾斜角度太大, 一樣會顯

示訊息, 並發送簡訊:

90

Page 92: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

這樣就完成了簡易的傾斜偵測與地震偵測了。有關實際計算各軸 G 值的細節, 可自行參考對應的函式。

驗收成果驗收成果驗收成果驗收成果::::

1. 開發板供電後程式會先取得平躺在桌面上的狀態為基準, 此時

LCD 上會顯示 X 與 Y 加速度值為 0G, 而 Z 軸加速度值為

1G:

X 軸加速度值 Y 軸加速度值

Z 軸加速度值

2. 接著只要傾斜開發板, LCD 上就會顯示目前的三軸加速度值,

若是傾斜程度超過 0.3G, 就會顯示警示訊息:

91

Page 93: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

X 軸超過 0.3

顯示警告訊息

或是 Z 軸加速度值超過 2G (只要上下劇烈晃動就可以造成這

種狀況) , 就會判斷為地震, 一樣會顯示警告訊息:

顯示警告訊息

上述兩種情況都會發出簡訊, 即時通知異常狀況:

92

Page 94: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 為避免不小心動到就持續發出簡訊, 程式的設計為一旦發出簡

訊後, 就不再發出簡訊, 若需要再發出簡訊, 可先將開發板 RESET 後重新啟動程式:

麵包板麵包板

7-9VDCINPUT

US

BLC

D

RF

MO

DU

LE

LE

D1

LE

D2

LE

D3

LE

D4

LE

D5

LE

D6

LE

D7

LE

D8

P 17

P 16

P 15

P 14

P 13

P 12

P 11

P 10

P 07

P 06

P 05

P 04

P 03

P 02

P 01

P 00

P 27

P 26

P 25

P 24

P 23

P 22

P 21

P 20

K1

K2

K3

K4

DS

1

DS

2

DS

3

DS

4

DIP

SW

1

RE

SE

T

LR

LGLB

BZ

BL

T

RF

_RX

RF

_TX

VR

VR

1

VR2

PS

oC

晶片

RX

1

TX

1

RX

2

TX

2

+5V

3V3

GND

VC

C

GN

D

XR

ES

SC

LK

SD

A

VCC

RX

TX

GND

J5

按此可 RESET

93

Page 95: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab08080808 RFIDRFIDRFIDRFID 身分辨識與身分辨識與身分辨識與身分辨識與控制控制控制控制

實驗目標實驗目標實驗目標實驗目標

認識及了解 RFID Tag 結構, 並使用 FLAG-1605A 實驗板及

FMD-010 RFID 讀寫控制模組 (以下簡稱 RFID RFID RFID RFID 模組模組模組模組),對新的 RFID

Tag 進行開卡、加值、清除資料等動作。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A 實驗板

� FMD-010 RFID 讀寫控制模組

� RFID Tag

設計與原理設計與原理設計與原理設計與原理

RFID 系統包括兩個主要部分:

□ 電子標籤 (Tag):含收發天線、電源與記憶體 IC, 依功能、用途不

同, 而有不同的設計。本實驗採用的標籤為符合 ISO 14443 Type A 的

規格、使用頻率為 13.56MHz、並擁有 1KB 記憶體。

□ RFID 模組:含天線及 RFID 讀寫控制晶片。所有讀寫動作都由

PSoC 端下達命令, 由 RFID 模組執行後, 再將結果經 UART 傳回

PSoC。

我們已將所有透過 UART 模組存取 RFID 模組的動作, 包裝成易用

的 Flag RFID API 中 (含括檔為 Flag_RFID_ezCard.h), 以簡化一般

RFID 程式的撰寫。本實驗主要用到的函式如下:

ezCard_FindNext() 搜尋 Tag, 並將讀到的卡號(例如 BE618F3E)

存到參數所指的位元陣列中。

ezCard_ReadData () 到指定的 room No.讀取 16 Bytes 字串

ezCard_ReadValue() 到指定的 room No.讀取數值

ezCard_WriteData() 將 16 Bytes 字串寫入指定的 room No.。

ezCard_WriteValue() 將數值寫入指定的 room No.

ezCard_AddValue() 將指定 room No. 內的數值, 加上參數值。

另外還會用到 RFID API 中宣告的兩個結構體:

94

Page 96: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

□ ezCardRoom:抽象化的資料結構。在 1KB 的 Tag 上, 其記憶空間

規劃是分成 16 個 Sector, 每個 Sector 再分為 4 個 16 Bytes 的 Block:

Sector Block 0 Block 1 Block 2 Block 3

0 Manufacturer Data Data Sector Trailer

1 Data Data Data Sector Trailer

2 Data Data Data Sector Trailer

.

.

.

13 Data Data Data Sector Trailer

14 Data Data Data Sector Trailer

15 Data Data Data Sector Trailer

其中 Manufacture Block是唯讀區塊, 存放 Tag 序號、廠商資料等。 Sector Trailer (Control Block) 存放 Block 的存取控制 (Access Control) 資訊。為方便存取, 我們改用『房間』的概念來表示 Data Sector, 並依

序編號為 1~47: 1 2

3 4 5

6 7 8

.

.

.

39 40 41

42 43 44

EzC

ardR

oom

房間

劃方

45 46 47

typedef struct { BYTE roomNo; // 房號 (1~47) char type; // 'D' 表要存 Data, 'V' 表要存 Value } ezCardRoom;

其中 type 類型為’D’ 的房間可存放 16 Bytes 的資料(Data);類型為’V’的房間則只用 4 Bytes 存放 long 型別的數值。

□ ezCardFind:當 ezCard_FindNext() 搜尋 Tag 的函式偵測到 Tag 時,

95

Page 97: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

會將 Tag 狀態存於此結構體中的變數: struct ezCardFindStruct { B YTE readable; // 是否可讀取 BYTE initialed; // 是否已初始化 ( 開卡) BYTE disable; // 是否禁用 }; extern struct ezCardFindStruct ezCardFind;

硬體線路硬體線路硬體線路硬體線路

請將 RFID 模組的 6-Pin 接頭接上天線,9-pin 接頭的連接方式如下:

RFID 模組 1605A

J1(TX) P15

J2(RX) P14

J8(Vcc) +5V

J9(GND) GND

實驗步驟實驗步驟實驗步驟實驗步驟

1. 請在 PSoC Designer 執行『File/Open ProjectFile/Open ProjectFile/Open ProjectFile/Open Project』命令:

96

Page 98: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 在交談窗中瀏覽『Workshop\範例\Lab08\RFID_01』資料夾, 如下開啟

RFID_01 專案:

97

Page 99: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 按下 Ctrl + F10 進行燒錄。

98

Page 100: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式流程流程流程流程圖圖圖圖

讀卡機模組是否存在?

變數初始化

是否偵測到

RFID Tag?

Tag 是否

已開卡?

卡片被拿

開?

將 Tag中儲存的金額

數值加 100並顯示

K1 被按

下?

將 Tag設為未開卡狀態

開卡 (在 Tag中儲存特定卡片名

稱、金額 200、歡迎訊息)

否 是

EzCard API初始化

讀取及顯示剛才

寫入的資料

99

Page 101: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

關鍵模組及關鍵模組及關鍵模組及關鍵模組及API

本實驗使用 UART 與 RFID 模組溝通, 不過由 UART 下命令給模

組的動作, 都已包裝於前面介紹過的 ezCard API 中。關於 ezCard API 完整的 API 功能說明, 請參見產說明文件, 以下僅針對專案中一些重

要的動作再做說明: � 變數初始化:使用 ezCard API 前可先設定所要使用的房間編號及

類型, 此外 ezCard API 支援以『指定房間中是否存有特定字串』

的方式, 來辨識 Tag 是否『已開卡』。本實驗專案使用如下 3 個

房間, : // 計劃在卡片上使用 3 個房間來存資料 ezCardRoom rName = { 1, 'D' }; //1 號房儲存 Data ezCardRoom rMoney = { 2, 'V' }; //2 號房儲存 Value ezCardRoom rMsg = { 3, 'D' }; //3 號房儲存 Data

� API 初始化:程式會呼叫ezCard_Start() 函式檢查 RFID 模組是否

存在。若成功則會用 ezCard_SetFindScan() 函式設定判別 Tag 是否『已開卡』的方式:此處是以 rName (1號房) 中是否存有以 "ezCard-" 開頭的字串, 來判斷是否『已開卡』: const char *pPreName = "ezCard-"; // 識別字串 ... while(!ezCard_Start()) // 啟動 ezCard API { Flag_LCD_Show(0, 0, "RFID module"); Flag_LCD_Show(1, 0, "initialize fail!"); } // 設定檢查是否已開卡的常數字串 "ezCard-" ezCard_SetFindScan(rName, pPreName, 0);

ezCard_SetFindScan() 第 3 個參數是設定要不要檢查 Tag 是否被

禁用 (例如離職員工的識別卡), 此處設為 0 表示不檢查;若設為 1 則是要檢查, 至於被禁用的條件請參見 ezCard API 說明文件。

Flag_LCD_Show() 是在 LCD 顯示訊息的函式, 3 個參數分別為

要顯示的行 (row)、列 (column)、訊息字串。

100

Page 102: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 偵測 Tag 及檢查是否已開卡:程式利用 ezCard_FindNext() 函式

搜尋 Tag, 此函式在搜尋時會根據先前 ezCard_SetFindScan()函式

的設定, 將讀到的 Tag 狀態存於 ezCardFind 結構體變數中: ret = ezCard_FindNext(cardno); // 讀下一張卡:可以是新卡 // 或是拿開又放回的舊卡 if(ret == 0) { // 沒讀到卡 Flag_LCD_Show(0, 0, "Please"); Flag_LCD_Show(1, 0, "Show a Card..."); } else { // 有讀到卡 beep(); ... if(!ezCardFind.readable) { // 若無法存取則… } if(!ezCardFind.initialed) {// 若未開卡, 則… }

� 將資料寫入 Tag:範例程式讀到未開卡的 Tag 時, 即會進行開卡

動作, 也就是在 rName (1號房) 中寫入 "ezCard-" 加 Tag 序號的

字串, 另外也會在其它事先規劃的房間中寫入資料;若讀到已開卡

的 Tag 則會修改既有資料。寫入、修改資料是用下列三個函式: � ezCard_WriteData():寫入 16 位元組資料 � ezCard_WriteValue():寫入數值資料 � ezCard_AddValue():將數值資料做加減 三個函式的第 1 個參數都是房間, 第 2 個參數則是要寫入或加

減的位元組或數值: if(!ezCardFind.initialed) { // 若未開卡, 則進行開卡 ... ezCard_WriteData(rName, buf); ezCard_WriteValue(rMoney, 200); // 在 rMoney 中存入 // 初始金額:200 元 cstrcpy(buf, pMessage); ezCard_WriteData(rMsg, buf); // 存入訊息字串 ... } else { // 如果已開卡, 則每次將 money 加 100 ezCard_AddValue(rMoney, 100); ...

}

101

Page 103: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 讀取 Tag 資料:讀取資料時則是用 ezCard_ReadData () (讀取 16 位元組的資料)、ezCard_ReadValue() (讀取數值), 呼叫函式時的

第 1 個參數仍是房間, 第 2 個參數則是指向存放資料記憶體空

間的指位器: ezCard_ReadData(rName, buf); // 讀取卡名 ... ezCard_ReadValue(rMoney, &money); // 讀取金額 ...

上列程式片段中的 getKeyWait() 是程式中的自訂函式, 其用途只

是等待使用者按下 K1 鈕, 按鈕後程式才會繼續。

� 檢查 Tag 是否移開:在範例程式的流程中, 有一項是讓使用者按

K1 鈕將 Tag 還原為『未開卡』, 或直接取走卡片不做任何處理, 此

處是用 ezCard_FindAny() 函式卡片是否被取走: while(ezCard_FindAny(cardno)==3) { ... // 若按 K1 則將 Tag 設為未開卡 }

ezCard_FindAny() 函式傳回值的意義如下: � 0 - 沒發現任何卡片 � 1 - 發現新卡 (和前次找到的卡號不同) � 2 - 仍是前一次搜尋到的卡, 但曾拿開過 � 3 - 仍是前一次搜尋到的卡, 但未拿開過

至於將 Tag 還原為『未開卡』的動作, 只是將 rName (1號房) 內

容清空, 所以下次讀到此 Tag 時就會將之視為『未開卡』。

102

Page 104: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

驗驗驗驗證證證證結結結結果果果果

1. 將實驗板接上變壓器電源, LCD 會顯示初始訊息 "Please Show a

Card…", 等待讀取 Tag:

如出現 "RFID module initialize fail" 訊息, 表示 PSoC 偵測不到

RFID 模組, 請檢查連接 RFID 模組的線路是否正確:『RFID 模

組 J1(Tx) 接 P1[5]』、『J2(Rx) 接 P1[4]』。

2. 將 Tag 靠近 RFID 模組, 當系統偵測到 Tag 時, 蜂鳴器會發出一

聲嗶聲, LCD 會顯示開卡成功的訊息, 表示已將預設的卡片名稱 (開

卡識別字串"ezCard" + "CardNo 最後兩碼")、數值 200、歡迎訊息寫入

程式規劃使用的 1~3 號房。

103

Page 105: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

開卡完成後隨即會由 Tag 讀取剛才寫入的資料, 並先顯示卡片名稱

及數值 200:

3. 接著按 K1 鈕則再顯示歡迎訊息:

5. 接著請再按 K1 鍵, 讓系統重新顯示 "Please Show a Card..." 等待訊

息, 並將 Tag 移開。

104

Page 106: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

6. 將移開的 Tag 再靠近 RFID 模組, 系統偵測到 Tag 後, 會立即將

金額加 100, 並讀取/顯示新的金額:

7. 接按 K1 鈕則會顯示如下訊息, 此時可選擇按 K1 將 Tag 設為未

開卡狀態, 或直接取走卡片:

8. 系統重新顯示 "Please Show a Card..." 訊息後, 可再重複前述操作:

� 若 Tag 已被清空:將 Tag 再靠近 RFID 模組, 會被視為未開

卡, 由第 2 步開始。

� 若 Tag 未清空:將 Tag 再靠近 RFID 模組, 會被視為已開卡,

即進入第 6 步繼續將金額加 100。

Please Show a Card

直接取走 Tag

按 K1

稍等數秒

105

Page 107: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

Lab0Lab0Lab0Lab09999 GPS GPS GPS GPS 全球定位系統全球定位系統全球定位系統全球定位系統

實驗目標實驗目標實驗目標實驗目標

學習如何使用旗標公司所開發的 GPS API, 藉由 UART 將 GPS 所接

收到的資料經由 PSoC 解析後, 顯示在 LCD。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A � GPS 模組

設計與原理設計與原理設計與原理設計與原理

GPS(Global Positioning System, 全球定位系統)可為地球表面絕大部

分地區提供座標、速率和時間。它是由 24 顆距離地面約 2 萬公里

之衛星群所組成(3 顆為備用衛星), 每顆衛星繞行地球一圈約 12 小

時, 共有 6 個軌道面, 每個軌道面與赤道間隔約 55 度角。理論上

地球上任一點應該可以接收到 4 顆衛星的信號, 接收到 3 顆衛星的

信號就可進行 2D 的定位, 若接收到 4 顆以上的衛星信號則可進行

3D 的定位。但是在實際的應用上, 衛星訊號會被地形、天候或其

他因素而影響, 因此在室內時未必能順利定位。

目前一般 GPS 使用的資料格式為 NMEA 0183, 每一筆資料以 $

字元為開頭, 以斷行字元 CR+LF 為結尾, 其格式如下:

$語句編號, 欄位 1, 欄位 2, ……,CR, LF

NMEA 0183 提供多種不同的語句, 用來提供不同類型的訊息內容,

因此每種與具有不同數量的欄位。其中經常用來定位的語句為

GPGGA, 其格式範例與重要資料的說明如下:

106

Page 108: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,0.3,0001*47

� $GPGGA$GPGGA$GPGGA$GPGGA:指定此資料為 GPGGA 格式。

� 123519123519123519123519:UTC 時間 12:35:19 (UTC + 8 小時 = 台灣時間)

� 4807480748074807.038.038.038.038:緯度 48 度 07.038'

� NNNN:北緯, 若是南緯則為 S

� 01131.00001131.00001131.00001131.000:經度 11 度 31.000'

� EEEE:東經, 若是西經則為 W

� 1111:GPS 訊號, 0 表示無法定位, 1 表示 GPS 定位, 2 表示 DGPS

(差分定位), 6 則為正在計算

� 08080808:表示目前收到的 GPS 衛星數

� 0000.9.9.9.9:水平精確度, 範圍從 0.5 到 99.9

� 545545545545:接收器的海拔高度

� MMMM:海拔高度的單位, M 代表公尺

另一個用來作為定位的 GPRMC 語句, 其格式範例與重要資料的說

明如下:

$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

� $GP$GP$GP$GPRMCRMCRMCRMC:指定此資料為 GPRMC 格式。

� 222222225446544654465446:UTC 時間 22:54:46 (UTC + 8 小時 = 台灣時間)

� AAAA:此欄位為定位狀態, A 表示有效定位,V 則為無效定位'

� 4916.454916.454916.454916.45:緯度 49 度 16.45'

� NNNN:北緯, 若是南緯則為 S

� 12311.1212311.1212311.1212311.12:經度 123 度 11.12'

� WWWW:西經, 若是東經則為 E

� 000.5000.5000.5000.5:速度, 單位為節

� 054.7054.7054.7054.7:角度,以正北為 0 度,

� 191194191194191194191194:日期 1994 年 11 月 19 日 (ddmmyy)

� 020.3020.3020.3020.3:磁偏角

� EEEE:磁偏角的方位, 東方為 E, 西方為 W

107

Page 109: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

RFRFRFRF----RRRR----P14P14P14P14

K1K1K1K1----P00P00P00P00

J5(RF_MJ5(RF_MJ5(RF_MJ5(RF_MODULEODULEODULEODULE) ) ) ) ---- GPS GPS GPS GPS 四孔接頭四孔接頭四孔接頭四孔接頭

LCDLCDLCDLCD----LCD LCD LCD LCD 接頭接頭接頭接頭

108

Page 110: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 請開啟『Workshop\範例\Lab09\GPS_01\GPS_01.app』專案檔:

2. 按下 Ctrl + F10 進行燒錄。

109

Page 111: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式碼開發碼開發碼開發碼開發流程流程流程流程

啟動 FLAG-GPS 模

組與計數器

啟動 LCD 並顯示初

始訊息

等待 GPS 訊號輸入

按住 K1 鈕? 顯示衛星所在的緯

度、經度、高度、衛

星信號數目

顯示世界標準時

間、日期、衛星角度

與速度

Yes

No

110

Page 112: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 APIAPIAPIAPI 說明說明說明說明

旗標提供了多種 Flag GPS API 可以方便透過 GPS 模組接收資料,

本實驗主要使用了 Flag_GPS_Start() 與 Flag_GPS_Read(), 以下分

別說明這兩個 API:

� Flag_GPS_Start()Flag_GPS_Start()Flag_GPS_Start()Flag_GPS_Start():初始化 GPS API (含初始化 Flag_GPS_UART

模組, 並啟動 PSoC 的 Interrupt)

� Flag_GPS_Read()Flag_GPS_Read()Flag_GPS_Read()Flag_GPS_Read():等待並讀取一筆 GPS 資訊, 加以解析後將

結果存到 GPS 結構變數的各成員中。此函式如果回傳 0 表示

沒讀到有用的資訊, 回傳值 1 表示讀到 GPGGA 資訊, 回傳值 2

表示讀到 GPRMC 資訊。

下列是 GPGGA 所得到的資料:

� char GPS. Latitude[10]:緯度, 例如 4807.038 代表 48 deg

07.038'

� char GPS. NS[2]: "N" 或 "S" 代表北緯或南緯

� char GPS. Longitude[10]:經度, 例如 "01131.000" 代表 11 deg

31.000'

� char GPS. EW[2]: "E" 或 "W" 代表東經或西經

� char GPS. Satellites[4]:衛星信號數目

� char GPS. Altitude[6]:高度 (公尺)

下列是 GPRMC 所得到的資料:

� char GPS. UTCTime[7]:UTC 時刻, 例如 "123519" 代表

12:35:19 UTC

� char GPS. UTCDate[7]:UTC 日期, 例如 "100310" 代表

2010/03/10

� char GPS. Speed[10]:速率 (Km/s)

� char GPS. Angle[7]:角度 (Degree)

111

Page 113: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

驗收成果驗收成果驗收成果驗收成果::::

� 接妥電源後, 當接收到 GPS 訊號時, 則會顯示 UTC 時刻、角

度、日期、速率(Km/s)。

� 當按住實驗板上的 K1 按鈕時, 則會在 LCD 上顯示緯度、海平

面高度(公尺)、經度、衛星信號數目。

112

Page 114: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab_1_1_1_10000 PPPPSSSSoCoCoCoC to PC to PC to PC to PC 網際網路網際網路網際網路網際網路傳輸傳輸傳輸傳輸

實驗目標實驗目標實驗目標實驗目標

將溫濕度模組偵測到的類比信號,經過 PSoC 內建的 ADC 轉換

為數位信號,透過 TCP/IP 模組傳送到網路上的 PC,PC 用

WinTcpTest 程式接收。

實驗器材實驗器材實驗器材實驗器材

� FLAG-1605A � FLAG-N001 TCPIP 模組 � FLAG-1613A 溫濕度模組

軟體清單軟體清單軟體清單軟體清單

� AccessPort � WinTcpTest

設計與原理設計與原理設計與原理設計與原理

本實驗的架構圖如下:

113

Page 115: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

FLAG-1605A 內部接線如下:

P1[4] ←→ RF_R

P1[5] ←→ RF_T

LCD 插座 ←→ LCD

FLAG-1605A 與溫濕度模組之間接線如下:

P0[5] FLAG-1613A Tem

P0[7] FLAG-1613A Hum

FLAG-1605A 與 TCPIP 模組之間接線如下 (與上一個實驗相同):

FLAG-1605A J5 RX FLAG-N001 TX

114

Page 116: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

FLAG-1605A J5 TX FLAG-N001 RX

FLAG-1605A J5 GND FLAG-N001 GND

實驗步驟實驗步驟實驗步驟實驗步驟

1. 執行【File\New Project】命令, 建立『TCP_01』專案:

2. 請先如下設定系統資源:

115

Page 117: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. P0[5]、P0[7] 要連接溫濕度模組, 溫濕度模組輸出的是類比訊號,

所以如下設定 P0[5]、P0[7] 腳位屬性::

4. 在 【User Module】 窗格中雙按【LCD】 模組:

116

Page 118: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

5. 接著在【LCD】模組的【Properties】 窗格中設定模組屬性:

6. 本實驗使用 ADC 相關模組取得溫溼度資料, ADC 的部份使用

到 AMUX、PGA、ADCINC 等三個模組, 所以接著將新增這 3

個模組。

117

Page 119: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

請在 【User Module】 窗格中雙按加入 【AMUX4】 模組, 然

後在【Workspace】 窗格中按一下【AMUX4】 模組, 以便在

【Properties】 窗格中設定該模組的屬性:

【Analog Column Mux】設定要使用哪一個通道, 共有 0~3 等四個可

選, 在在在在 PSoCPSoCPSoCPSoC 中多工器的輸入訊號只能是中多工器的輸入訊號只能是中多工器的輸入訊號只能是中多工器的輸入訊號只能是 Port 0Port 0Port 0Port 0, 如果要從 P0[1]、

118

Page 120: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

P0[3]、P0[5]、 P0[7] 輸入, 則通道必須選擇 0 或 2;同理,如果要

從偶數腳位輸入, 通道必須選擇 1 或 3。本實驗選擇使用通道本實驗選擇使用通道本實驗選擇使用通道本實驗選擇使用通道 0000。

7. 在 【User Module】 窗格中雙按加入 【PGA】 模組, 確認其放

置於 ACB00 區塊:

8. 接著在 【Properties】 窗格中設定 PGA 模組屬性 (若 【Properties】

窗格未出現 PGA 屬性, 請先在上圖中 PGA 的模塊上按一下):

119

Page 121: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

上圖中【Gain】設定放大率為 1, 將 PGA 做為 emitter follower, 放

在 ADC 前面可以保持訊號的完整性。

因為我們前面將 AMUX 模組的通道設定為 0, 所以此處 PGA 的

【Input】亦隨之設定為 AnalogColumn_InputMUX_0。

9. 在 【User Module】 窗格中雙按加入 【ADCINC】 模組, 確認

其放置於 ASC10 區塊:

120

Page 122: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

上圖可見 PGA 放置於 ACB00 區塊, 所以稍後我們會設定 ADC

的輸入端於 ACB00 區塊。

121

Page 123: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

10. 接著在 【Properties】 窗格中設定 ADCINC 模組屬性 (若

【Properties】 窗格未出現 ADCINC 屬性, 請先在上圖中

ADCINC 的模塊上按一下):

【DataFormat】:設定轉換後的數字是否有正負號。以本例而言,

【Resolution】為 12 bits(參考後文),若選擇 Unsigned 表示數字

的範圍為 0~4095;若選擇 Signed 表示數字的範圍為-2048~2047。

【Resolution】:設定 ADC 的取樣解析度, 亦即用多少個 bit 來表示

轉換後的數字。【Data Clock】表示 ADC 的時脈來源。【PosInput】

則設定 ADC 的輸入信號來源, 因為上一頁的圖中可以看到 PGA

位於 ACB00 區塊, 所以此處設定輸入端為 ACB00, 表示使用 PGA

的輸出作為 ADC 的輸入。

11. 本實驗使用 SleepTimer 模組進行計時, 每 3 秒會送出一次溫濕

度資料。請在 【User Module】 窗格中雙按加入 【SleepTimer】

模組, 然後在【Workspace】 窗格中按一下【SleepTimer】 模組,

以便在【Properties】 窗格中設定該模組的屬性:

122

Page 124: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

12. 在 【User Module】 窗格中雙按加入 【UART】 模組, 這個

123

Page 125: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

UART 模組將連接 TCP/IP 模組:

UART 模組不是放在 DCB02、DCB03, 請以滑鼠將之拉曳到請以滑鼠將之拉曳到請以滑鼠將之拉曳到請以滑鼠將之拉曳到

DCBDCBDCBDCB00002222 (TX)(TX)(TX)(TX)、、、、DCBDCBDCBDCB00003333 (RX) (RX) (RX) (RX):

13. 接著在 【Properties】 窗格中設定 UART 模組屬性(若

【Properties】 窗格未出現 UART 屬性, 請先在上圖中 UART

的模組上按一下):

124

Page 126: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

14. 接著要將 Flag_TCP_UART 的 Rx 輸入腳位接到 P1[4]。前一

步已設定 Flag_TCP_UART 的 RX Input 連接 PSoC 內部的

Row_0_Input_0, 所以我們由此開始設定連線:

125

Page 127: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

126

Page 128: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

15. 再來要將 Flag_TCP_UART 的 Tx 輸出腳位接到 P1[5]。同樣的,

因前面已設妥 Flag_TCP_UART 的 Tx Output 連接 Row_0_Output_1,

所以由此開始設定連線:

127

Page 129: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

128

Page 130: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

完成模組配置與佈線之後, 接著要完成程式功能, 請如下操作:

1. 本實驗使用到 Flag API 中的 TCP 與 LCD API, 請在【Workspace

Explorer】中的【TCP_01】專案資料夾上按右鈕執行【Add File…】

命令, 將所需的 include 檔 (Flag_TCP.h、Flag_LCD.h) 加入專

案中:

129

Page 131: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 在專案中執行【Project/Settings】命令, 切到【Build/Linker】頁次,

在【Object/library modules】欄輸入 Flag API 函式庫的路徑

130

Page 132: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

3. 雙按 【Wordspace Explorer】 窗格中的 【TCP_01/Source

Files/main.c】 項目, 開啟程式編輯器。

4. 請將預設的程式內容全部刪除:

131

Page 133: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

5. 請開啟『Workshop\原始程式碼\ Lab_06.txt』檔:

6. 最後回到 PSoC Designer 中, 將程式原始碼貼到 main.c 檔案中:

132

Page 134: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

7. 輸入程式原始碼後, 請按 F6 鍵建立專案, 成功後會看到如下訊

息:

8. 建立成功後, 按 Ctrl+F10 鍵開啟燒錄程式進行燒錄:

133

Page 135: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式流程流程流程流程圖圖圖圖

關鍵模組與關鍵模組與關鍵模組與關鍵模組與 APIAPIAPIAPI 說明說明說明說明

旗標提供了多種 Flag TCP API 可以方便透過 TCPIP 模組傳送或接

收資料, 本實驗主要使用其中 Flag_TCP_Start()、

Flag_TCP_SetMode() 與 Flag_P2P_Send() API, 以下分別說明這三

個 API:

� void void void void Flag_Flag_Flag_Flag_TTTTCPCPCPCP_Start(_Start(_Start(_Start(voidvoidvoidvoid)))):此函式中會初始化 Flag_TCP_UART

模組, 因此毋須執行 Flag_TCP_UART_Start();同時也會啟動

PSoC 的 Interrupt。

� void void void void Flag_Flag_Flag_Flag_TCPTCPTCPTCP_ SetMode_ SetMode_ SetMode_ SetMode (BYTE modeBYTE modeBYTE modeBYTE mode)))):設定工作模式, 目前

mode 參數必須設為 0,因此固定為 Flag_TCP_SetMode(0)。

讀取溫濕度資料

將溫濕度顯示於 LCD

將溫濕度資料透過

TCPIP 模組送出

計時三秒鐘

啟動模組、設定程式初

始值

134

Page 136: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� void void void void Flag_P2P_SendFlag_P2P_SendFlag_P2P_SendFlag_P2P_Send (BYTE *buf, BYTE len)(BYTE *buf, BYTE len)(BYTE *buf, BYTE len)(BYTE *buf, BYTE len):在單點對單點模式

下, 使用 Flag_TCP_UART 送出資料。參數說明如下:

� bufbufbufbuf:BTYE 型別的陣列, 內含要送出的資料。

� lenlenlenlen:要送出資料的長度。

除了 Flag TCP API 以外, 本程式也使用溫濕度模組的 API 來讀

取溫濕度, 其說明如下:

� int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)int Flag_1613_getTemperature(BYTE amuxPin, char *str)

此 API 用來讀取溫度值, 回傳值為攝氏溫度 *10 的整數, 所以

要再除 10 才是實際溫度,假設回傳值是 234,代表攝氏 23.4

度。參數的意義如下:

� amuxPinamuxPinamuxPinamuxPin:AMUX4 所要切換到的腳位。

� strstrstrstr:函式會將溫度存入的字串變數 (精確至小數 1 位), 若

str==0 表示不存入。

� int int int int Flag_1613_getHumidityFlag_1613_getHumidityFlag_1613_getHumidityFlag_1613_getHumidity(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)(BYTE amuxPin, char *str)

此 API 用來讀取溼度值, 回傳值為 0~100 的整數, 假設傳回

80, 表示相對濕度為 80%。其參數用法與上一個函式相同。

驗收成果驗收成果驗收成果驗收成果 � 與上一個實驗相同, 請使用 Y 型線將實驗板與 TCP/IP 模組插

上電源。

� 與上一個實驗相同, 請在電腦開啟 WinTcpTest 程式, 並且連線

到 TCP/IP 模組。

� 等待幾秒後就會看到實驗板上的 LCD 顯示溫濕度資料:

135

Page 137: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 電腦上的 WinTcpTest 畫面也會顯示溫度、濕度資料:

136

Page 138: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab_1_1_1_11111 免重新啟動免重新啟動免重新啟動免重新啟動,,,,即時變更連線對象即時變更連線對象即時變更連線對象即時變更連線對象

實驗目標實驗目標實驗目標實驗目標

在上一個 Lab 中, TCP/IP 模組只能和預先設定好的對象建立連線,

本實驗則要讓該模組毋須重新啟動,就能可即時更換連線對象。

實驗器材實驗器材實驗器材實驗器材 ((((與上一個實驗相同與上一個實驗相同與上一個實驗相同與上一個實驗相同))))::::

� FLAG-1605A � FLAG-N001 TCP/IP 模組 � FLAG-1613A 溫濕度模組

軟體清單軟體清單軟體清單軟體清單::::AccessPortAccessPortAccessPortAccessPort 與與與與 WinTcpTestWinTcpTestWinTcpTestWinTcpTest

設計與原理設計與原理設計與原理設計與原理

本實驗的架構和上一個實驗類似,但多了 USB 線的部份,這部分

只是為了利用 PC 的鍵盤和螢幕來輸入與顯示:

網路傳輸的路線網路傳輸的路線網路傳輸的路線網路傳輸的路線

137

Page 139: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

本實驗用到兩個 PSoC UART 模組,一個負責對 TCP/IP 模組連線,

命名為「Flag_TCP_UART」;另一個負責對 USB to UART 橋接晶

片連線,命名為「UART_USB」。PSoC 對 USB 橋接晶片的接線如

下:

P1[2] ←→ RX1(RX of UART_USB)

P1[3] ←→ TX1(TX of UART_USB)

其它部分的接線均和上一個實驗相同。

138

Page 140: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

實驗步驟實驗步驟實驗步驟實驗步驟

1. 請直接開啟 TCP_02 專案:

比上一個實驗多了一比上一個實驗多了一比上一個實驗多了一比上一個實驗多了一個個個個 UARTUARTUARTUART 模組模組模組模組,,,,命命命命名名名名

為為為為 UART_USBUART_USBUART_USBUART_USB

1111

2222

3333

4444 將接收將接收將接收將接收 USBUSBUSBUSB 資料的資料的資料的資料的 BufferBufferBufferBuffer 加大加大加大加大

139

Page 141: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 直接按 Ctrl+F10 鍵開啟燒錄程式進行燒錄:

3. 最後, 我們要來設定 TCP 模組的網路組態。

TCP/IP 模組可支援 3 種連線模式 (Connection Mode):P2PP2PP2PP2P、、、、TCPTCPTCPTCP 和和和和

HTTPHTTPHTTPHTTP,,,,如下表所示:

Mode TCP 模組的 Connection Mode 組態設定

適用時機

P2P P2P 和和和和預先設定的預先設定的預先設定的預先設定的對象對象對象對象連線連線連線連線。

TCP TCP, 且未勾 Parse HTTP 選項

毋須重新啟動毋須重新啟動毋須重新啟動毋須重新啟動,,,,即時與任意即時與任意即時與任意即時與任意對象對象對象對象連線連線連線連線。

HTTP TCP, 且勾選 Parse HTTP 選項

毋毋毋毋須重新啟動須重新啟動須重新啟動須重新啟動,,,,即時與任意即時與任意即時與任意即時與任意對象對象對象對象連線連線連線連線。

連線對象必須支援 HTTP 協定, 通常為

瀏覽器瀏覽器瀏覽器瀏覽器或網站伺服器網站伺服器網站伺服器網站伺服器。

*請注意:API 若使用 P2P 或 TCP Mode, 則其 Listening Port 必須大於 1024。

本實驗就是使用 TCPTCPTCPTCP Mode,讓 PSoC 可以和網路上的任意對象互

傳資料。(至於 HTTP Mode 的應用, 會在下一個實驗介紹。)

為了配合各學校的網路環境,因此模組預設的 IP 位址會不同,請

根據講師的說明為準。當我們要透過瀏覽器來察看或修改模組的

140

Page 142: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

IP 組態時,必須連線到『http://IP 位址:6789/index.htm』:

2222 輸入帳號輸入帳號輸入帳號輸入帳號::::flagflagflagflag

3333 輸入密碼輸入密碼輸入密碼輸入密碼::::1234123412341234

4 4 4 4 按此鈕按此鈕按此鈕按此鈕

1111 輸入模組的輸入模組的輸入模組的輸入模組的 ipipipip 及及及及 :6789/index.htm :6789/index.htm :6789/index.htm :6789/index.htm

141

Page 143: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

[註] 按 Save 鈕只會儲存設定, 而不會讓變更生效 (必須重新啟動

模組後才會生效)。所以請按 Save & Restart 鈕。

1111 選擇選擇選擇選擇 TCPTCPTCPTCP 模式模式模式模式

3333 取消勾選取消勾選取消勾選取消勾選

6666 儲存並重新啟動儲存並重新啟動儲存並重新啟動儲存並重新啟動

2222 設為設為設為設為 5000500050005000

4444 設定超過設定超過設定超過設定超過 10101010 秒沒傳秒沒傳秒沒傳秒沒傳

資料就自動斷線資料就自動斷線資料就自動斷線資料就自動斷線

5555 不勾選不勾選不勾選不勾選, , , , 表示只要目標表示只要目標表示只要目標表示只要目標 portportportport 不同不同不同不同, , , ,

即視為不同的連線對象即視為不同的連線對象即視為不同的連線對象即視為不同的連線對象

142

Page 144: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式流程流程流程流程圖圖圖圖

當我們從 AccessPort 送出以 ip= 開頭的字串時, 例如: ip=192.168.0.9:5000,程式會判斷這是要變更連線對象,並將溫濕

度資料透過網路模組傳至指定的對象。

若送出的字串不是以 ip= 開頭, 則程式會視為資料,將該資料直接

送至連線對象。

USB 傳入

資料?

執行命令(ip=),

或將資料透過

TCP 模組傳出

TCP 模組

傳入資料?

是 將資料透過 USB

送到 PC 顯示

啟動模組、設定程式初始值

143

Page 145: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

驗收成果驗收成果驗收成果驗收成果

� 與上一個實驗相同, 請使用 Y 型線將實驗板與 TCP/IP 模組插

上電源。

� 請在電腦開啟 2 個 WinTcpTest 程式, 並且連線到 TCP/IP 模組。

1111 輸入輸入輸入輸入 TCPTCPTCPTCP 模組的模組的模組的模組的 ipipipip 及及及及 portportportport

2222 輸入輸入輸入輸入 WinTcpTestWinTcpTestWinTcpTestWinTcpTest 程式本身程式本身程式本身程式本身

等待連入的等待連入的等待連入的等待連入的 portportportport 為為為為 5001500150015001 3333 按開始鈕按開始鈕按開始鈕按開始鈕

4444 在第二個在第二個在第二個在第二個 WinTcpTestWinTcpTestWinTcpTestWinTcpTest 程式中程式中程式中程式中, , , ,

除這裡改輸入除這裡改輸入除這裡改輸入除這裡改輸入 5002500250025002 外外外外, , , ,

其他操作和前一個程式相同其他操作和前一個程式相同其他操作和前一個程式相同其他操作和前一個程式相同

144

Page 146: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 請啟動 AccessPort 程式。由於 AccessPort 會記得之前使用的

COM 埠了, 所以只要按串口開關串口開關串口開關串口開關鈕即可開啟 COM 埠:

這裡會顯示前一次這裡會顯示前一次這裡會顯示前一次這裡會顯示前一次 (Lab 5) (Lab 5) (Lab 5) (Lab 5) 開啟過的開啟過的開啟過的開啟過的 COMCOMCOMCOM 埠埠埠埠

1111 直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的 COMCOMCOMCOM 埠埠埠埠

2222 先輸入好等下要傳送的字串先輸入好等下要傳送的字串先輸入好等下要傳送的字串先輸入好等下要傳送的字串, , , ,

最後要記得按最後要記得按最後要記得按最後要記得按 [Enter] [Enter] [Enter] [Enter] 鍵換行鍵換行鍵換行鍵換行

145

Page 147: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 在前面已開啟的 2 個 WinTcpTest 程式, 依其本地端的 port 號,

接下來我們會將之簡稱為 5001500150015001 程式程式程式程式、及 5002500250025002 程式程式程式程式。請在 5001

程式中送出資料:

1111 輸入輸入輸入輸入

2222 按此鈕按此鈕按此鈕按此鈕

3333 會連上會連上會連上會連上 TCPTCPTCPTCP 模組並送出字串模組並送出字串模組並送出字串模組並送出字串

1111 顯示收到的來源位址址與資料顯示收到的來源位址址與資料顯示收到的來源位址址與資料顯示收到的來源位址址與資料

2222 顯示已將目標網顯示已將目標網顯示已將目標網顯示已將目標網

址改為來源網址址改為來源網址址改為來源網址址改為來源網址

與資料與資料與資料與資料

3333 在在在在 10101010 秒內秒內秒內秒內((((未自動斷線前未自動斷線前未自動斷線前未自動斷線前) ) ) )

按此鈕送出按此鈕送出按此鈕送出按此鈕送出 HelloHelloHelloHello

4444 送到送到送到送到 5001500150015001 程式了程式了程式了程式了

146

Page 148: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 等 10 秒自動斷線後, 改從 5002 程式送資料給 TCP 模組:

10101010 秒內沒傳輸資料秒內沒傳輸資料秒內沒傳輸資料秒內沒傳輸資料, , , ,

TCPTCPTCPTCP 模組就會自動斷模組就會自動斷模組就會自動斷模組就會自動斷

線線線線

2222 輸入輸入輸入輸入 5002500250025002

3333 按此鈕按此鈕按此鈕按此鈕

4444 會連上會連上會連上會連上 TCPTCPTCPTCP 模組並送出字串模組並送出字串模組並送出字串模組並送出字串

1111 切換到切換到切換到切換到 5005005005002222 程式程式程式程式

147

Page 149: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

1111 收到收到收到收到 5002500250025002 程式送來的資料了程式送來的資料了程式送來的資料了程式送來的資料了

2222 顯示已將目標網顯示已將目標網顯示已將目標網顯示已將目標網

址改為來源網址址改為來源網址址改為來源網址址改為來源網址

與資料與資料與資料與資料

3333 在在在在 10101010 秒內秒內秒內秒內((((未自動斷線前未自動斷線前未自動斷線前未自動斷線前) ) ) )

按此鈕送出按此鈕送出按此鈕送出按此鈕送出 HelloHelloHelloHello

4444 送到送到送到送到 5002500250025002 程式了程式了程式了程式了

148

Page 150: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 接下來我們主動由 AccessPort 程式連出去:

1111 輸入輸入輸入輸入 ip=[5001ip=[5001ip=[5001ip=[5001 程式的程式的程式的程式的 ipipipip 及及及及 port],port],port],port],

再按再按再按再按 [Enter] [Enter] [Enter] [Enter] 鍵換行鍵換行鍵換行鍵換行

2222 按此鈕按此鈕按此鈕按此鈕

在在在在 5001500150015001 程式中收到溫濕度資料了程式中收到溫濕度資料了程式中收到溫濕度資料了程式中收到溫濕度資料了

149

Page 151: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

相關相關相關相關 APIAPIAPIAPI 說明說明說明說明

旗標提供了多種 Flag TCP API 可以方便透過 TCPIP 模組傳送或接

收資料, 本實驗除了用到上一實驗已介紹過的 Flag_TCP_Start() 和

Flag_TCP_SetMode() 之外, 還有轉換 IP 位址和 port 編號的 API,以

及收送資料的 API。以下分別說明:

� void Flag_TCP_ SetMode (BYTE mode):設定工作模式, 在本實驗

必須將 mode 設為 1,代表 TCP Mode。

1111 輸入輸入輸入輸入 ip=[500ip=[500ip=[500ip=[5002222 程式的程式的程式的程式的 ipipipip 及及及及 port],port],port],port],

再按再按再按再按 [Enter] [Enter] [Enter] [Enter] 鍵換行鍵換行鍵換行鍵換行

2222 按此鈕按此鈕按此鈕按此鈕

在在在在 5005005005002222 程式中收到溫濕度資料了程式中收到溫濕度資料了程式中收到溫濕度資料了程式中收到溫濕度資料了

150

Page 152: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� char *Flag_TCP_IpPortToStr(BYTE *ip, BYTE *port, char *buf):

將 4 bytes 的 ip 和 2 bytes 的 port 轉換為字串。參數說明如下:

� ip ip ip ip :存放著 IP 位址 (4 bytes)。

� portportportport:存放著 port 編號 (2 bytes)。

� bufbufbufbuf: 字元型別的陣列, 用來存放轉換後的字串。 � 傳回值:buf (即存放轉換後字串的位址)。

� BYTE Flag_TCP_StrToIpPort(char *buf, BYTE *ip_port):

將字串轉為 IP 位址和 port 編號,共計 6 bytes。參數說明如下:

� bufbufbufbuf:存放要轉換的位址和編號, 內容可以為以下格式:

IP 位址:port 編號(例如 192.168.0.1:5000)

域名:port(例如 www.flag.com.tw:80)

[註] 若省略 :port, 則預設 port 為 80。 � ip_ip_ip_ip_ portportportport:用來存放轉換後的數值 ip (4 bytes) 及

port (2 bytes)。

� 傳回值:1-OK, 0-Error。

� void Flag_TCP_Send(BYTE *ip_port, BYTE *buf, BYTE len):

在 TCP 模式下, 送出資料到網路。參數如下:

� ip_ip_ip_ip_ portportportport:指定 IP 位址和 port 編號,共計 6 bytes。

� bufbufbufbuf:要送出的資料。 � lenlenlenlen:要送出資料的長度 (最大 255)。

若 len 為 0, 則將 buf 當成字串 (0x0 結尾) 送出。

� BYTE Flag_TCP_ReadStr(BYTE *ip_port, char *buf,

BYTE bufSize):

在 TCP 模式下, 讀取網路傳來的字串資料 (會在最後加上 0x0 表示字串結束)。參數如下:

� ip_ip_ip_ip_ portportportport:指定 IP 位址和 port 編號,共計 6 bytes。

151

Page 153: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� bufbufbufbuf:存放讀到的資料。 � bufSize:指明 buf 的大小(最大 255)。

最多只會存入此大小的資料量。 若 len 為 0, 則將 buf 當成字串 (0x0 結尾) 送出。

� 傳回值:讀到資料的長度, 若為 0 表示無資料。

除了 Flag TCP API 以外, 本程式也使用到溫濕度模組的 API 來

讀取溫濕度, 這在上一個實驗已介紹過了, 不再贅述。

152

Page 154: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

LabLabLabLab_1_1_1_12222 HTTP HTTP HTTP HTTP 訊息處理訊息處理訊息處理訊息處理

實驗目標實驗目標實驗目標實驗目標

在物聯網物聯網物聯網物聯網 (IOT)應用中, 大多都是用 HTTPHTTPHTTPHTTP 協定來溝通, 例如將感

測器資料上傳到網站網站網站網站中儲存, 或是利用 PC 或手機上的瀏覽器瀏覽器瀏覽器瀏覽器, 監

控遠端節點上的各項裝置, 例如讀取溫度或打開電燈等。本實驗的

目標, 就是要讓 FLAG-1605A 實驗板搭配 TCP/IP 模組, 可以直

接處理 HTTP 訊息。

實驗器材實驗器材實驗器材實驗器材 ((((與上一個實驗相同與上一個實驗相同與上一個實驗相同與上一個實驗相同))))

� FLAG-1605A � FLAG-N001 TCPIP模組 � FLAG-1613A 溫濕度模組

軟體清單軟體清單軟體清單軟體清單

� AccessPort

設計與原理設計與原理設計與原理設計與原理

本實驗的架構, 與上一個實驗相同, 但把 WinTcpTest 軟體換成瀏

覽器或網站伺服器:

瀏覽器瀏覽器瀏覽器瀏覽器或網站網站網站網站

153

Page 155: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

硬體線路硬體線路硬體線路硬體線路

硬體線路也和上一個實驗相同, 但多了一個接線動作:將 P1[6] 和

LED8 連通, 這樣程式就可控制 LED8 的亮滅。

PSoC 和 USB 橋接晶片的接線如下:

P12 - RX

P13 - TX

P16 - LED8

實驗步驟實驗步驟實驗步驟實驗步驟

1. 請直接開啟 TCP_03 專案:

比上一實驗多了一個設定比上一實驗多了一個設定比上一實驗多了一個設定比上一實驗多了一個設定::::

就是要將就是要將就是要將就是要將 P1[6]P1[6]P1[6]P1[6]的的的的 DriveDriveDriveDrive 設為設為設為設為

Strong, Strong, Strong, Strong, 以便控制以便控制以便控制以便控制 LEDLEDLEDLED 的亮暗的亮暗的亮暗的亮暗

154

Page 156: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2. 直接按 Ctrl+F10 鍵開啟燒錄程式進行燒錄:

3. 最後, 我們要來設定 TCP 模組的網路組態。本實驗是使用 HTTP

Mode, 讓 PSoC 可以扮演瀏覽器及網站伺服器的雙重角色。

為了配合各學校的網路環境,因此模組預設的 IP 位址會不同,請

根據講師的說明。當我們要透過瀏覽器來察看或修改模組的 IP 組態時,必須連線到『http://IP位址:6789/index.htm』:

2222 輸入輸入輸入輸入帳號帳號帳號帳號::::flagflagflagflag

3333 輸入密碼輸入密碼輸入密碼輸入密碼::::1234123412341234

4 4 4 4 按此鈕按此鈕按此鈕按此鈕

1111 輸入模組的輸入模組的輸入模組的輸入模組的 ipipipip 及及及及 :6789/index.htm :6789/index.htm :6789/index.htm :6789/index.htm

155

Page 157: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

2222 選擇選擇選擇選擇 TCPTCPTCPTCP 模式模式模式模式

4444 勾選此項勾選此項勾選此項勾選此項

5555 儲存並重新啟動儲存並重新啟動儲存並重新啟動儲存並重新啟動

3333 設為設為設為設為 80 (80 (80 (80 (一般網一般網一般網一般網

站都是用站都是用站都是用站都是用 80)80)80)80)

1111 請確認請確認請確認請確認 GatewayGatewayGatewayGateway 及及及及

DNSDNSDNSDNS 是正確的是正確的是正確的是正確的

156

Page 158: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

程式程式程式程式流程流程流程流程圖圖圖圖

當我們從 PC (經 USB) 傳入以 http開頭的 URL 字串時, 例如傳入:

http://www.flag.com.tw/qprice?b=123 主機名稱 路徑 參數

則程式會依照 URL 中的主機名稱, 先到 DNS 查出其 IP 位址, 然

後據此將 URL 字串送至目標網站。

主機名稱可以是 IP 位址 (例如 192.68.0.119) 或域名域名域名域名 (例如

www.flag.com.tw)。

PC (USB)

傳入資料?

解析以 http 開頭

的 URL, 然後送

至目標網站

TCP 模組

傳入資料?

‧若是網站網站網站網站回應的資料回應的資料回應的資料回應的資料,

則將之送到 PC顯示

‧若是瀏覽器瀏覽器瀏覽器瀏覽器送來的要求送來的要求送來的要求送來的要求,

則處理並回應網頁內容

啟動模組、設定程式初始值

157

Page 159: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

驗收成果驗收成果驗收成果驗收成果

1. 請供電給 1605A 實驗板與 TCP/IP模組。

2. 請啟動 AccessPort程式:

3. 接下來我們從 Access 發送區送出 URL,透過 TCP/IP模組向旗

標網站查詢書號 F8772的定價:

這裡會顯這裡會顯這裡會顯這裡會顯示上一次開啟過的示上一次開啟過的示上一次開啟過的示上一次開啟過的 COMCOMCOMCOM 埠埠埠埠

1111 直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的直接按此鈕開啟前次用過的 COMCOMCOMCOM 埠埠埠埠

158

Page 160: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

我們也使用瀏覽程式執行同樣工作, 以供對比:

再來請開啟瀏覽器, 然後連到 1605A所扮演的迷你網站:

1.1.1.1.輸入向旗標網站查詢書籍價錢的輸入向旗標網站查詢書籍價錢的輸入向旗標網站查詢書籍價錢的輸入向旗標網站查詢書籍價錢的

URL, URL, URL, URL, 最後按最後按最後按最後按 [Enter] [Enter] [Enter] [Enter] 鍵換行鍵換行鍵換行鍵換行

2.2.2.2.按此鈕送按此鈕送按此鈕送按此鈕送

出資料出資料出資料出資料

3. 1605A3. 1605A3. 1605A3. 1605A 已送出要求已送出要求已送出要求已送出要求

4.1605A4.1605A4.1605A4.1605A 收到旗標回應的書價了收到旗標回應的書價了收到旗標回應的書價了收到旗標回應的書價了

1.1.1.1.輸入同樣的輸入同樣的輸入同樣的輸入同樣的 URLURLURLURL

2.2.2.2.傳回結果傳回結果傳回結果傳回結果

1.1.1.1.用用用用 httphttphttphttp 連到連到連到連到 TCPTCPTCPTCP 模組的網址模組的網址模組的網址模組的網址

159

Page 161: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� 點按網頁中的查詢溫度查詢溫度查詢溫度查詢溫度、查詢濕度查詢濕度查詢濕度查詢濕度、開關開關開關開關 LEDLEDLEDLED 連結時, 會分別

向 1605A 迷你網站送出路徑為 getgetgetget, 參數為 f=tf=tf=tf=t、f=hf=hf=hf=h、f=ef=ef=ef=e 的查

詢, 並將傳回的網頁顯示在下方白色頁框中:

2.1605A2.1605A2.1605A2.1605A 傳回網頁了傳回網頁了傳回網頁了傳回網頁了

IEIEIEIE 所在電腦的所在電腦的所在電腦的所在電腦的 ipipipip

1.1.1.1.按此連結按此連結按此連結按此連結

3.3.3.3. 傳回的結果會傳回的結果會傳回的結果會傳回的結果會

顯示在白框中顯示在白框中顯示在白框中顯示在白框中

2.2.2.2. 會向迷你網站送出此會向迷你網站送出此會向迷你網站送出此會向迷你網站送出此 URLURLURLURL

160

Page 162: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

[補充] 若另外再開啟一個瀏覽器, 然後輸入查詢溫度的 URL:

http://192.168.0.19/get?f=t

則也可看到同樣的結果:

相關相關相關相關 APIAPIAPIAPI 說明說明說明說明

本實驗除上一實驗已用到的 API 之外, 還用到以下的 API:

1. 1. 1. 1. 送出送出送出送出 HTTPHTTPHTTPHTTP 資料資料資料資料::::

� void Flag_HTTP_SendRequest

(BYTE *ip_port, char *buf, BYTE len, char *dn, BYTE dnLen):

將 buf 中長度為 len 的資料, 送到指定的網站。

‧若 len=0, 則表示 buf 的內容為字串。

‧若 dnlen=0, 則表示 dn 的內容為字串。

‧若 dn=NULL(0), 則表示沒有域名。

4.4.4.4. 按此連結可控制按此連結可控制按此連結可控制按此連結可控制

1605A1605A1605A1605A 上的上的上的上的 LEDLEDLEDLED

5.5.5.5. 此處會顯示燈號此處會顯示燈號此處會顯示燈號此處會顯示燈號

亮滅狀態亮滅狀態亮滅狀態亮滅狀態

161

Page 163: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

� void Flag_HTTP_SendResponse

(BYTE *ip_port, char *buf, BYTE len) :

將 buf 中長度為 len 的資料, 送到網址為 ip_port 的對象。

‧若 len=0, 則表示 buf 的內容為字串。

� void Flag_HTTP_SendResponse4

(BYTE *ip_port, const char *buf1, char *buf2,

const char *buf3, char *buf4):

功能和 Flag_HTTP_SendResponse() 相同, 但改用 4 個字串

(buf1~buf4) 來組出傳送內容, 以方便我們組合多個字串。

‧注意, buf1 和 buf3 為常數字串。

� void Flag_HTTP_Send404NotFoundForNextResponse(void):

設定下一個 Flag_HTTP_SendResponse() 要以 404 Not Found 的表頭傳出 (表示『找不到網頁』), 且傳出後此設定即失效。

2. 2. 2. 2. 接收接收接收接收 HTTPHTTPHTTPHTTP 資料資料資料資料::::

� BYTE Flag_HTTP_ReadStr

(BYTE *ip_port, char *buf, BYTE bufSize, BYTE *httpType): 讀取網路傳來的 HTTP 資料。 ‧對方網址會放入 ip_port中。 ‧資料會放入 buf 中;但若太長,則超過 bufSize的部份會丟棄。 ‧資料的種類, 會放入*httpType中 ('H' 或 'G' 或 'T') 'H':網站送來的 Response, 'G':瀏覽器送來的GET Request。 'T':不是前二者, 則為一般的 TCP資料。 ‧傳回值:收到資料的長度。

3. 3. 3. 3. 解析以解析以解析以解析以 http:// http:// http:// http:// 開頭的開頭的開頭的開頭的 URL, URL, URL, URL, 以取得其中的網址及域名以取得其中的網址及域名以取得其中的網址及域名以取得其中的網址及域名::::

� BYTE Flag_HTTP_ParseUrlToIpPortDn

(char *buf, BYTE *ip_port, char *dnBuf): 由 buf 中的 URL, 解析出其中的網址存入 ip_port, 並將其中的

域名存入 dnBuf (如果無域名則存入空字串)。 ‧傳回值:1-OK, 0-失敗(格式錯誤) ‧URL 範例:

http://192.160.0.86:5000/get.asp?id=flag http://www.flag.com.tw/

162

Page 164: Lab01 Chip Level初體驗-控制按鈕與馬達 01 11

http://www.flag.com.tw/get?id=ken&val=100 http://www.abc.com:8080/get.htm

4. 4. 4. 4. 解析解析解析解析瀏覽器送來的瀏覽器送來的瀏覽器送來的瀏覽器送來的 URL::::

� BYTE Flag_HTTP_ParseUrl(char *buf, BYTE len, char *resBuf): 解析由瀏覽器送來的 URL, 拆解成主機名稱、路徑、參數等字

串, 以方便做後續的處理。 ‧len 是 buf 中 URL 的長度, 若為 0 則會自動計算長度。 ‧解析後的結果會全部存入 resBuf中;但若 resBuf=NULL(0), 則會直接存入 buf 中 (因此會複蓋到原來的內容)。 ‧傳回值:URL 中參數的數量。

[補充] URL 結構:http:// 192.168.0.146/get?f=t&s=3

主機名稱 路徑 參數 1 參數 2

(參數名稱=參數值) � char *Flag_HTTP_GetUrlHost(void):

傳回 URL 中的主機名稱字串。若無主機名稱則傳回 NULL(0)。

� char *Flag_HTTP_GetUrlPath(void):

傳回 URL 中的路徑。若無路徑則傳回 NULL(0)。

� char *Flag_HTTP_GetUrlParmNameAt(BYTE index):

傳回 URL 中第 index個參數的參數名稱。若無則傳回 NULL(0)。 ‧index由 0 開始算起。

� char *Flag_HTTP_GetUrlParmValAt(BYTE index) :

傳回 URL 中指第 index個參數的參數值。若無則傳回 NULL(0)。 ‧index由 0 開始算起。

� char *Flag_HTTP_GetUrlParm(const char *parmName):

傳回URL中指定參數名稱的參數值。若無則傳回NULL(0)。

163