Arduino - Google Speech API + Android APP + 伺服馬達(Servomotor) + FA-130馬達(motor) + 藍芽接收器( Bluetooth Receiver) + LED
目的:
透過Android APP + Google Speech API,用聲控模擬簡易的智慧家電。
APP介面:


成品:



實際影片:
Arduino Code:
- #include < SoftwareSerial.h >
- #include < Wire.h > //引用二個函式庫SoftwareSerial及Wire SoftwareSerial
- #include < Servo.h >
- SoftwareSerial I2CBT(10, 11); //定義PIN10及PIN11分別為RX及TX腳位
- Servo myservo; // 建立Servo物件,控制伺服馬達
- int lightsize; //LED亮度
- int insize; //接收的訊息長度
- int openlight;
- int hasLast, temp;
- void setup() {
- Serial.begin(9600);
- I2CBT.begin(9600); //藍牙鮑率57600(注意!此鮑率每個藍牙晶片不一定相同,請先確認完再填寫進去)
- pinMode(6, OUTPUT); //設定 pin6 為輸出,LED就接在這
- pinMode(5, OUTPUT); //馬達腳位5
- openlight = 0;
- hasLast = 0;
- myservo.attach(9);
- myservo.write(20); // 一開始先置中0度
- }
- void loop() {
- byte cmmd[20];
- while (1) {
- if ((insize = (I2CBT.available())) > 0) //讀取藍芽訊息
- {
- Serial.print("input size = "); //判斷有沒有訊息接收
- Serial.println(insize); //顯示接收多少訊息
- for (int i = 0; i < insize; i++) {
- Serial.print(cmmd[i] = char(I2CBT.read())); //將接收的訊息顯示出來
- Serial.println(" ");
- }
- }
- if (insize == 1 && cmmd[0] >= 48 && cmmd[0] <= 57) {
- if (hasLast == 0) //判斷LED亮度大小的值
- {
- hasLast = 1;
- temp = cmmd[0] - 48;
- continue;
- }
- else {
- hasLast = 0;
- lightsize = cmmd[0] - 48 + temp * 10;
- }
- }
- if (insize >= 2) { //判斷LED亮度大小的值
- lightsize = (cmmd[0] - 48) * 10 + cmmd[1] - 48;
- }
- //analogWrite(13,map(lightsize,0,100,0,255)); //對應0~100 <-> 0~255
- switch (cmmd[0]) { //讀取第一個字(如果讀到的指令是字母)
- case 97: //97為"a"的ASCII CODE 點亮LED
- Serial.println("Turn On LED");
- openlight = 1;
- analogWrite(6, map(lightsize, 0, 100, 0, 255));
- break;
- case 98: //98為"b"的ASCII CODE 熄滅LED
- Serial.println("Turn Off LED");
- openlight = 0;
- analogWrite(6, 0);
- break;
- case 99: //99為"c"的ASCII CODE 開啟風扇
- Serial.println("Turn On FAN");
- analogWrite(5, 50);
- break;
- case 100: //100為"d"的ASCII CODE 關閉風扇
- Serial.println("Turn Off FAN");
- analogWrite(5, 0);
- break;
- case 101: //101為"e"的ASCII CODE 開啟窗簾
- Serial.println("Turn On Curtain");
- for (int i = 20; i <= 90; i += 1) {
- myservo.write(i);
- delay(20);
- }
- break;
- case 102: //102為"f"的ASCII CODE 關閉窗簾
- Serial.println("Turn Off Curtain");
- for (int i = 90; i >= 20; i -= 1) {
- myservo.write(i); // 直接以脈衝寬度控制
- delay(20);
- }
- break;
- default:
- if (openlight == 1)
- analogWrite(6, map(lightsize, 0, 100, 0, 255));
- break;
- }
- // Serial.println(lightsize);
- }
- }
留言
張貼留言