前言:
大家好, 歡迎收看本週的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
#include "esp32_servo.h" //-------> #define myLED 2 //-------> #include <AsyncElegantOTA.h> const char *FOTA_USERNAME = "un"; const char *FOTA_PASSWORD = "pw"; /**************************************************************************************************************************** Async_AutoConnect_ESP32_minimal.ino For ESP8266 / ESP32 boards Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager Licensed under MIT license *****************************************************************************************************************************/ #if !(defined(ESP32)) #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting. #endif #include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager AsyncWebServer webServer(80); #define DEVICE_NAME "VoiceCommandESP32" //-------> DNSServer dnsServer; void setup() { pinMode(myLED, OUTPUT); //-------> servo_setup(); //-------> // put your setup code here, to run once: Serial.begin(115200); while (!Serial) ; delay(200); Serial.println("\nStarting Async_AutoConnect_ESP32_minimal on " + String(ARDUINO_BOARD)); Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION); ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, DEVICE_NAME); //-------> //ESPAsync_wifiManager.resetSettings(); //reset saved settings //ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 132, 1), IPAddress(192, 168, 132, 1), IPAddress(255, 255, 255, 0)); ESPAsync_wifiManager.autoConnect(); if (WiFi.status() == WL_CONNECTED) { Serial.print(DEVICE_NAME); //-------> Serial.print(F(" Connected. Local IP: ")); Serial.println(WiFi.localIP()); } else { Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status())); } webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "Hi! I am ESP32S. access to URL /update to update firmware"); }); //-------> webServer.onNotFound([](AsyncWebServerRequest *request) { request->send(404, "text/plain", "Page not found!"); }); //-------> // move the motors //-------> NEW ADDITION Codes webServer.on("/go", HTTP_GET, [](AsyncWebServerRequest *request) { String motor = ""; String rotation = ""; // Get input value from URL/go?motor=msg1&rotation=msg2 if(request->hasParam("motor") && request->hasParam("rotation")){ if(request->hasParam("motor")){ AsyncWebParameter* p = request->getParam("motor"); Serial.print(p->name().c_str()); Serial.println(p->value().c_str()); motor = p->value(); } if(request->hasParam("rotation")){ AsyncWebParameter* p = request->getParam("rotation"); Serial.print(p->name().c_str()); Serial.println(p->value().c_str()); rotation = p->value(); } if(rotation == "0"){ digitalWrite(myLED, LOW); }else if(rotation == "1"){ digitalWrite(myLED, HIGH); }else{ servo_spin(rotation.toInt()); } request->send(200, "text/plain", "Command executed!"); }else{ request->send(200, "text/plain", "Error command!"); Serial.println("Error commands!"); } }); //AsyncElegantOTA.begin(&webServer); // Start ElegantOTA WITHOUT username & password AsyncElegantOTA.begin(&webServer, FOTA_USERNAME, FOTA_PASSWORD); // Start ElegantOTA with username & password webServer.begin(); Serial.println("HTTP server started"); } void loop() { }
esp32_servo.h
// ESP32Servo by John K. Bennett,autoConnectKevin Harrington Version 0.11.0 // https://github.com/jkb-git/ESP32Servo/blob/master/src/ESP32_Servo.h #include <analogWrite.h> #include <ESP32PWM.h> #include <ESP32Servo.h> #include <ESP32Tone.h> /** Define SERVO pins **/ #define SERVO_PIN2 13 // Servo SERVO_LR; //left right const int MAX_ANGLE = 170; //keep servo at minimum range const int MIN_ANGLE = 10; int SERVO_LR_POS = 90; void servo_setup() { SERVO_LR.setPeriodHertz(50); // standard 50 hz servo // http://yehnan.blogspot.com/2013/09/arduinotower-pro-sg90.html SERVO_LR.attach(SERVO_PIN2, 500, 2400); //init position 90 degree for LR & UD SERVO_LR.write(SERVO_LR_POS); } void servo_spin(int angle){ // motor protection if(angle > MAX_ANGLE) angle = MAX_ANGLE; if(angle < MIN_ANGLE) angle = MIN_ANGLE; SERVO_LR.write(angle); }