204
空空空空空空空空空空空空空 空空空空空空 DIY 空空 空空空 空空空空空空空空 空空105 空 6 空 15 空

空污偵測器製作暨實務研習會空氣盒子產品 DIY

  • Upload
    -

  • View
    3.050

  • Download
    3

Embed Size (px)

Citation preview

Page 1: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

空污偵測器製作暨實務研習會空氣盒子產品 DIY

講師:曹永忠台北市立大安高工日期: 105 年 6 月 15 日

Page 2: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

205/01/2023

前言 空氣盒子產品 軟體開發環境介紹

開發工具介紹與安裝 Arduino 程式介紹

Arduino 程式架構 Arduino 語法

程式開發 空氣盒子程式開發 Q&A

關於作者 參考資料

大 綱

Page 3: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

305/01/2023

中國紀錄片《穹頂之下》裡鋪天蓋地、讓人無處可逃的霧霾,不只存於中國;台灣,也在同一片穹頂之下 近年來,我國空氣品質嚴重惡化,民眾是否瞭解呼吸與健康息息相關?政府部門有無準備面對迷霧背後的產業轉型、污染整治等挑戰? 空污來自何方? 台灣海峽短短不到 300 公里,攔不住每年東北季風帶來的中國霧霾。每當台灣空氣品質下降,新聞或政府消息總是避重就輕的表示,是中國霧霾南下所致,然而,境外污染(含中國霧霾)僅占我國的空氣污染

30% , 50% 來自工業排放,剩下 20% 則來自交通排放廢氣和其他空污來源。其實,空污更大的問題在於境內污染,政府無法推諉卻又不敢面對境內污染

前 言

Page 4: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

405/01/2023

空氣盒子產品介紹

Page 5: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

瑞昱 空氣盒子 華碩雲端今日偕同臺北市政府、中研院及瑞昱半導體舉辦「空氣盒子 PM2.5啟動記者會」,推出全台第一個智慧城市的空污監測計畫 「空氣盒子」僅手掌大小,可感測溫度、濕度與空氣中的細懸浮微粒( PM2.5 )濃度等環境數據,並自動上傳到華碩雲端平台 手機 APP 或空氣盒子網站即可查詢

505/01/2023

Page 6: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

PM2.5 檢測儀

605/01/2023

Page 7: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

705/01/2023

軟體開發環境介紹

Page 8: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

805/01/2023

Ameba

Page 9: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

905/01/2023

Page 10: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1005/01/2023

開發工具• Arduino 的官網: https://www.arduino.cc/• 下載網站 https://

www.arduino.cc/en/Main/Software• 壓縮軟體 WinRAR請到: https://briian.com/5480/

winrar.html

Page 11: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1105/01/2023

軟體下載• https://www.arduino.cc/en/Main/Software

Page 12: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1205/01/2023

找 1.6.7 版本https://www.arduino.cc/en/Main/OldSoftwareReleases#previous

Page 13: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1305/01/2023

解開壓縮檔

Page 14: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1405/01/2023

解到 D:\arduino-1.6.7

Page 15: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1505/01/2023

開啟 Arduino

Page 16: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1605/01/2023

安裝 Ameba 開發版

Page 17: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1705/01/2023

安裝 Ameba 開發版

https://github.com/Ameba8195/Arduino/raw/master/release/package_realtek.com_ameba_index.json

Page 18: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1805/01/2023

安裝 Ameba 開發版填入:https://github.com/Ameba8195/Arduino/raw/master/release/package_realtek.com_ameba_index.json

Page 19: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

1905/01/2023

安裝 Ameba 開發版 - 開啟 Board Manager

Page 20: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2005/01/2023

安裝 Ameba 開發版 - 開啟 Board Manager

Page 21: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2105/01/2023

安裝 Ameba 開發版 - 拉到最下面

Page 22: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2205/01/2023

安裝 Ameba 開發版 Version 1.0.8

Page 23: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2305/01/2023

安裝 Ameba 開發版

Page 24: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2405/01/2023

安裝 Ameba 開發版 - 安裝完成

Page 25: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2505/01/2023

安裝 Ameba 函式庫

Page 26: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2605/01/2023

安裝 Ameba 函式庫

COPY (複製、貼上 )

Page 27: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2705/01/2023

安裝 Ameba 函式庫 - 切換函式庫目錄

Page 28: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2805/01/2023

安裝 Ameba 函式庫 - 切換函式庫目錄

Page 29: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

2905/01/2023

安裝 Ameba 函式庫 - 切換函式庫目錄

Page 30: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3005/01/2023

安裝 Ameba 函式庫 - 切換函式庫目錄

C:\Users\user\Documents\Ameba

Page 31: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3105/01/2023

安裝 Ameba 函式庫 - 選擇開發版

Page 32: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3205/01/2023

安裝 Ameba 函式庫 - 選擇 Amaba 開發版

Page 33: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3305/01/2023

安裝 Ameba 函式庫 - 檢核開發版正確否

Page 34: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3405/01/2023

安裝 Ameba 函式庫 - 切換通訊埠

Page 35: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3505/01/2023

安裝 Ameba 函式庫 - 檢核通訊埠正確否

Page 36: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3605/01/2023

完成 Ameba 開發環境

請關閉程式後重開程式

Page 37: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3705/01/2023

Arduino 程式介紹

Page 38: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

3805/01/2023

Arduino 程式架構

Page 39: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 程式的介面

功能表

Page 40: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

同等於 C 語言的 Rebuild All

將程式燒入到Arduino

開新檔案

開啟舊檔

儲存檔案

回傳值

Page 41: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

撰寫程式內容

要注意是否連線,若未連線可以 Rebuild但不可燒入

Page 42: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

未連線 已連線

Page 43: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 程式架構( 一 .) 宣告 :Arduino宣告方式與 C 相同 ,例如 :int , float…( 二 .) 初始化 Setup():使 Arduino板子裝置妥當的指令EX:int ledPin=7; / 宣告 Arduino7號腳為輸入腳 /Setup(){

pinMode(ledPin,INPUT);}

Page 44: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

( 三 .) 執行 Loop():為程式的主要內容 ,這程式內容會一直重複被執行EX:Loop(){……

}

Page 45: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

( 四 .) 函式 :1. pinMode(7,INPUT)

//將腳位 7設定為輸入模式2. digitalWrite(8,HIGH) ( 數位腳專用 )

//將腳位 8設定輸出高電位3. val=digitalRead(7) ( 數位腳專用 )

//讀出腳位 7 的值並指定給 val變數

Page 46: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

4.analogWrite(9,128) ( 數位訊號專用所設計的函式 ) //將擁有 PWM 的數位腳位 9 設定輸出電位 2.5V 對應值大 約為 128

5. val=analogRead(0) ( 類比腳專用 )//讀出腳位 0 的值並指定給 val變數 (且 analogRead可讀 取範圍 0(0V)~1023(5V))

Page 47: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

