/* 手機藍牙控制伺服馬達及LED */
/* 以序列埠先模擬BT,成功後再實作BT*/
#include <ESP32Servo.h> //servo函式庫
#include <BluetoothSerial.h> //bt函式庫
Servo svo; //伺服器名稱svo
BluetoothSerial myBT; //藍牙名稱
byte svoPin= 22; //伺服器橙色線接GPIO 22
const byte r=15; //紅色LED
const byte g=2; //綠色LED
void setup() {
Serial.begin(115200);
svo.attach(svoPin); //啟動1
svo.write(0);
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
Serial.println("藍牙已啟動,開啟藍牙並配對,然後開啟APP。");
Serial.println("請在序列框輸入:如 a45,b135或led00~11");
/*以下程式段,無法線上模擬。 實體製作時請把註解拿掉
myBT.begin("myBT"); //啟動BT
uint8_t mac[6]; //存放MAC 位址
myBT.getBtAddress(mac);
Serial.println("藍牙的MAC位址(六組):");
for(int i=0;i<6;i++) Serial.print(mac[i],HEX);
Serial.println();
*/
}
void loop() {
String st; //接收字串變數
int value; //從字串解析出數值(角度值)
//以下4行程式,把藍牙myBT以序列Serial來模擬,
//實體製作時請將下面2行程式註解對換
if (Serial.available()){ //實體製作時請如加//註解掉
st = Serial.readString(); //實體製作時請加//註解掉
st.toLowerCase(); //轉小寫
//if (myBT.available()){ //模擬時請加//註解掉
// st = myBT.readString(); //模擬時請加//註解掉
Serial.println(st); //印出收到的字串
if(st.indexOf("a")>=0){
value=st.substring(1).toInt(); //截取字串從第1個字以後的文字轉為數值
svo.write(value); //字串有是a,就送給servo1
}else
if(st.indexOf("b")>=0){
value=st.substring(1).toInt(); //截取字串從第1個字以後的文字轉為數值
sc1(value); //連續旋轉至指定角度
}else
if(st.indexOf("led")>=0){
value=st.substring(3).toInt(); //截取字串從第3個字以後的文字轉為數值
ledControl(value); //字串有是led,就依2位元數值控制2LED
}
}
delay(100);
}//=======================
void sc1(int d){
for(int i=0;i<d;i++){
svo.write(i);
delay(15);
}
for(int i=0;i<d;i++){
svo.write(d-i);
delay(15);
}
}//========================
void ledControl(int d){
switch(d){
case 0:
digitalWrite(r,0);
digitalWrite(g,0);
break;
case 1:
digitalWrite(r,0);
digitalWrite(g,1);
break;
case 10:
digitalWrite(r,1);
digitalWrite(g,0);
break;
case 11:
digitalWrite(r,1);
digitalWrite(g,1);
break;
}
}