透過Serial port 通訊來控制 LED

本篇實作的功能是藉由Arduino 上所連接USB線來進通訊,運用基本的 Serial.available()、Serial.read()、Serial.readString()、Serial.print()、Serial.write() 的 Function,來實作出通訊的功能。

整體的功能如下,透過接收以下四種 Command 來控制兩顆LED的 亮與滅。

  • ON
    兩顆 LED 全亮
  • OFF
    兩顆 LED 全滅
  • 1
    1號 LED,反向動作 => (當目前為亮時,就將其滅,反之)
  • 2
    2號 LED,反向動作 => (當目前為亮時,就將其滅,反之)

電路接法:

注意:下圖中,為高功率的 LED 燈 可承受電壓為 3.0-3.6V,因此 無外接電阻降壓。


程式碼如下:

unsigned char LED_1_pin = 13;   //LED_1 連接 pin 13
unsigned char LED_2_pin = 12;   //LED_2 連接 pin 12

bool LED_1_state = false;   //LED_1 亮與滅的狀態
bool LED_2_state = false;   //LED_2 亮與滅的狀態

void setup() {
  Serial.begin(9600);   //設定 Serial port 初始 Baud Rate 為 9600

  Serial.println("\nEnter the following four commands:\nON\nOFF\n1\n2\n");

  pinMode(LED_1_pin, OUTPUT);   //設定 pin 13 為 Output 腳位
  pinMode(LED_2_pin, OUTPUT);   //設定 pin 12 為 Output 腳位

  //將兩個 LED 初始狀態設為 OFF
  digitalWrite(LED_1_pin, LED_1_state); 
  digitalWrite(LED_2_pin, LED_2_state);
}

void loop() {
  
  if (Serial.available()) {     //當Serial port 有接收到資料時
    String _str;
    
    _str = Serial.readString();     //讀取 整段 String,包含按下傳送時的 換行(0x0D 0x0A),因此後續判斷皆須加上 \xD\xA => (0x0D 0x0A)
    _str.toUpperCase();     //將 String 統一轉成大寫,方便後續的判斷

    Serial.print("\nThe command you entered is: ");
    Serial.print(_str);
    
    if(_str == "ON\xD\xA"){

        Serial.println("All LEDs set ON");

        LED_1_state = true;
        LED_2_state = true;

        digitalWrite(LED_1_pin, LED_1_state);
        digitalWrite(LED_2_pin, LED_2_state);

    }else if(_str == "OFF\xD\xA"){

        Serial.println("All LEDs set OFF");

        LED_1_state = false;
        LED_2_state = false;

        digitalWrite(LED_1_pin, LED_1_state);
        digitalWrite(LED_2_pin, LED_2_state);

    }else if(_str == "1\xD\xA"){
        
        if(LED_1_state){
            Serial.println("LED_1 set OFF");

            LED_1_state = false;

            digitalWrite(LED_1_pin, LED_1_state);
        }else{
            Serial.println("LED_1 set ON");

            LED_1_state = true;

            digitalWrite(LED_1_pin, LED_1_state);
        }

    }else if(_str == "2\xD\xA"){
        
        if(LED_2_state){
            Serial.println("LED_2 set OFF");

            LED_2_state = false;

            digitalWrite(LED_2_pin, LED_2_state);
        }else{
            Serial.println("LED_2 set ON");

            LED_2_state = true;

            digitalWrite(LED_2_pin, LED_2_state);
        }

    }else{

        Serial.println("Command error, please try  again !!!");

    }
  }
}

實際結果如下:


如需更多客製化服務:


另外有安裝或者其他使用上的問題,皆可參考下列篇章:

如有任何問題歡迎下方留言討論!!!

arrow
arrow

    微笑創客 發表在 痞客邦 留言(0) 人氣()