4705/01/2023

Arduino 語法

Page 48: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 4805/01/2023

C 語言的架構

main() //主函式名稱,括號內可包含引數。 { //函式開始。 printf(“I love C language”); //一個敘述,並以分號結束敘述。 } //函式結束。

C語言結構

C 語言是一種常用的高階語言,由函式( function )所組成,所謂函式是指執行某一特定功能的程式集合。 當我們在設計 C 語言程式時,首先會依所需的功能先寫一個函式,然後再由主程式或函式去呼叫執行另一個函式。 在函式名稱後面會接一組小括號“ ( ) ” ,通知編譯器此為一個函式,而不是變數,而在小括號內也可包含引數,引數是用來將主程式中的變數數值或變數位址傳至函式中來運算。

Page 49: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 4905/01/2023

Arduino 語言的架構 Arduino 程式與 C 語言程式很相似,但語法更簡單而且易學易用,完全將微控制器中複雜的暫存器設定寫成函式,使用者只需輸入參數即可。 Arduino 程式主要由結構( structure )、數值 (values) 及函式( functions )等三個部份組成。

Arduino 程式的結構( structure )包含 setup( ) 及 loop( )兩個函式。 數值 (values)包含常數及變數 (變數又分為外部變數及內部變數 ) 。函式( functions )分成 (1) 公用函式 (2) 自訂函式

setup( )函式由其名稱“ setup”暗示執行“設定”的動作,用來初始化變數、設定接腳模式為輸入( INPUT )或輸出( OUTPUT )等。在每次通電或重置 Arduino 電路板時, setup( )函數只會被執行一次。

loop()函式由其名稱 "loop"暗示執行 "迴圈 " 的動作,用來設計程式控制Arduino電路板執行所需的功能,並且重覆執行。

void setup() //初始化變數、設定接腳模式等。 {} void loop() //迴圈。 {}

Page 50: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5005/01/2023

Arduino 的變數與常數 在 Arduino 程式中常使用變數( variables )與常數( constants )來取代記憶體的實際位址,好處是程式設計者不需要知道那些位址是可以使用的,而且程式將會更容易閱讀與維護。 一個變數或常數的宣告是為了保留記憶體空間給某個資料來儲存,至於是安排那一個位址,則是由編譯器統一來分配。

變數名稱 Arduino 語言的變數命名規則與 C 語言相似,必須是由英文字母、數字或底線符號“ _” 之後,再緊接著字母或數字,並且第一個字元不可以是數字。因此我們在命名變數名稱時,應該以容易閱讀為原則,例如 col 、 row代表行與列,就比 i 、 j 更容易了解。

Page 51: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5105/01/2023

Arduino 的變數與常數資料型態 資料型態

資料型態 位元數 範圍

boolean 8 true(定義為非 0),false(定義為 0)

char 8 128~+127

unsigned char 8 0~255

byte 8 0~255

int 註 1 16 32,768~+32,767

unsigned int 註 2 16 0~65,535

word 16 0~65,535

long 32 2,147,483,648~+2,147,483,647

unsigned long 32 0~4,294,967,295

short 16 32,768~+32,767

float 32 3.4028235E+38~+3.4028235E+38

double 註 3 32 3.4028235E+38~+3.4028235E+38

註 1:在 Arduino Due板為 32位元,其餘為 16位元。 註 2:在 Arduino Due板為 32位元,其餘為 16位元。 註 3:在 Arduino Due板為 64位元,其餘為 32位元。

Page 52: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5205/01/2023

Arduino 的變數與常數變數宣告 int ledPin=10; //宣告整數變數 ledPin ,初始值為 10 。 char myChar=’A’; //宣告字元變數 myChar ,初始值為’ A’ 。 float sensorVal=12.34 //宣告浮點數變數 sensorVal ,初始值為

12.34 。 int year=2013,moon=7,day=11; //宣告整數變數 year 、 moon 、 day 及其初值。

Page 53: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5305/01/2023

Arduino 的變數與常數變數的生命週期

全域變數 全域變數被宣告在任何函式之外。 當執行 Arduino 程式時,全域變數即被產生並且配置記憶體空間給這些全域變數,直到程式結束執行時,才會釋放這些佔用的記憶體空間。 全域變數並不會禁止與其無關的函式作存取的動作,因此在使用上要特別小心,避免變數數值可能被不經意地更改。因此除非有特別需求,否則還是儘量使用區域變數。 區域變數 區域變數又稱為自動變數,被宣告在函式的大括號“ { }” 內。 當函式被呼叫使用時,這些區域變數就會自動的產生,系統會配置記憶體空間給這些區域變數,當函式結束時,這些區域變數又自動的消失並且釋放所佔用的記憶體空間。

int total; // 全域變數 total 在所有函數內皆有效。void setup(){

//...}void loop(){

int i; //區域變數 i 只有在 loop()函數內才有效。 for(int j=0;j<100;j++) //區域變數 j 只有在 for迴圈內才有效。

{ //... }

}

Page 54: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5405/01/2023

Arduino 的變數與常數變數型態的轉換 在 Arduino 程式中可以使用 char(x) 、 byte(x) 、 int(x) 、 word(x) 、 long(x) 、

float(x) 等資料型態轉換函式來改變變數的資料型態,引數 x 可以是任何型態的資料。

Page 55: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5505/01/2023

運算子 電腦除了能夠儲存資料之外,還必須具備運算的能力,而在運算時所使用的符號,即稱為運算子( operator )。 常用的運算子可分為算術運算子、關係運算子、邏輯運算子、位元運算子與指定運算子等三種。 當敘述中包含不同運算子時, Arduino 微控制器會先執行算術運算子,其次是關係運算子,最後才是邏輯運算子。 我們也可以使用小括號 ( ) 來改變運算的順序。

Page 56: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5605/01/2023

算術運算子算術運算子

算術運算子 動作 範例 說明

+ 加法 a+b a內含值與 b內含值相加。

- 減法 a-b a內含值與 b內含值相減。

* 乘法 a*b a內含值與 b內含值相乘。

/ 除法 a/b 取 a內含值除以 b內含值的商數。

% 餘數 a%b 取 a內含值除以 b內含值的餘數。

++ 遞增 a++ a的內含值加 1,即 a=a+1。

遞減 a a的內含值減 1,即 a=a-1。

Page 57: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5705/01/2023

