--- tags: Arduino --- # Arduino 語法 與C相似,故在此介紹較為常用I/O語法 ## 一、基本結構 ### (一)setup() ##### 開始執行程式碼時,會先呼叫 setup( ) 函式,利用它去初始化變數、pin 腳模式、啟動宣告的 libraries 等等…,這個函式通電或重置後只會執行一次。 ### (二)loop() ##### 在執行 setup( )函式之後,緊接會執行 loop( ) 函式。它會連續且重複的執行,讓你的程式產生動作及回應。 ### (三)範例 ```cpp= int led = 9; // LED 連接到數位 pin9 void setup() //設定初始值 及output { pinMode(led, OUTPUT); } void loop() //重複執行 { digitalWrite(led, LOW); //led 設為低電位 delay(1500); //停留1.5秒 digitalWrite(led, HIGH); //led 設為高電位 delay(1500); //停留1.5秒 } ``` ## 二、數位 I/O 功能 ### (一)pinMode() ##### 指定一個 (數位) pin 腳做為輸入或者輸出。 ### (二)digitalWrite() ##### 寫 HIGH 或 LOW 到數位 pin 腳中。 ### (三)digitalRead() ##### 從指定的數位 pin 腳讀取數值,得到的值只會是 HIGH 或 LOW。 #### (四)範例:同上 ```cpp= ```cpp= int ledPin = 13; // LED 與 pin 13 連接 int inPin = 7; // 按鈕與 pin 7 連接 int val = 0; // 用 val 變數來儲存讀取到的數值 void setup() { pinMode(ledPin, OUTPUT); // 將數位 pin 腳 13 設定為輸出 pinMode(inPin, INPUT); // 將數位 pin 腳 7 設定為輸入 } void loop() { val = digitalRead(inPin); // 讀取輸入 pin 腳 digitalWrite(ledPin, val); // 將 LED 設定成按鈕的數值 } ``` ## 三、類比 I/O 功能 ### (一)analogRead() ##### 從指定的 pin 腳讀取類比電壓訊號,此函式會將 0 到 5 伏特的輸入電壓轉換成 0 到 1023 的整數 (或者是 0 到 2047) ### (二)analogWrite() – PWM ##### 對 pin 腳寫入一個類比訊號數值 (pin 腳將輸出 PWM 波型),可以用在改變 LED 的亮度以及控制馬達的轉速等。 ### (三)analogReadResolution() ##### 設定 analogRead() 所回傳的數值大小 (以 bit 為單位),它預設為 10bits (回傳值範圍在 0 到 1023)。 ### (四)analogWriteResolution() ##### analogWriteResolution() 可以設定 analogWrite() 函式的解析度,analogWrite() 的輸入值預設是 0 到 255 (8 bits)。 ### (五)範例 ```cpp= int ledPin = 9; // LED 燈連接到數位 pin 9 int analogPin = 3; // 可變電阻連接到類比 pin 3 int val = 0; // 儲存讀取到的電壓數值 void setup() { pinMode(ledPin, OUTPUT); // 設定 pin 9 腳為輸出 } void loop() { val = analogRead(analogPin); // 讀取類比輸入 pin 腳 analogWrite(ledPin, val / 4); // analogRead 數值從 0 到 1023 // analogWrite 數值從 0 到 255 } ``` ## 四、進階 I/O 功能 ### (一)tone() ##### 在指定的 pin 腳上產生一個指定頻率的方波 (工作週期是 50% 的 PWM 信號),可以指定持續時間或者持續直到呼叫 noTone(),在這個指定的 pin 腳上可以接蜂鳴器或者喇叭來發出一段音頻。 ### (二)noTone() ##### 停止由 tone() 產生的方波,在沒有任何音頻產生的時候呼叫此函式是沒有作用的。 ##### 注意: 如果你想要在多個 pin 腳上撥放不同的音頻,在呼叫下一個 tone() 前你需要先呼叫noTone()。 ### (三)shiftOut() ##### 以 byte 為單位將資料送出,一次一個 bit。可以從最高或者最低有效位元開始送出資料;每一個 bit 會被輸出到一個資料 pin 腳上,再經過時脈 pin 腳上的高 / 低電位變化邊緣讓接收端判讀該 bit 是否有效。 ### (四)shiftIn() ##### 以 byte 為單位來接收資料,一次一個 bit。可以從最高或者最低有效位元開始接收資料;接收每一個 bit 的過程中,時脈 pin 腳會先被拉成高電位,然後從資料 pin 上讀取一個 bit,再將時脈 pin 腳拉成低電位。 ### (五)pulseIn() ##### 讀取 pin 腳上的脈衝 (高或低電位) 持續時間;舉個例子,如果輸入值是 HIGH,pulseIn() 會等 pin 腳上的電位變成 HIGH 之後開始計時,等到又變回 LOW 才停止;之後會回傳脈衝的持續時間,單位是微秒。 ## 四、時間 ### (一)millis() ##### 回傳從開始運行程式到目前所經過的時間,單位是毫秒。 ### (二)micros() ##### 回傳從開始運行程式到目前所經過的時間,單位是微秒。 ### (三)delay() ##### 將程式暫停一段由參數指定的時間 (單位是毫秒,1000 毫秒 = 1 秒)。 ### (四)delayMicroseconds() ##### 將程式暫停一段由參數指定的時間 (單位是微秒),1000 微秒 = 1 毫秒,1000000 微秒 = 1 秒。 #### (五)範例 ```cpp= int outPin = 8; // 數位pin 8 void setup() { Serial.begin(9600); pinMode(outPin, OUTPUT); // 將數位 pin 腳設定為輸出 } void loop() { digitalWrite(outPin, HIGH); // 點亮 LED 燈 delay(1000); // 等待一秒 delayMicroseconds(50); // 等待 50 微秒 digitalWrite(outPin, LOW); // 熄滅 LED 燈 delayMicroseconds(50); // 等待 50 微秒 Serial.print("Time: "); time = millis(); // 印出程式執行的(毫秒)時間 Serial.println(time); // 等待一秒讓資料不致輸出過多 Serial.print("Time: "); time = micros(); // 印出程式執行的(為秒)時間 Serial.println(time); // 等待一秒讓資料不致輸出過多 } ```