##ESPrDeveloperで、GoogleHomeを自由に喋らせてみました
@horihiroさん素晴らしすぎます。
まさに、これです。そのまんまです。
PCとかラズパイとか不要で、arduinoだけで出来るなんて素晴らしすぎです。
↓
https://qiita.com/horihiro/items/4ab0edf415916a2cd542
上記に書いてあるソースも利用させていただきました・・・。
##使ったもの
ESPrDeveloper(スイッチサイエンス製)
・Arduino IDE
・ESP8266ライブラリ
・Google Home Notiferライブラリ
##mDNSでWEBに接続
せっかくなんで、mDNSを使って、hogehoge.local:8080 でWEBに接続できるようにしています。
ソースは、サンプルそのままです。
##外部インターネットからの接続
serveo.netをやろうかと思ったんですが、現在停止中でした。
そこで、GCPの無料枠を使って、httpsで接続するためのリバプロを作りました。
別記事にします。
→https://qiita.com/ABK28/items/c1683364edd9894beb65
##使い方(ローカル版)
ローカル環境から、例えば、hogehoge.local:8080 でつなぐだけです。
iPhoneやMacですとそのまま使えます。
Windowsだと、Bonjourのインストール必要らしいですが、Windowsを使っていないので詳細不明です・・。
##サンプルソース
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
#include <esp8266-google-home-notifier.h>
// Google Home
GoogleHomeNotifier ghn;
const char displayName[] = "あなたのデバイスネーム";
String mes;
// WiFi
const char* ssid="あなたのSSID";
const char* password="あなたのパスフレーズ";
// Web Server 8080ポートで接続
ESP8266WebServer server(8080);
static const char* cpResponse200 = "<HTML>"
"<BODY style='background-color:#ffffde;font-family:sans-serif;font-size:32px;'>"
"WEB Server Title<br/><br/><br/>"
"<input type=\"text\" style=\"font-family:sans-serif;font-size:30px;width:400px;height:80px;\">"
" <button style=\"font-family:sans-serif;font-size:24px;\">speech</button>"
"<script>"
"var d = document;"
"d.querySelector('button').addEventListener('click',function(){xhr = new XMLHttpRequest();"
"xhr.open('GET','/speech?phrase='+encodeURIComponent(d.querySelector('input').value));"
"xhr.send();});"
"</script>"
"</BODY></HTML>\r\n";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("");
//WiFi
Serial.println("");
Serial.print("connecting to Wi-Fi");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //Print the local IP
//Google Home speak IP Address.
mes = "フリースピーキングマシーンの IPアドレスは、";
mes += ipToString(WiFi.localIP());
mes += "です。";
googleHomeConnection( "ja", mes.c_str() );
// Set up mDNS responder
if (!MDNS.begin("hogehoge")) { //hogehoge.local
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
// Web Server
server.on("/speech", handleSpeechPath);
server.on("/", handleRootPath);
server.begin();
// Add service to MDNS-SD
MDNS.addService("http", "tcp", 8080);
}
void loop() {
// put your main code here, to run repeatedly:
MDNS.update();
server.handleClient();
}
//Google Home Neotifer で喋らせる
void googleHomeConnection( String lang_str1, String talk_str1 ){
Serial.println("connecting to Google Home...");
if (ghn.device( displayName, lang_str1.c_str() ) != true) {
Serial.println(ghn.getLastError());
return;
}
Serial.print("found Google Home(");
Serial.print(ghn.getIPAddress());
Serial.print(":");
Serial.print(ghn.getPort());
Serial.println(")");
if (ghn.notify( talk_str1.c_str() ) != true) {
Serial.println(ghn.getLastError());
return;
}
Serial.println("");
}
// IPadressをString型に・・
String ipToString(uint32_t ip){
String result = "";
result += String((ip & 0xFF), 10);
result += ".";
result += String((ip & 0xFF00) >> 8, 10);
result += ".";
result += String((ip & 0xFF0000) >> 16, 10);
result += ".";
result += String((ip & 0xFF000000) >> 24, 10);
return result;
}
// WEB -> 発声
void handleSpeechPath() {
String phrase = server.arg("phrase");
if (phrase == "") {
server.send(401, "text / plain", "query 'phrase' is not found");
return;
}
googleHomeConnection( "ja", phrase.c_str() );
server.send(200, "text / plain", "OK");
}
// WEB表示
void handleRootPath() {
server.send(200, "text/html", cpResponse200);
}