算術運算子 程式範例 void setup() { } void loop() { int a=20,b=3; //宣告整數變數a、b並指定變數初值。 int c,d,e,f; //宣告整數變數c、d、e、f。 c=a+b; //加法運算。 d=a-b; //減法運算。 e=a/b; //除法運算。 f=a%b; //餘數運算。 a++; //遞增。 b--; //遞減。 }

運算結果

c=23,d=17,e=6,f=2,a=21,b=2

Page 58: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5805/01/2023

關係運算子

關係運算子

比較運算子 動作 範例 說明

== 等於 a==b a等於 b? 若為真,結果為 true,否則為 false。

!= 不等於 a!=b a不等於 b? 若為真,結果為 true,否則為 false。

< 小於 a<b a小於 b? 若為真,結果為 true,否則為 false。

> 大於 a>b a大於 b? 若為真,結果為 true,否則為 false。

<= 小於等於 a<=b 若 a小於或等於 b,結果為 true,否則為 false。

>= 大於等於 a>=b 若 a大於或等於 b,結果為 true,否則為 false。

Page 59: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 5905/01/2023

關係運算子 程式範例 void setup() { } void loop() { int x=200; //宣告整數變數x,初始值為200。 if(x>100) //x大於100? digitalWrite(LEDpin,HIGH); //若x大於100則點亮LED。 else //x小於或等於100。 digitalWrite(LEDpin,LOW); //x小於或等於200,則關閉LED。 }

運算結果

點亮 LED。

Page 60: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6005/01/2023

邏輯運算子邏輯運算子

邏輯運算子 動作 範例 說明

&& AND a&&b a與 b兩變數執行邏輯 AND運算。

|| OR a||b a與 b兩變數執行邏輯 OR運算。

! NOT !a a變數執行邏輯 NOT運算。

Page 61: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6105/01/2023

邏輯運算子 程式範例 void setup() { } void loop() { boolean a=true,b=false,c,d,e; //宣告布林變數a、b、c、d、e。 c=a&&b; //a、b兩變數作邏輯AND運算。 d=a||b; //a、b兩變數作邏輯OR運算。 e=!a; //a變數作邏輯NOT運算。 }

Page 62: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6205/01/2023

位元運算子位元運算子

位元運算子 動作 範例 說明

& AND a&b a與 b兩變數的每一相同位元執行 AND邏輯運算。

| OR a|b a與 b兩變數的每一相同位元執行 OR邏輯運算。

XOR a^b a與 b兩變數的每一相同位元執行 XOR邏輯運算。

~ 補數 ~a 將 a變數中的每一位元反相(0、1互換)。

<< 左移 a<<4 將 a變數內含值左移 4個位元。

>> 右移 a>>4 將 a變數內含值右移 4個位元。

Page 63: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6305/01/2023

位元運算子 程式範例 void setup() { } void loop() { char a=0b00100101; //宣告字元變數a=0b00100101(二進值)。 char b=0b11110000; //宣告字元變數b=0b11110000(二進值)。 char c=0x80; //宣告有號數字元變數c=0x80(十六進值)。 unsigned char d,e,f,l,m,n; //宣告無號數字元變數d、e、f、l、m、n。 d=a&b; //a、b兩變數執行位元AND邏輯運算。 e=a|b; //a、b兩變數執行位元OR邏輯運算。 f=a^b; //a、b兩變數執行位元XOR邏輯運算。 l=~a; //a變數執行位元反NOT邏輯運算。 m=b<<1; //b變數內容左移1位元。 n=c>>1; //c變數內容右移1位元。 }

運算結果

d=0x20,e=0xf5,f=0xd5,l=0xda,m=0xe0,n=0x40

Page 64: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6405/01/2023

複合運算子複合運算子

複合運算子 動作 範例 說明

+= 加 a+=b 與 a=a+b運算相同。

-= 減 a-=b 與 a=a-b運算相同。

*= 乘 a*=b 與 a=a*b運算相同。

/= 除 a/=b 與 a=a/b運算相同。

%= 餘數 a%=b 與 a=a%b運算相同。

&= 位元 AND a&=b 與 a=a&b運算相同。

|= 位元 OR a|=b 與 a=a|b運算相同。

^= 位元 XOR a^=b 與 a=a b運算相同。

Page 65: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6505/01/2023

複合運算子 程式範例 void setup() {} void loop() { int x=2; //宣告整數變數x,設定初值為2。 char a=0b00100101; //宣告字元變數a=0b00100101(二進值)。 char b=0b00001111; //宣告字元變數b=0b00001111(二進值)。 x+=4; //x=x+4=6。 x-=3; //x=x-3=3。 x*=10; //x=x*10=30。 x/=2; //x=x/2=15。 x%=2; //x=x%2=1。 a&=b; //a=a&b=0b00000101。 a|=b; //a=a|b=0b00001111。 a^=b; //a=a^b=0b00000000。 }

運算結果

x=1,a=0b00000000,b=0b00001111

Page 66: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6605/01/2023

運算子的優先順序運算子的優先順序

優先順序 運算子 說明

1 ( ) 括號

2 ~ ! 補數、NOT運算

3 ++、 遞增、遞減

4 *, / ,% 乘法,除法,餘數

5 +, 加法,減法

6 <<,>> 移位

7 <>,<=,>= 關係

8 ==,!= 相等、不等

9 & 位元 AND運算

10 位元 XOR運算

11 | 位元 OR運算

12 && 邏輯 AND運算

13 || 邏輯 OR運算

14 *=,/=,%/,+=, =,&=,^=,|= 複合運算

Page 67: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6705/01/2023

Arduino 程式流程控制

for迴圈

for 迴圈是由初值運算式、條件運算式與增量或減量運算式三部份組成,彼此之

間以分號隔開。

(1) 初值:設定初值,可由任何數值開始。

(2) 條件:若條件為真,則執行括號"{ }"中的敘述,否則離開迴圈。

(3) 增量 (或減量 ):每執行一次迴圈內的動作後,依增量 (減量 )遞增 (遞減 )。

指令格式

for(初值; 條件; 增量或減量) { //敘述; }

迴圈控制指令— for迴圈

Page 68: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6805/01/2023

Arduino 程式流程控制迴圈控制指令— for迴圈 程式範例 void setup() {} void loop() { int i,s=0; //宣告整數變數。 for(i=0;i<=10;i++) //當i<=10時,執行迴圈。 s=s+i; //s=1+2+… +10。 }

執行結果

s=55

Page 69: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 6905/01/2023

Arduino 程式流程控制迴圈控制指令—while迴圈 while 迴圈

while 為先判斷型迴圈,當條件式為真時,則執行大括號"{ }"中的敘述,直到

條件式為假不成立時,才結束 while 迴圈。在 while 條件式中沒有初值運算式

及增量 (或減量 )運算式,因此必須在敘述中設定。

指令格式 while( 條件式 ) //先判斷型迴圈。 { //敘述; }

Page 70: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7005/01/2023

Arduino 程式流程控制迴圈控制指令—while迴圈 程式範例 void setup() { } void loop() { int i=0,s=0; //宣告整數變數。 while(i<=10) //當i小於或等於10時,執行迴圈。 { s=s+i; //s=1+2+3+… +10。 i++; //i遞增。 } }

執行結果

s=55

Page 71: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7105/01/2023

Arduino 程式流程控制迴圈控制指令— do-while迴圈 do-while迴圈

do-while 為後判斷型迴圈,會先執行大括號"{ }"中的敘述一次,然後再判斷條

件式,當條件式為真時,則繼續執行大括號"{ }"中的動作,直到條件式為假時,

才結束 do-while 迴圈。因此 do-while 迴圈至少執行一次。

指令格式 do { //先執行敘述一次。 //敘述; } while( 條件式 ) //後判斷型迴圈。

Page 72: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7205/01/2023

Arduino 程式流程控制迴圈控制指令— do-while迴圈 程式範例 void setup() {} void loop() { int i=0,s=0; //宣告整數變數。 do { s=s+i; //s=1+2+3+… +10。 i++; //i遞增。 } while(i<=10) //當i小於或等於10時,繼續執行迴圈。 }

執行結果

s=55

Page 73: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7305/01/2023

Arduino 程式流程控制迴圈控制指令— do-while迴圈 程式範例 void setup() {} void loop() { int i=0,s=0; //宣告整數變數。 do { s=s+i; //s=1+2+3+… +10。 i++; //i遞增。 } while(i<=10) //當i小於或等於10時,繼續執行迴圈。 }

執行結果

s=55

Page 74: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7405/01/2023

Arduino 程式流程控制條件控制指令— if敘述 if 敘述

if 敘述會先判斷條件式,若條件式為真時,則執行一次大括號{}中的敘述,若

條件式為假時,則不執行。 if 敘述內如果只有一行敘述時,可以不用加大括號

"{ }",但如果有一行以上敘述時,一定要加上大括號"{ }",否則在 if 敘述內只

會執行第一行敘述,其餘敘述則視為在 if 敘述之外。

指令格式 if ( 條件式 ) { //敘述; }

Page 75: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7505/01/2023

Arduino 程式流程控制條件控制指令— if敘述 程式範例 void setup() {} void loop() { int a=2,b=3,c=0; //宣告整數變數。 if(a>b) //a大於b? { c=a; //若a大於b,則c=a。 } }

執行結果

c=0

Page 76: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7605/01/2023

Arduino 程式流程控制條件控制指令— if-else敘述 if-else 敘述

if-else 敘述會先判斷條件式,若條件式為真時,則執行敘述 1,若條件式為假

時,則執行敘述 2。在 if 敘述或 else 敘述內,如果只有一行敘述時,可以不用

加大括號"{ }",但如果有一行以上敘述時,一定要加上大括號"{ }"。

指令格式 if ( 條件式 ) //條件式為真,執行敘述1。 { //敘述1; } else //條件式為假,執行敘述2。 { //敘述2; }

Page 77: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7705/01/2023

Arduino 程式流程控制條件控制指令— if-else敘述 程式範例 void setup() {} void loop() { int a=3,b=2,c=0; //宣告整數變數。 if(a>b) //a大於b? { c=a; //若a大於b,則c=a。 } else //a小於或等於b { c=b; //c=b。 } }

執行結果

c=3

Page 78: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7805/01/2023

Arduino 程式流程控制條件控制指令—巢狀 if-else敘述 巢狀 if-else 敘述

使用巢狀 if-else 敘述時,必須注意 if 與 else 的配合,其原則是 else 要與最接近

且未配對的 if 配成一對,通常我們都是以 Tab 定位鍵或空白字元來對齊配對的

if-else,才不會有錯誤動作出現。在 if 敘述或 else 敘述內,如果只有一行敘述

時,可以不用加大括號{},但如果有一行以上敘述時,一定要加上大括號"{ }"。

指令格式 if ( 條件1 ) if ( 條件2 ) if ( 條件3 ) //條件1、2、3皆成立時,執行敘述1。 {//敘述1;} else //條件1、2成立且條件3不成立,執行敘述2。 {//敘述2;} else {//敘述3;} //條件1成立且條件2不成立時,執行敘述3。 else {//敘述4; } //條件1不成立時,執行敘述4。

Page 79: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 7905/01/2023

Arduino 程式流程控制條件控制指令—巢狀 if-else敘述

程式範例 void setup() {} void loop() { int score=75; char grade; if(score>=60) //成績大於或等於60分? if(score>=70) //成績大於或等於70分? if(score>=80) //成績大於或等於80分? if(score>=90) //成績大於或等於90分? grade='A'; //成績大於或等於90分,等級為A。 else //成績在80~90分之間。 grade='B'; //成績在80~90分之間,等級為B。 else //成績在70~80分之間。 grade='C'; //成績在70~80分之間,等級為C。 else //成績在60~70分之間。 grade='D'; //成績在60~70分之間,等級為D。 else //成績小於60分。 grade='E'; //成績小於60分,等級為E。 }

執行結果

grade='C'

Page 80: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8005/01/2023

Arduino 程式流程控制條件控制指令— if-else-if敘述 if-else if 敘述

使用 if-else if 敘述時,必須注意 if 與 else if 的配合,其原則是 else if 要與最接

近且未配對的 if 配成一對,通常我們都是以 Tab 定位鍵或空白字元來對齊配對

的 if-else,才不會有錯誤動作出現。在 if 敘述或 else敘述內,如果只有一行敘

述時,可以不用加大括號{},但是一行以上敘述時,一定要加上大括號"{ }"。

指令格式

if( 條件1 ) //條件1成立? { //條件1成立,執行敘述1。 //敘述1; } else if( 條件2 ) //條件2成立? { //條件2成立,執行敘述2。 //敘述2; } else if( 條件3 ) //條件3成立? { //條件3成立,執行敘述3。 //敘述3; } else //條件1、2、3皆不成立。 { //條件1、2、3皆不成立,執行敘述4。 //敘述4; }

Page 81: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8105/01/2023

Arduino 程式流程控制條件控制指令— if-else-if敘述 程式範例

void setup() {} void loop() { int score=75; //成績。 char grade; //等級。 if(score>=90 && score<=100) //成績大於或等於90分? grade='A'; //成績大於或等於90分,等級為A。 else if(score>=80 && score<90) //成績在80~90分之間? grade='B'; //成績在80~90分之間,等級為B。 else if(score>=70 && score<80) //成績在70~80分之間? grade='C'; //成績在70~80分之間,等級為C。 else if(score>=60 && score<70) //成績在60~70分之間? grade='D'; //成績在60~70分之間,等級為D。 else //成績小於60分。 grade='E'; //成績小於60分,等級為E。 }

執行結果

grade='C'

Page 82: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8205/01/2023

Arduino 程式流程控制條件控制指令— switch-case敘述

switch-case 敘述與 if-else if 敘述類似,但 switch-case 敘述的格式較清楚而且有

彈性。if-else if 敘述是二選一的程式流程控制指令,而 switch-case 則是多選一的程

式流程控制指令。switch 以條件式運算的結果與 case 所指定的條件值比對,若與某

個 case中的條件值比對相同,則執行該 case所指定的敘述,若所有的條件值都不符

合,則執行 default所指定的敘述,在 switch 內的條件式運算結果必須是整數或字元。

如果要結束 case 中的動作,可以使用 break 敘述,但是一次只能跳出一層迴圈,如

果要一次結束多個迴圈,可以使用 goto 指令,但程式的流程將變得更凌亂,所以應

儘量少用或不用 goto 指令。

Page 83: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8305/01/2023

Arduino 程式流程控制條件控制指令— switch-case敘述 指令格式

switch ( 條件式 ) { case 條件值1: { 敘述1;} //條件式等於條件值1時,執行敘述1。 break; case 條件值2: { 敘述2;} //條件式等於條件值2時,執行敘述2。 break; default: { 敘述n;} //所有的條件值都不等於條件式時,執行敘述n。 }

Page 84: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8405/01/2023

Arduino 程式流程控制條件控制指令— switch-case敘述 程式範例

void setup() {} void loop() { int score=75; //成績。 int value; //數值。 char grade; //等級。 value=score/10; //取出成績十位數值

Page 85: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8505/01/2023

Arduino 程式流程控制條件控制指令— switch-case敘述

switch(value) //以成績十位數值作為判斷條件。 { case 10: //成績為100分。 grade='A'; //成績為100分,等級為A。 break; //結束迴圈。 case 9: //成績大於或等於90分? grade='A'; //成績大於或等於90分,等級A。 break; //結束迴圈。 case 8: //成績在80~90分之間? grade='B'; //成績在80~90分之間,等級B。 break; //結束迴圈。 case 7: //成績在70~80分之間? grade='C'; //成績在70~80分之間,等級C? break; //結束迴圈。 case 6: //成績在60~70分之間? grade='D'; //成績在60~70分之間,等級為D。 break; //結束迴圈。 default: //成績在小於60分。 grade='E'; //成績在小於60分,等級為E。 break; //結束迴圈。 } }

執行結果

grade='C'

Page 86: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8605/01/2023

Arduino 程式流程控制無條件跳躍指令— goto敘述

指令格式

goto 標記名稱

程式範例 void setup() {} void loop() { int i,j,k; //宣告整數變數i,j,k。 for(i=0;i<1000;i++) //i迴圈。 for(j=0;j<1000;j++) //j迴圈。 for(k=0;k<1000;k++) //k迴圈。 if(analogRead(0)>500) //類比接腳0讀值大於500? goto exit; //類比接腳0讀值大於500,結束i,j,k迴圈。 exit: //標記exit。 }

執行結果

若類比接腳 A0讀值大於 500,則結束迴圈。

Page 87: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8705/01/2023

函式 (function)

函式原型所謂函式原型就是指定傳至函式引數的資料型態與函式傳回值的資料型態,函

式原型的宣告包含函式名稱、傳至函式的引數資料型態及函式傳回值的資料型態。

當被呼叫的函式必須傳回數值時,函式的最後一個敘述必須使用 return 敘述。使用

return 敘述有兩個目的,一是將控制權轉回給呼叫函式,另一是將 return敘述後面小

括號" ( ) "中的數值傳回給呼叫函式。return 敘述只能從函式傳回一個數值。

宣告格式 傳回值型態 函數名稱(引數1型態 引數1, 引數2型態 引數2 …, 引數n型態 引數n)

宣告範例 void func1(void); //函式無引數,無傳回值。 void func2(char i); //函式有char型態引數i,無傳回值。 char func3(void); //函式無引值,有char型態的傳回值。 char func4(char i); //函式有char型態的引數i及傳回值。

Page 88: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8805/01/2023

函式 (function)

函式原型 程式範例

void setup() {} void loop() { int x=5,y=6,sum; //宣告整數變數x,y,sum。 sum=area(x,y); //呼叫area函數。 } int area(int x,int y) //計算面積函式area()。 { int s; s=x*y; //執行s=x*y運算。 return(s); //傳回面積s值。 }

執行結果

sum=30。

Page 89: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 8905/01/2023

陣列 (array)

所謂陣列(array)是指存放在連續記憶體中的一群相同資料型態的集合,陣列

也如同變數一樣需要先宣告,編譯器才會知道陣列的資料型態及大小。陣列的宣告

陣列包含四個項目:

1. 資料型態:在陣列中每個元素的資料型態皆相同。

2. 陣列名稱:命令規則與變數宣告方法相同。

3. 陣列大小:陣列可以是多維的,但必須指定其大小,編譯器才能為陣列配置記

憶體空間。

4. 陣列初值:與變數相同,可以事先指定初值或不指定。

Page 90: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 9005/01/2023

陣列 (array)

一維陣列 宣告格式 資料型態 陣列名[陣列大小n]={初值0,初值1,… ,初值n-1};

程式範例

void setup() {} void loop() { int n; //陣列註標。 int a[5]={1,2,3,4,5}; //宣告一維整數陣列。 }

執行結果

a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5

Page 91: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 9105/01/2023

陣列 (array)

二維陣列 宣告格式 資料型態 陣列名[m][n]= { {初值0,初值1,… 初值n-1}, //第0列。 {初值0,初值1,… 初值n-1}, //第1列。 : {初值0,初值1,… 初值n-1} }; //第m-1列。

程式範例 void setup() {} void loop() { int m,n; //陣列註標。 int a[2][3]= //宣告二維整數陣列。 { {0,1,2}, //第0列。 {3,4,5} }; //第1列。 }

執行結果

a[0][0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5

Page 92: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 9205/01/2023

陣列 (array)

以陣列傳引數 當傳遞陣列給函式時,並不會將此陣列複製一份給函式,只是傳遞陣列的位址給函式,函式再利用這個位址與註標去存取原來在主函式中的陣列。 程式範例 void setup() {} void loop() { int result; //宣告整數變數result。 int a[5]={1,2,3,4,5}; //宣告整數陣列a[5]。 int size=5; //宣告整數變數size。 result=sum(a,size); //傳址呼叫函式sum。 Serial.println(result); } int sum(int a[],int size) //函數sum。 { int i; //宣告整數變數i。 int result=0; //宣告整數變數result。 for(i=0;i<size;i++) result=result+a[i]; //計算陣列中所有元素的總和。 return(result); //傳回計算結果。

執行結果

result=15

Page 93: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 9305/01/2023

前置命令#include 前置命令 指令格式 #include <標頭檔> #include ”標頭檔”

程式範例 #include <Servo.h> //載入Servo.h標頭檔案。 Servo myservo; //定義Servo物件。 int pos = 0; //伺服器轉動角度。 void setup() { myservo.attach(9); //servo連接至數位接腳9。 } void loop() { for(pos =0; pos<180; pos+=1) //由0~180每次轉動1。 { myservo.write(pos); //伺服器轉動至指定的角度。 delay(15); //延遲15ms。 } for(pos=180; pos>=1; pos-=1) //由180~0每次轉動1。 { myservo.write(pos); //伺服器轉動至指定的角度。 delay(15); //延遲15ms。 } }

Page 94: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Arduino 語言基礎 9405/01/2023

前置命令#define 前置命令 指令格式 #define 巨集名稱 字串

程式範例

#define PI 3.14159 //定義巨集 PI=3.14159。 #define AREA(x) PI*x*x //定義巨集 AREA(X)=PI*x*x。 void setup() {} void loop() { float result=AREA(2); //計算圓面積。 }

執行結果

result=12.57

Page 95: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

9505/01/2023

電路組裝

Page 96: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

9605/01/2023

安裝偵測空氣懸浮粒子感測器

Page 97: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

9705/01/2023

安裝偵測空氣懸浮粒子感測器

Page 98: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

9805/01/2023

安裝偵測空氣懸浮粒子感測器pin1 ,供電輸入接腳,要輸入 5V電壓的電力。pin2 ,接地接腳,接上 0V 。pin3 ,設定輸入接腳,接收到 0時感測器處於待備狀態(減少感測器的耗電),接收到 1 則為運作狀態。pin4 ,串列埠接收接腳 (Rx) ,邏輯準位3.3V 。pin5 ,串列埠輸出接腳 (Tx) ,邏輯準位3.3V 。pin6 ,重置、重新開機輸入接腳,接收到3.3V 則重新開機。pin7 ,還沒用到。pin8 ,還沒用到。

Page 99: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

9905/01/2023

安裝偵測空氣懸浮粒子感測器

Page 100: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10005/01/2023

安裝偵測空氣懸浮粒子感測器PMS3003 感測模

組 開發板接腳 解說pin1 ,供電輸入

接腳Ameba pin 5V 5V 陽極接點

pin2 ,接地接腳 Ameba pin Gnd 共地接點pin4 ,串列埠接

收接腳 (Rx)

Ameba Tx(D1) 串列埠傳送端pin5 ,串列埠輸

出接腳 (Tx)

Ameba Rx(D0) 串列埠接收端

Page 101: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10105/01/2023

安裝 LCD 顯示器

Page 102: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10205/01/2023

安裝 LCD2004 顯示器

Page 103: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10305/01/2023

安裝 LCD2004 顯示器PMS3003 感測模

組 開發板接腳 解說pin1 ,供電輸入接

腳Ameba pin 5V 5V 陽極接點

pin2 ,接地接腳 Ameba pin Gnd 共地接點pin4 ,串列埠接收

接腳 (Rx)Ameba Tx(D1) 串列埠傳送端

pin5 ,串列埠輸出接腳 (Tx)

Ameba Rx(D0) 串列埠接收端LCD2004 顯示模

組開發板接腳 解說

VCC Ameba pin 5V 5V 陽極接點GND Ameba pin Gnd 共地接點SCL Ameba I2C_SCL I2C SCLSDA Ameba I2C_SDA I2C SDA

LCD 2004顯示模組接腳表 (累加接腳表 )

Page 104: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10405/01/2023

安裝 RTC 時鐘模組

Page 105: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10505/01/2023

安裝 RTC 時鐘模組

Page 106: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10605/01/2023

安裝 RTC 時鐘模組RTC 時鐘模

組開發板接腳 解說

VCC Ameba pin 5V

5V 陽極接點

GND Ameba pin Gnd

共地接點SCL Ameba

I2C_SCLI2C SCL

SDA Ameba I2C_SDA

I2C SDA

Page 107: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10705/01/2023

安裝溫溼度感測模組

Page 108: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10805/01/2023

溫溼度感測器

Page 109: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

10905/01/2023

溫溼度感測器

溫溼度感測器 開發板接腳 解說VCC Ameba pin 5V 5V 陽極接點GND Ameba pin Gnd 共地接點

Data(Signal) Ameba D8 溫溼度資料輸出腳

Page 110: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11005/01/2023

溫溼度感測器

Page 111: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11105/01/2023

溫溼度感測器

Page 112: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11205/01/2023

最後成品

Page 113: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11305/01/2023

最後成品

Page 114: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11405/01/2023

系統開發

Page 115: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

11505/01/2023

啟動開發環境

Page 116: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式

11605/01/2023

Page 117: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

啟動程式

11705/01/2023

Page 118: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

選擇開發版

11805/01/2023

Page 119: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

確定通訊埠

11905/01/2023

Page 120: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

選擇通訊埠

12005/01/2023

Page 121: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式

12105/01/2023

Page 122: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

12205/01/2023

讀取WIFI MAC 資料

Page 123: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 CheckMac

12305/01/2023

Page 124: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

CheckMac 程式重點解說

12405/01/2023

#include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC 資料 GetWifiMac() 取得 MAC函數 WiFi.status(); 顯示 WIFI狀態 WiFi.macAddress(MacData); 取得 MAC 資料 print2HEX() 轉換內容為十六進位碼

Page 125: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

12505/01/2023

檢查 AP 是否連接的上

Page 126: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 CheckAP

12605/01/2023

Page 127: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

CheckAP 程式重點解說

12705/01/2023

#include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC 資料 IPAddress Meip ,Megateway ,Mesubnet ; 宣告 ip 、閘道器、子網路遮罩 int status = WL_IDLE_STATUS; 連線網路狀態 GetWifiMac() 取得 MAC函數 ShowMac() ; 秀出 MAC 資料 WiFi.status(); 顯示 WIFI狀態 WiFi.macAddress(MacData); 取得 MAC 資料 initializeWiFi(); 進行連線 printWifiData() ; 列印網路狀態資訊

Page 128: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

CheckAP 程式重點解說

12805/01/2023

status = WiFi.begin(ssid); 不使用加密連 AP status = WiFi.begin(ssid, pass); 使用加密連 AP status == WL_CONNECTED 連 AP 是否成功 WiFi.status() 連接成功狀態 Meip = WiFi.localIP(); 取得連線 IP Megateway = WiFi.gatewayIP();取得連線閘道器 WiFi.subnetMask(); 取得連線子網路遮罩

Page 129: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

12905/01/2023

ScanNetworks(掃描 AP)

Page 130: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 ScanNetworks

13005/01/2023

Page 131: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

ScanNetworks 程式重點解說

13105/01/2023

#include <WiFi.h> 使用網路必要函數 WiFi.status() == WL_NO_SHIELD 檢查有網路供能否 WiFi.firmwareVersion(); 檢查網路韌體版本 listNetworks() 列出可連接到的AP( 自訂 )

WiFi.scanNetworks(); 取得可連接到的 AP並存入 (-1為沒有 AP 可連接 ) WiFi.SSID(n) 可連接到的 AP(n) 的名字 WiFi.RSSI(n) 可連接到的 AP(n) 的 RSSI WiFi.encryptionTypeEx(n) 可連接到的 AP(n)的加密方式 I

Page 132: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

13205/01/2023

WIFIAPMODE( 啟動 AP模式 )

Page 133: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 WIFIAPMODE

13305/01/2023

Page 134: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

WIFIAPMODE 程式重點解說

13405/01/2023

WiFi.apbegin(ssid, pass, channel); 啟動 AP模式 SsidAP名字 PassAP 連線密碼 ChannelAP 連線通道

printWifiData(); 列印網路資訊 WiFi.BSSID(bssid); 列印 AP 網路資訊 WiFi.encryptionType(); AP加密狀態

Page 135: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

13505/01/2023

WebServerControlRelay使用 Client模式建立網頁伺服器

Page 136: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 WebServerControlRelay

13605/01/2023

Page 137: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

13705/01/2023

Page 138: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

WebServerControlRelay 程式重點解說

13805/01/2023

#include <WiFi.h> 使用網路必要函數 WiFiServer server(80); 啟動 PORT 80進行 status = WiFi.begin(ssid); 不使用加密連 AP status = WiFi.begin(ssid, pass); 使用加密連 AP server.begin(); 開始啟動 PORT 80 傾聽 printWifiStatus(); 列印網路資訊 WiFiClient client = server.available(); 有人連接 Port 80

client.connected() 有用戶連接中 client.available() 用戶送資料進來

Page 139: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

WebServerControlRelay 程式重點解說

13905/01/2023

char c = client.read(); 讀出用戶送的資料 ( 一個位元組 ) client.println(“HTTP/1.1 200 OK”); …. 送給用戶端一段 HTML碼,用瀏覽器方能顯示 currentLine.endsWith(“GET /H”) 判斷是否用 /H 結束 currentLine.endsWith(“GET /L”) 判斷是否用 /L 結束 client.stop(); 與用戶連線停止傳輸資料

Page 140: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

網頁畫面

14005/01/2023

Page 141: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

14105/01/2023

APMODEControlRelay使用 AP模式建立網頁伺服器

Page 142: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 APMODEControlRelay

14205/01/2023

Page 143: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

14305/01/2023

Page 144: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

APMODEControlRelay 程式重點解說

14405/01/2023

#include <WiFi.h> 使用網路必要函數 WiFiServer server(80); 啟動 PORT 80進行 status = WiFi.begin(ssid); 不使用加密連 AP status = WiFi.begin(ssid, pass); 使用加密連 AP server.begin(); 開始啟動 PORT 80 傾聽 printWifiStatus(); 列印網路資訊 WiFiClient client = server.available(); 有人連接 Port 80

client.connected() 有用戶連接中 client.available() 用戶送資料進來

Page 145: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

APMODEControlRelay 程式重點解說

14505/01/2023

char c = client.read(); 讀出用戶送的資料 ( 一個位元組 ) client.println(“HTTP/1.1 200 OK”); …. 送給用戶端一段 HTML碼,用瀏覽器方能顯示 currentLine.endsWith(“GET /H”) 判斷是否用 /H 結束 currentLine.endsWith(“GET /L”) 判斷是否用 /L 結束 client.stop(); 與用戶連線停止傳輸資料

Page 146: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

網頁畫面

14605/01/2023

Page 147: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

14705/01/2023

Set_RTC_Data(設定 RTC時間 )

Page 148: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 Set_RTC_Data

14805/01/2023

Page 149: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

14905/01/2023

Page 150: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

15005/01/2023

Page 151: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

Set_RTC_Data 程式重點解說

15105/01/2023

#include <Wire.h> I2C 通訊用 #include “RTClib.h“ DS1307 時鐘模組用 RTC_DS1307 RTC; 宣告時鐘物件 initRTC() ; 啟動時鐘物件 ( 自訂 )

Wire.begin(); 開始 I2C 通訊 RTC.begin(); 開始時鐘物件通訊 RTC.isrunning() 時鐘物件順利啟動

RTC.adjust(DateTime(mYear,mMonth,mDay,mHour,mMinute,mSecond)); 調整設定 DS1307 時鐘模組時間內容

Page 152: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

執行畫面

15205/01/2023

Page 153: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

15305/01/2023

ReadTime(讀取 RTC時間 )

Page 154: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 ReadTime

15405/01/2023

Page 155: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

15505/01/2023

Page 156: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

15605/01/2023

Page 157: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

ReadTime 程式重點解說

15705/01/2023

#include <Wire.h> I2C 通訊用 #include “RTClib.h“ DS1307 時鐘模組用 RTC_DS1307 RTC; 宣告時鐘物件 initRTC() ; 啟動時鐘物件 ( 自訂 )

Wire.begin(); 開始 I2C 通訊 RTC.begin(); 開始時鐘物件通訊 RTC.isrunning() 時鐘物件順利啟動

ShowDateTime() 顯示 DS1307 時鐘內容 ( 自訂 )

Page 158: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

ReadTime 程式重點解說

15805/01/2023

DateTime now = RTC.now(); 取得 RTC時鐘物件 now.hour() 取得小時 now.minute() 取得分 now.second() 取得秒 now.year() 取得年 now.month() 取得月 now.day() 取得日

Page 159: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

執行畫面

15905/01/2023

Page 160: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

16005/01/2023

UdpNtpClient讀取網路時間資料

Page 161: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 UdpNtpClient

16105/01/2023

Page 162: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

UdpNtpClient 程式重點解說

16205/01/2023

#include <WiFi.h> 使用網路必要函數 #include <PubSubClient.h>使用網路 UDP必要函數 #include <WiFiUdp.h>使用網路 UDP必要函數 uint8_t MacData[6]; 儲存 MAC 資料 const char ntpServer[] = “pool.ntp.org”; 網路時間伺服器

initializeWiFi(); 啟動網路 ShowNTPDateTime() ; 取得網路時間並顯示

retrieveNtpTime() ;取得網路時間 getCurrentTime(epoch+timeZoneOffset, &NDPyear, &NDPmonth, &NDPday, &NDPhour, &NDPminute, &NDPsecond); 將網路時間存入變數

Page 163: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

UdpNtpClient 程式重點解說

16305/01/2023

Udp.beginPacket(ntpServer, 123) 與網路伺服器通訊 Udp.write(nptSendPacket, NTP_PACKET_SIZE); 告訴網路伺服器要取得時間

Udp.endPacket(); 結束通訊 Udp.parsePacket() 得到網路伺服器傳送時間資料通知 Udp.read(ntpRecvBuffer, NTP_PACKET_SIZE) 讀取網路伺服器傳送時間資料 epoch = secsSince1900 - seventyYears ; 計算時間 epochSystem = epoch - millis() / 1000; 計算時間 (秒 ) getCurrentTime() 計算網路時間,回傳年、月、日、時、分、秒到變數

Page 164: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

執行畫面

16405/01/2023

Page 165: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

16505/01/2023

SetTime_fromNet網路校時

Page 166: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 SetTime_fromNet

16605/01/2023

Page 167: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

SetTime_fromNet 程式重點解說

16705/01/2023

#include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC 資料 initRTC() ; 初始化時鐘模組 ShowNTPDateTime() ; 取得網路時間並顯示

retrieveNtpTime() ;取得網路時間 getCurrentTime(epoch+timeZoneOffset, &NDPyear, &NDPmonth, &NDPday, &NDPhour, &NDPminute, &NDPsecond); 將網路時間存入變數

SetRTCTime(NDPyear, NDPmonth, NDPday, NDPhour, NDPminute, NDPsecond); 將取得網路時間調整時鐘模組

Page 168: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

執行畫面

16805/01/2023

Page 169: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

16905/01/2023

WiFiWebClient讀取網頁資料

Page 170: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 WiFiWebClient

17005/01/2023

Page 171: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

WiFiWebClient 程式重點解說

17105/01/2023

#include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC 資料 GetWifiMac() 取得 MAC函數 WiFi.status(); 顯示 WIFI狀態 printWifiStatus(); 列印網路狀態 client.connect(server, 80) 連到Server(用 port80)

client.println(“GET /search?q=ameba HTTP/1.1”); 送給伺服器端資料

client.available() 連線對象要送資料 char c = client.read(); 讀取連線對象要送資料

Page 172: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

17205/01/2023

lcd1602_I2C_mills顯示資料在 LCD 上

Page 173: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 lcd1602_I2C_mills

17305/01/2023

Page 174: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

lcd1602_I2C_mills 程式重點解說

17405/01/2023

#include <I2CIO.h> I2C 函數 #include <LCD.h> LCD函數 #include <LiquidCrystal_I2C.h> I2C版 LCD函數 #define I2C_ADDR 0x27 設定 LCD I2C位址 lcd.begin (16,2); 設定 LCD寬度與高度 lcd.setBacklight(LED_ON); 設定 LCD 背光 lcd.backlight(); 啟動 LCD 背光 lcd.setCursor(0,0); LCD歸零定位 lcd.print(“Hello, world!”); 印出 Hello World

Page 175: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

17505/01/2023

DHTx讀取溫溼度資料

Page 176: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 DHTx

17605/01/2023

Page 177: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

17705/01/2023

Page 178: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

17805/01/2023

Page 179: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

DHTx 程式重點解說

17905/01/2023

#include “DHT.h” 使用溫溼度模組必要函數 #define DHTTYPE DHT22 宣告使用哪種 DHT 溫溼度模組 DHT dht(DHTSensorPin, DHTTYPE); 取得溫溼度物件 dht.begin(); 溫溼度物件通訊 ShowHumidity() ; 顯示溫溼度資料 ( 自訂 ) dht.readHumidity(); 讀取濕度 ht.readTemperature(true); 讀取溫度

Page 180: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

18005/01/2023

pms3003讀取空汙偵測器資料

Page 181: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

開啟程式 pms3003

18105/01/2023

Page 182: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

18205/01/2023

Page 183: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電路連接

18305/01/2023

Page 184: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

pms3003 程式重點解說

18405/01/2023

#include <SoftwareSerial.h> 使用串列埠必用 SoftwareSerial mySerial(0, 1); // RX, TX 產生通訊物件

#define pmsDataLen 24 空氣偵測器資料長度 unsigned char buf[pmsDataLen]; 讀取空氣偵測器資料暫存變數 空汙資料變數

int idx = 0; int pm10 = 0; int pm25 = 0; int pm100 = 0;

Page 185: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

pms3003 程式重點解說

18505/01/2023

bool hasPm25Value = false; 讀取資料成功與否 int ErrorCount = 0 ; 錯誤次數’ #define ErrorRebootCount 5 最大容忍錯誤次數 mySerial.begin(9600); 通訊埠速度 retrievePM25Value() ; 讀取空汙資料 ( 自訂 ) ShowPM() 顯示空汙資料 ( 自訂 ) memset(buf, 0, pmsDataLen); 清空空氣偵測器資料暫存變數 mySerial.available()>0 有資料讀入 count < pmsDataLen 讀取資料未滿

Page 186: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

pms3003 程式重點解說

18605/01/2023

buf[count] = mySerial.read(); 讀一個位元組進來 buf[0] == 0x42 && count == 0 判斷開頭一 buf[1] == 0x4d && count == 1 判斷開頭二 count >= (pmsDataLen) 判斷讀取完畢否 ckecksum = ckecksum + buf[i] 進行加總 exptsum = ((unsigned int)buf[22] << 8 ) + ((unsigned int)buf[23]) ; 加總CHECK SUM

ckecksum == exptsum 加總資料合格否

Page 187: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

pms3003 程式重點解說

18705/01/2023

pm25 = ( buf[12] << 8 ) | buf[13]; PM2.5 資料 pm10 = ( buf[10] << 8 ) | buf[11]; PM1.0 資料

pm100 = ( buf[14] << 8 ) | buf[15]; PM10 資料

PowerManagement.softReset() ; 重新開機

Page 188: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

18805/01/2023

DEMO

Page 189: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

18905/01/2023

使用地圖模式查詢資料

Page 190: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19005/01/2023

使用地圖模式查看裝置

http://g0vairmap.3203.info/map.html

Page 191: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19105/01/2023

使用地圖模式查看裝置

可用滑鼠滾輪上下調整地圖大小

Page 192: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19205/01/2023

使用地圖模式查看裝置

可用按下滑鼠左鍵平移地圖位置

Page 193: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19305/01/2023

使用地圖模式查看裝置

選到您的裝置盒子的 GPS位置

Page 194: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19405/01/2023

使用 GPS 查看裝置

點選您的裝置

Page 195: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19505/01/2023

查看裝置資料

Page 196: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19605/01/2023

檢核網路資料 - 點選裝置

Page 197: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19705/01/2023

檢核網路資料 - 視覺化資料

Page 198: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19805/01/2023

檢核網路資料 - 查看歷史資料

Page 199: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

19905/01/2023

檢核網路資料:歷史資料

Page 200: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

20005/01/2023

使用網址輸入查詢資料

Page 201: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

20105/01/2023

檢核網路資料

使用網址輸入查看裝置:http://nrl.iis.sinica.edu.tw/LASS/show.php?device_id=FT1_0+ 裝置MAC 後四個字如: http://nrl.iis.sinica.edu.tw/LASS/show.php?device_id=FT1_07551

Page 202: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

20205/01/2023

Q & A

感謝聆聽恭請指教

Page 203: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

自我介紹 曹永忠 (Yung-Chung Tsao) ,目前為自由作家,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。 Email:[email protected] Line ID : dr.brucetsao 部落格: http://taiwanLinkIt ONE.blogspot.tw/ 範例原始碼網址: https://github.com/brucetsao/LinkIt_IOT_Programming 臉書社群 (Arduino.Taiwan) :

https://www.facebook.com/groups/Arduino.Taiwan/ 活動官網: http://Arduino.kktix.cc/ Youtube : https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ

2032014/10/22

Page 204: 空污偵測器製作暨實務研習會空氣盒子產品 DIY

電子書城

2042014/10/22

http://www.pubu.com.tw/store/ultima