WebRadio w/I2S -04 . WebServerの実装

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”ボタンを押すと再生が停止します。ちょっと感動。

次回は、ボリュームの変更について説明します。