上一篇簡要談到Arduino C語言的結構,本篇可以使用Tinkercad線上模擬實作Arduino 數位I/O 輸入與輸出控制小小練習。
製作開關ON、OFF不同效果
生活周遭的最熟悉操作的元件非【開關】莫屬,凡是開燈、關燈總會用到開關。開關的功能就是切斷、連接電路迴路,如果電路呈現一個開迴路的狀態(稱之為 Open、OFF),因為電路不導通,因此燈光就不亮。反之,若開關的狀態是關閉的情況(Close、ON),電路呈現閉迴路導通狀態,因此電燈亮起來。
回顧 #01貼文的電路介紹 ,我們重新畫一個具備開關的電路。


因此透過開關的切換,就能製造出電路的開迴路(OFF)、閉迴路(ON)的效果。
認識Arduino 數位I/O
如果我們要求的功能是基本開燈、關燈效果,那就交給開關處理;今天要使用Arduino開發板,自然要做出與開關不同的效果。本範例將使用Arduino 的數位I/O進行燈光的模擬控制,數位I/O需要學習基本的控制方法。
Arduino UNO D0~D13,總共有14個針腳可用於數位I/O的控制,進階的使用者常常也會將A0~A5當作數位I/O的使用。

數位I/O 可設定為輸入(INPUT)、輸出(OUTPUT)功能
- INPUT: 表示偵測一個電路訊號,是高電壓HIGH或是低電壓LOW的訊號。
- OUTPUT: 提供小的輸出能量,可以推動小型的元件產生動作,例如LED、小燈泡、小的DC馬達。
如果要將數位I/O的D4設定位偵測外部訊號、D8輸出能量點亮燈光,因此我們透過pinMode()的指令進行設定。
//設定D4為 INPUT
pinMode(4, INPUT);
//設定D8為 OUTPUT
pinMode(8, OUTPUT);
經由上述的設定,D4可以偵測讀取電路上的訊號高(HIGH)與低(LOW),可以使用digitalRead(4)讀取訊號的狀態是HIGH或是LOW。
D8輸出一個高電壓(HIGH),或是低電壓(LOW),可以使用digitalWrite(8, HIGH)輸出一個高電壓。
//宣告一個變數,透過D4讀取目前電路的訊號狀態並儲存之。
int Status = 0;
Status = digitalRead(4);
//D8輸出一個高電壓HIGH,暫停一秒鐘後輸出一個低電壓LOW
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
設計Arduino 輸入、輸出的燈光控制效果電路

利用電阻進行火花屏蔽的原理,避免D4於開迴路時,ON、OFF狀態不明。
練習1. 使用if 判斷式製作連續閃爍的開燈與關燈效果。
- 說明:
- 使用Arduino設計一個進階版燈光開關控制器,與家用的燈光控制開關有所區別。
- 學習Arduino 數位I/O控制的方法:
- pinMode() 設定數位I/O輸入或輸出模式。
- digitalRead() 當數位I/O為輸入模式,透過此方法取得I/O的狀態。
- digitalWrite() 當數位I/O為輸出模式,透過此方法輸出高電位或是低電位。
- 功能:
- 開關向下切換成OFF,燈光閃爍一次後關閉燈光。
- 開關往上切換成ON,燈光閃爍3次之後恆亮。
- 註解:
- 使用if() 判斷式讀取數位I/O的狀態,特別使用不同顏色標示。
int Status = 0; //宣告一個變數,避免Loop()重複執行已做過的開、關行為。
void setup()
{
pinMode(8, OUTPUT); //D8腳位為輸出用途
pinMode(4, INPUT); //D4腳位為輸入用途,偵測開關的ON、OFF
}
void loop()
{
//當開關為ON的狀態,且 防呆狀態為0
if ((digitalRead(4) == HIGH) && (Status==0)){
Status = 1; //將Status內容更新為1,下次Loop再也不會執行已做過的程序
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
}
//當開關為OFF的狀態,且 防呆狀態為1
if ((digitalRead(4) == LOW) && (Status==1)){
Status = 0; //將Status內容更新為0,下次Loop再也不會執行已做過的程序
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
}
}
練習2. 利用for迴圈改變閃爍的次數
- 說明:
- 使用for()迴圈,將開關關閉時,燈光閃爍的次數增加至20次。
- 透過for()迴圈應用,可以減少程式的重複相同功能的程式碼數量。
- for()迴圈範例區塊如反差顏色所示。
int Status = 0;
void setup()
{
pinMode(8, OUTPUT);
pinMode(4, INPUT);
}
void loop()
{
if ((digitalRead(4) == HIGH) && (Status==0)){
Status = 1;
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
}
if ((digitalRead(4) == LOW) && (Status==1)){
Status = 0;
for(int i = 1; i <=20; i++){
digitalWrite(8, LOW);
delay(200);
digitalWrite(8, HIGH);
delay(100);
}
digitalWrite(8, LOW);
}
}
下一單元繼續延伸數位I/O的應用,使用一個液晶顯示器作為文字資訊顯示,搭配I/O的輸入製作一個與本篇學習的C語言基本架構,即可製作出一個特殊計算器。