Arduino - Google Speech API + Android APP + 伺服馬達(Servomotor) + FA-130馬達(motor) + 藍芽接收器( Bluetooth Receiver) + LED


目的


透過Android APP + Google Speech API,用聲控模擬簡易的智慧家電。

APP介面:



成品:





實際影片:

Arduino Code:

  1. #include < SoftwareSerial.h >
  2. #include < Wire.h > //引用二個函式庫SoftwareSerial及Wire SoftwareSerial
  3. #include < Servo.h >
  4.  
  5. SoftwareSerial I2CBT(10, 11); //定義PIN10及PIN11分別為RX及TX腳位
  6. Servo myservo; // 建立Servo物件,控制伺服馬達
  7. int lightsize; //LED亮度
  8. int insize; //接收的訊息長度
  9. int openlight;
  10. int hasLast, temp;
  11.  
  12. void setup() {
  13. Serial.begin(9600);
  14. I2CBT.begin(9600); //藍牙鮑率57600(注意!此鮑率每個藍牙晶片不一定相同,請先確認完再填寫進去)
  15. pinMode(6, OUTPUT); //設定 pin6 為輸出,LED就接在這
  16. pinMode(5, OUTPUT); //馬達腳位5
  17. openlight = 0;
  18. hasLast = 0;
  19.  
  20. myservo.attach(9);
  21. myservo.write(20); // 一開始先置中0度
  22. }
  23.  
  24. void loop() {
  25. byte cmmd[20];
  26.  
  27. while (1) {
  28. if ((insize = (I2CBT.available())) > 0) //讀取藍芽訊息
  29. {
  30. Serial.print("input size = "); //判斷有沒有訊息接收
  31. Serial.println(insize); //顯示接收多少訊息
  32. for (int i = 0; i < insize; i++) {
  33. Serial.print(cmmd[i] = char(I2CBT.read())); //將接收的訊息顯示出來
  34. Serial.println(" ");
  35. }
  36. }
  37.  
  38. if (insize == 1 && cmmd[0] >= 48 && cmmd[0] <= 57) {
  39. if (hasLast == 0) //判斷LED亮度大小的值
  40. {
  41. hasLast = 1;
  42. temp = cmmd[0] - 48;
  43. continue;
  44. }
  45. else {
  46. hasLast = 0;
  47. lightsize = cmmd[0] - 48 + temp * 10;
  48. }
  49. }
  50. if (insize >= 2) { //判斷LED亮度大小的值
  51. lightsize = (cmmd[0] - 48) * 10 + cmmd[1] - 48;
  52. }
  53. //analogWrite(13,map(lightsize,0,100,0,255)); //對應0~100 <-> 0~255
  54.  
  55. switch (cmmd[0]) { //讀取第一個字(如果讀到的指令是字母)
  56. case 97: //97為"a"的ASCII CODE 點亮LED
  57. Serial.println("Turn On LED");
  58. openlight = 1;
  59. analogWrite(6, map(lightsize, 0, 100, 0, 255));
  60. break;
  61.  
  62. case 98: //98為"b"的ASCII CODE 熄滅LED
  63. Serial.println("Turn Off LED");
  64. openlight = 0;
  65. analogWrite(6, 0);
  66. break;
  67.  
  68. case 99: //99為"c"的ASCII CODE 開啟風扇
  69. Serial.println("Turn On FAN");
  70. analogWrite(5, 50);
  71. break;
  72.  
  73. case 100: //100為"d"的ASCII CODE 關閉風扇
  74. Serial.println("Turn Off FAN");
  75. analogWrite(5, 0);
  76. break;
  77.  
  78. case 101: //101為"e"的ASCII CODE 開啟窗簾
  79. Serial.println("Turn On Curtain");
  80. for (int i = 20; i <= 90; i += 1) {
  81. myservo.write(i);
  82. delay(20);
  83. }
  84. break;
  85.  
  86. case 102: //102為"f"的ASCII CODE 關閉窗簾
  87. Serial.println("Turn Off Curtain");
  88. for (int i = 90; i >= 20; i -= 1) {
  89. myservo.write(i); // 直接以脈衝寬度控制
  90. delay(20);
  91. }
  92. break;
  93. default:
  94. if (openlight == 1)
  95. analogWrite(6, map(lightsize, 0, 100, 0, 255));
  96. break;
  97. }
  98. // Serial.println(lightsize);
  99. }
  100. }

留言