2022/09/04

App Inventor #7 ESP32 語音控制-IOT 專案必備程式庫範例 (Voice Control ESP32 with IoT Essential Code Base/Voice command )

 

前言:


大家好, 歡迎收看本週的Weekend project with Stonez56。
本周要進行的是 App Inventor 第7集 -  語音控制ESP32 - IOT 專案必備程式庫範例


本週要來示範如何設計App inventor 2 語音控制 APP, 只要加上我之前介紹的IoT專用必備程式庫, (請參考下方的#27連結), 為了讓初學者更好上手, 本次採用沒有放入MQTT的程式庫, 讓範例更簡單一點. 我們先來看一下實際的操作影片. https://www.youtube.com/watch?v=senjdb-cREY&t=40s


整個範例做完,你就可以以語音來控制遠端的 ESP32 了.  本次範例, 除了可以控制ESP32上的LED開 & 關, 也可以控制伺服馬達的開 & 關, 這集也加上了多語功能的控制, 中文和英文都可以喔. 範例中也設定了法文, 西班牙文, 和日文,有興趣的朋友可以自行加上這些語言的控制程式碼. 


#27 AsyncWifimanager ElegantOTA ESP32 (WiFi 密碼管理+ WiFi 韌體更新)
https://stonez56.blogspot.com/2021/07/asyncwifimanager-elegantota-esp32-wifi.html 


請先到上方的連結, copy 所有的程式嗎, 再複製到 Arduino 編輯程式中存檔.

也要記得把  esp32_servo.h 檔案給儲存下來.

好, 那我們就開始吧今天的練習吧~





Source code:


37_vioceControl_ESP32_ECBv1.ino

  1. #include "esp32_servo.h" //------->
  2. #define myLED 2 //------->
  3.  
  4. #include <AsyncElegantOTA.h>
  5. const char *FOTA_USERNAME = "un";
  6. const char *FOTA_PASSWORD = "pw";
  7. /****************************************************************************************************************************
  8. Async_AutoConnect_ESP32_minimal.ino
  9. For ESP8266 / ESP32 boards
  10. Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
  11. Licensed under MIT license
  12. *****************************************************************************************************************************/
  13. #if !(defined(ESP32))
  14. #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
  15. #endif
  16. #include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager
  17. AsyncWebServer webServer(80);
  18.  
  19. #define DEVICE_NAME "VoiceCommandESP32" //------->
  20. DNSServer dnsServer;
  21.  
  22. void setup()
  23. {
  24. pinMode(myLED, OUTPUT); //------->
  25. servo_setup(); //------->
  26. // put your setup code here, to run once:
  27. Serial.begin(115200);
  28. while (!Serial)
  29. ;
  30. delay(200);
  31. Serial.println("\nStarting Async_AutoConnect_ESP32_minimal on " + String(ARDUINO_BOARD));
  32. Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION);
  33.  
  34. ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, DEVICE_NAME); //------->
  35.  
  36. //ESPAsync_wifiManager.resetSettings(); //reset saved settings
  37. //ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 132, 1), IPAddress(192, 168, 132, 1), IPAddress(255, 255, 255, 0));
  38. ESPAsync_wifiManager.autoConnect();
  39. if (WiFi.status() == WL_CONNECTED)
  40. {
  41. Serial.print(DEVICE_NAME); //------->
  42. Serial.print(F(" Connected. Local IP: "));
  43. Serial.println(WiFi.localIP());
  44. }
  45. else
  46. {
  47. Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status()));
  48. }
  49.  
  50. webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  51. { request->send(200, "text/plain", "Hi! I am ESP32S. access to URL /update to update firmware"); }); //------->
  52.  
  53. webServer.onNotFound([](AsyncWebServerRequest *request)
  54. { request->send(404, "text/plain", "Page not found!"); }); //------->
  55. // move the motors //-------> NEW ADDITION Codes
  56. webServer.on("/go", HTTP_GET, [](AsyncWebServerRequest *request)
  57. {
  58. String motor = "";
  59. String rotation = "";
  60. // Get input value from URL/go?motor=msg1&rotation=msg2
  61. if(request->hasParam("motor") && request->hasParam("rotation")){
  62. if(request->hasParam("motor")){
  63. AsyncWebParameter* p = request->getParam("motor");
  64. Serial.print(p->name().c_str());
  65. Serial.println(p->value().c_str());
  66. motor = p->value();
  67. }
  68. if(request->hasParam("rotation")){
  69. AsyncWebParameter* p = request->getParam("rotation");
  70. Serial.print(p->name().c_str());
  71. Serial.println(p->value().c_str());
  72. rotation = p->value();
  73. }
  74.  
  75. if(rotation == "0"){
  76. digitalWrite(myLED, LOW);
  77. }else if(rotation == "1"){
  78. digitalWrite(myLED, HIGH);
  79. }else{
  80. servo_spin(rotation.toInt());
  81. }
  82. request->send(200, "text/plain", "Command executed!");
  83. }else{
  84. request->send(200, "text/plain", "Error command!");
  85. Serial.println("Error commands!");
  86. }
  87. });
  88. //AsyncElegantOTA.begin(&webServer); // Start ElegantOTA WITHOUT username & password
  89. AsyncElegantOTA.begin(&webServer, FOTA_USERNAME, FOTA_PASSWORD); // Start ElegantOTA with username & password
  90.  
  91. webServer.begin();
  92. Serial.println("HTTP server started");
  93. }
  94.  
  95. void loop() {
  96.  
  97. }


esp32_servo.h

  1. // ESP32Servo by John K. Bennett,autoConnectKevin Harrington Version 0.11.0
  2. // https://github.com/jkb-git/ESP32Servo/blob/master/src/ESP32_Servo.h
  3. #include <analogWrite.h>
  4. #include <ESP32PWM.h>
  5. #include <ESP32Servo.h>
  6. #include <ESP32Tone.h>
  7.  
  8. /** Define SERVO pins **/
  9.  
  10. #define SERVO_PIN2 13 //
  11. Servo SERVO_LR; //left right
  12.  
  13. const int MAX_ANGLE = 170; //keep servo at minimum range
  14. const int MIN_ANGLE = 10;
  15. int SERVO_LR_POS = 90;
  16.  
  17. void servo_setup()
  18. {
  19. SERVO_LR.setPeriodHertz(50); // standard 50 hz servo
  20. // http://yehnan.blogspot.com/2013/09/arduinotower-pro-sg90.html
  21. SERVO_LR.attach(SERVO_PIN2, 500, 2400);
  22.  
  23. //init position 90 degree for LR & UD
  24. SERVO_LR.write(SERVO_LR_POS);
  25. }
  26.  
  27. void servo_spin(int angle){
  28. // motor protection
  29. if(angle > MAX_ANGLE) angle = MAX_ANGLE;
  30. if(angle < MIN_ANGLE) angle = MIN_ANGLE;
  31. SERVO_LR.write(angle);
  32. }
  33.