#03 模擬練習Arduino C的程式架構

上一篇簡要談到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 輸入、輸出的燈光控制效果電路

開關往上狀態是閉迴路(CLOSE,讓電路島痛),開關往下是開迴路(OPEN,電路斷開不導通)。
利用電阻進行火花屏蔽的原理,避免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語言基本架構,即可製作出一個特殊計算器。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *