WebServerに関しては、”「WebServer」一覧”で説明しています。参考にして下さい。さてここでは、PLAYとSTOPボタンを持った画面でラジオのオンオフを行って行きます。前回の、”WebRadio w/I2S -03 . StreamDataの再生” 最小のMP3スケッチを元に変更して行きます。
#include <Arduino.h>
#include <WiFi.h>
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#include <WebServer.h>
#include <ESPmDNS.h>
// Enter your WiFi setup here:
const char *SSID = "XXXXXX";
const char *PASSWORD = "YYYYYY";
// Randomly picked URL
const char *URL="http://199.180.75.118:80/stream";
AudioGeneratorMP3 *mp3;
AudioFileSourceICYStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2S *out;
WebServer server(80);
String index_Dt =
"<!DOCTYPE html>\n<html>\n<head>\n"
"<title>ESP32 WebRadio</title>\n</head>\n"
"<body>\n<h2>ESP32 WebRadio</h2>\n"
"<form method='get'>\n"
"<button type='submit' name='1' >PLAY</button>\n"
"<button type='submit' name='2' >STOP</button>\n"
"</form>\n</body>\n</html>";
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println("Connecting to WiFi");
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
// Try forever
while (WiFi.status() != WL_CONNECTED) {
Serial.println("...Connecting to WiFi");
delay(1000);
}
Serial.println("Connected");
Serial.println(SSID);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
out = new AudioOutputI2S();
}
static int flg=0;
void loop()
{
if(flg)
{
if (mp3->isRunning()) {
if (!mp3->loop()) mp3->stop();
}
else {
Serial.printf("MP3 done\n");
delay(1000);
}
}
server.handleClient();
}
void handleRoot()
{
String cmd;
cmd=server.argName(0);
switch(cmd.toInt())
{
case 1: // Play
if(flg == 0)
{
file = new AudioFileSourceICYStream(URL);
buff = new AudioFileSourceBuffer(file, 2048*16);
mp3 = new AudioGeneratorMP3();
mp3->begin(buff, out);
flg=1;
}
break;
case 2: // Stop
if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; }
if (buff) { buff->close(); delete buff; buff = NULL; }
if (file) { file->close(); delete file; file = NULL; }
flg=0;
break;
}
server.send(200, "text/html",index_Dt);
}
- 8行:#include <WebServer.h> サーバ用に追加
- 9行:#include <ESPmDNS.h> DNS用に追加
- 12行:const char *SSID = “XXXXXX”; ルーターのSSIDを入力
- 13行:const char *PASSWORD = “YYYYYY”; ルーターのパスワードを入力
- 23行:WebServer server(80); サーバインスタンスの宣言
- 25から32行:ラジオコントロール用のHTML
- 52から54行:WiFi接続IDの表示
- 56から58行:DNSの開始
- 60行:server.on(“/”, handleRoot);
- リクエストに対するサーバでの処理関数の宣言
- これで全て、handleRootを通る。
- 62から63行:サーバーの開始とその表示
- 68行:static int flg=0;
- サーバの状態フラグ。再生中ー>1 停止ー>0
- 72行:if(flg)
- 再生されていない時に、mp3->isRunning()を行うとErrorになりました。
- それを防止する為にflgフラグを使用しています。
- 83行:server.handleClient();
- サーバ用関し関数
- 86行以下:void handleRoot()
- ここで、クライアントのリクエストに対応します。
- クリエの1文字目が”1”の場合ー>Playを実行
- ここで、file, buff, mp3が宣言されて、mp3->begin(buff, out);で実行されます。
- flg=1として void loop()の中のmp3->isRunning()を実行出来る様にします。
- クリエの1文字目が”2”の場合ー>STOPを実行
- MP3を止には、mp3->stop();でOKなのですが、今回は、file, buff, mp3が new演算子で定義されているので使用後は開放する必要が有ります。
- そこで、全てを止めて、領域をdelete後、各ポインターにNULLを代入しています。
- 112行:server.send(201, “text/html”,index_Dt);
- クライアントにHTMLを送って作業終了
コンパイルして実行して下さい。Webブラウザを上げてURLに、”esp32.local”と入力して下さい。こんな画面になると思います。
ちなみにこのページのソースは、
ボタンを押したら、”1”または”2”が送信されるHTMLです。
Webの”PLAY”ボタンをクリックして下さい。ラジオの再生が開始されます。”STOP”ボタンを押すと再生が停止します。ちょっと感動。
次回は、ボリュームの変更について説明します。