Arduino筆記(80):使用藍芽控制LED燈

有一段時間想要做幾個跟藍芽有關的實作,每遇到一些小問題都是因為要用Android手機才有支援的APP,iphone手機則因為通訊的問題,常常無法順利成功。這週上自動控制課程時,課程的主題是藍芽,配合老師上課的進度,試著用 iPhone 的 Bluetooth Terminal APP 當作串列通訊讓Arduino 控制 LED點亮或熄滅。沒想到,很順利就完成實作,以下就紀錄一下整個過程。


[安裝Library]

執行程式前,需要用到定時執行某函數的程式庫Timer:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[材料]

  • Arduino Uno x 1
  • HC-05 Bluetooth  x 1
  • 220歐姆電阻 x 3
  • LED 紅, 黃, 綠 各 1 
  • 連接線 x n條

[接線圖]

Arduino接腳HC-05 藍芽其他
+5VVCC-
GNDGND-
D3TX-
D2RX
D10-綠色LED正極,負接220歐姆電阻,電阻另一端接地。
D9-黃色LED正極,負接220歐姆電阻,電阻另一端接地。
D8-紅色LED正極,負接220歐姆電阻,電阻另一端接地。



[程式]

#include <Timer.h>           //引用Timer定時執行程式庫 
#include <SoftwareSerial.h>  
SoftwareSerial BT(3,2);        //設定藍芽的軟體序列埠(RX, TX)

#define pinRed 8           //紅色 LED 燈角位
#define pinYellow 9        //黃色 LED 燈角位
#define pinGreen 10        //綠色 LED 燈角位

char ch;                  //藍芽傳送過來的字
boolean flagCycle=false;  //LED 燈是否閃爍
int interval=500;         //LED 燈閃爍的時間間隔
int blink=3;              //1 為紅燈閃爍,2 為黃燈閃爍,3 為綠燈閃爍
void ledCycle();
Timer t;                  //建立定時執行物件

void setup() 
{
  Serial.begin(9600);
  BT.begin(9600);          //啟動軟體序列埠
  t.every(1000,ledCycle);  //每秒執行一次 
  Serial.println("Bluetooth is Ready ! ");
  pinMode(pinRed, OUTPUT);
  pinMode(pinYellow, OUTPUT);
  pinMode(pinGreen, OUTPUT);
}

void loop() 
{
  while(BT.available()) 
  {  //若有資料傳送過來就接收
    delay(3);
    ch = BT.read();
    if( (ch != 'r') && (ch != 's') && (ch != 'g') && (ch != 'h') && (ch != 'y') && (ch != 'z') && (ch != 'c') && (ch != 'w')) {
       Serial.println("Please input r, s, g, h, y, z, c, w ??");
       continue;
    }
    else
       break;
  }

  t.update();  //更新閃爍狀態

  if (ch=='r' && flagCycle==false) {  //紅燈亮
    digitalWrite(pinRed, HIGH);

  } else if (ch=='s' && flagCycle==false) {  //紅燈滅
    digitalWrite(pinRed, LOW);

  } else if (ch=='g' && flagCycle==false) {  //綠燈亮  
    digitalWrite(pinGreen, HIGH);  

  } else if (ch=='h' && flagCycle==false) {  //綠燈滅
    digitalWrite(pinGreen, LOW);  

  } else if (ch=='y' && flagCycle==false) {  //黃燈亮 
    digitalWrite(pinYellow, HIGH);  

  } else if (ch=='z' && flagCycle==false) {  //黃燈滅 
    digitalWrite(pinYellow, LOW);  

  } else if (ch=='c') {  //開始閃爍 
    digitalWrite(pinRed, LOW);
    digitalWrite(pinYellow, LOW);
    digitalWrite(pinGreen, LOW);
    blink=1;
    flagCycle=true;
  } else if (ch=='w') {  //結束閃爍  
    flagCycle=false;
  }
}

void ledCycle() 
{  //LED 燈閃爍
  if(flagCycle) 
  {  //目前 LED 燈正在閃爍
    if(blink==1) 
    {  //紅燈閃爍
      digitalWrite(pinRed, HIGH);
      digitalWrite(pinYellow, LOW);
      digitalWrite(pinGreen, LOW);     
    }
    else if(blink==2) 
    {  //黃燈閃爍
      digitalWrite(pinRed, LOW);     
      digitalWrite(pinYellow, HIGH);
      digitalWrite(pinGreen, LOW); 
    }
    else if(blink==3) 
    {  //綠燈閃爍
      digitalWrite(pinRed, LOW);     
      digitalWrite(pinYellow, LOW);
      digitalWrite(pinGreen, HIGH);
    }
    blink++;
    if(blink>3)
      blink=1;  //循環
  }
}

將上面的程式上傳Arduino完成後,接下來就是要到iPhone的App Store或Android的Google Play商店,找到 Bluetooth Terminal後下載安裝。以我的手機iPhone為例:找到下圖(左)的APP,安裝成功後,執行程式會看到下圖(右)的畫面,找到手機可以接收到的藍芽的名稱(我的藍芽預設名稱是MLT-BT05),按下 Connect  ,跳到下一個畫面。 

看到畫面中央有個  ASCII  ,上方有個選項是  Select Characteristic  ,找到符合藍芽特性的選性,以我這款MLT-BT05為例,有支援FFE1,就選擇這個當作通訊通道。接下來就可以對藍芽進行終端機通訊,在ASCII Symbol處輸入字元「c」,按下  Send  ,送出指令給藍芽,就可以看到三個顏色的LED燈開始輪流亮起與熄滅。


[結果]

將執行結果拍成影片,先按下紅色控制鍵 r,依序按黃色控制鍵 y, 其次 g讓三個燈都亮起,接著按下三個代表色的下一個字元,s表示紅色燈熄滅,z代表黃燈熄滅,h代表綠燈熄滅,再按下c讓三個燈輪流亮起/熄滅,最後按下w停止輪流亮/滅。

[參考資料]

  • 老師上課提供範例

Post a Comment

較新的 較舊