<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ESP32 + MAX98357A+喇叭+SSD OLED1306

      模塊引腳接線說明
      ESP32GPIO22→ MAX98357A DIN
      ESP32GPIO26→ MAX98357A BCLK
      ESP32GPIO25→ MAX98357A LRC(或 WS)
      ESP325V→ MAX98357A VIN(推薦使用 5V)
      ESP32GND→ MAX98357A GND
      MAX98357AOUT+→ 喇叭正極
      MAX98357AOUT?→ 喇叭負極
      你的項目/

      ├── data/

      │ └── music.mp3

      ├── src/

      │ └── main.cpp

      ├── platformio.ini

      #include <Arduino.h>
      #include <SPIFFS.h>
      #include <Audio.h>
      #include <WiFi.h>
      
      // WiFi 信息
      const char* ssid = "Y0ur_SSID";
      const char* password = "Y0ur_pass";
      
      // I2S 引腳定義
      #define I2S_DOUT  22
      #define I2S_BCLK  26
      #define I2S_LRC   25
      
      Audio audio;
      
      void setup() {
        Serial.begin(115200);
        delay(1000);
      
        // 連接 WiFi
        WiFi.begin(ssid, password);
        Serial.print("Connecting to WiFi");
        while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          Serial.print(".");
        }
        Serial.println("\nWiFi connected!");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
      
        // 初始化 SPIFFS(可選,如果不再用可以注釋)
        // if (!SPIFFS.begin(true)) {
        //   Serial.println("SPIFFS 掛載失敗!");
        //   return;
        // }
      
        // 初始化音頻(使用 I2S 輸出)
        audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
        audio.setVolume(10); // 0~21
      
        // 播放公網 MP3
        audio.connecttohost("http://www.taotao01.fun/music.mp3");
      }
      
      void loop() {
        audio.loop(); // 必須放 loop 中不斷調用
      }
      

      pio run --target uploadfs #上傳文件

      進階版V2

      元件ESP32 引腳說明
      MAX98357A DOUT(DIN)GPIO 22音頻數據(I2S DATA)
      MAX98357A BCLKGPIO 26I2S 時鐘
      MAX98357A LRC(WS)GPIO 25I2S 左右聲道同步
      OLED SDAGPIO 21I2C 數據
      OLED SCLGPIO 22I2C 時鐘(共用沒問題)
      按鈕 1GPIO 34播放/暫停(輸入,僅支持輸入)
      按鈕 2GPIO 35下一首(輸入,僅支持輸入)
      點擊查看代碼
      #include <Arduino.h>
      #include <WiFi.h>
      #include <HTTPClient.h>
      #include <Audio.h>
      #include <Wire.h>
      #include <ArduinoJson.h>
      #include <Adafruit_GFX.h>
      #include <Adafruit_SSD1306.h>
      
      // ==== 配置 ==== //
      const char* ssid = "Y0ur_SSID";
      const char* password = "Y0ur_pass";
      const char* music_api = "http://www.expamle.com/get_music_list.php";
      
      // OLED 設置
      #define SCREEN_WIDTH 128
      #define SCREEN_HEIGHT 64
      Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
      
      // 按鈕引腳
      #define BUTTON_PLAY 34
      #define BUTTON_NEXT 35
      
      // I2S 引腳
      #define I2S_DOUT 25
      #define I2S_BCLK 26
      #define I2S_LRC  27
      
      Audio audio;
      bool isPlaying = false;
      
      // 音樂信息結構體
      struct MusicItem {
        String url;
        String title;
      };
      
      // ========== 獲取音樂 JSON ==========
      MusicItem fetchMusicURL() {
        MusicItem result;
        HTTPClient http;
        http.begin(music_api);
        int httpCode = http.GET();
      
        if (httpCode == 200) {
          String payload = http.getString();
          http.end();
      
          StaticJsonDocument<1024> doc;
          DeserializationError error = deserializeJson(doc, payload);
          if (!error && doc.is<JsonArray>()) {
            JsonObject obj = doc[0];
            result.url = obj["url"].as<String>();
            result.title = obj["title"].as<String>();
          }
        } else {
          http.end();
        }
      
        return result;
      }
      
      // ========== OLED 顯示函數 ==========
      void showStatus(const String& line1, const String& line2 = "") {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 10);
        display.println(line1);
        display.println(line2);
        display.display();
      }
      
      // ========== 播放下一首 ==========
      void playNext() {
        showStatus("Loading...");
        MusicItem item = fetchMusicURL();
        if (item.url != "") {
          showStatus("Playing", item.title);
          audio.connecttohost(item.url.c_str());
          isPlaying = true;
        } else {
          showStatus("Failed to load");
        }
      }
      
      // ========== 初始化 ==========
      void setup() {
        Serial.begin(115200);
        pinMode(BUTTON_PLAY, INPUT_PULLUP);
        pinMode(BUTTON_NEXT, INPUT_PULLUP);
      
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          Serial.print(".");
        }
        Serial.println("\nWiFi connected!");
      
        if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
          Serial.println("SSD1306 init failed");
          while (true);
        }
        showStatus("WiFi Connected", WiFi.localIP().toString());
      
        audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
        audio.setVolume(10);
      
        playNext();
      }
      
      // ========== 主循環 ==========
      unsigned long lastPlayNextTime = 0;
      
      void loop() {
        static bool lastPlayState = HIGH;
        static bool lastNextState = HIGH;
      
        // 播放/暫停
        bool currentPlay = digitalRead(BUTTON_PLAY);
        if (currentPlay == LOW && lastPlayState == HIGH) {
          if (isPlaying) {
            audio.stopSong();
            showStatus("Paused");
            isPlaying = false;
          } else {
            playNext();
          }
        }
        lastPlayState = currentPlay;
      
        // 下一首
        bool currentNext = digitalRead(BUTTON_NEXT);
        if (currentNext == LOW && lastNextState == HIGH) {
          playNext();
        }
        lastNextState = currentNext;
      
        // ? 播放完成 -> 自動下一首(加延時防抖)
        if (!audio.isRunning() && isPlaying) {
          unsigned long now = millis();
          if (now - lastPlayNextTime > 3000) {  // 至少間隔3秒
            playNext();
            lastPlayNextTime = now;
          }
        }
      
        audio.loop();
        delay(50);
      }
      
      來聽聽響~ 如有雷同 ,請告知
      posted @ 2025-08-11 21:54  huh&uh  閱讀(127)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 4480yy亚洲午夜私人影院剧情| 亚洲国产天堂久久综合226114| 亚洲精品成人综合色在线| 午夜av福利一区二区三区| 免费看国产精品3a黄的视频| 亚洲国产精品线观看不卡| 偷拍一区二区三区在线视频| 免费可以在线看a∨网站| 亚洲精品中文字幕码专区| 美乳丰满人妻无码视频| 蜜臀av色欲a片无码精品一区| 久久三级国内外久久三级| 亚洲中文字幕成人综合网| A级毛片100部免费看| 亚洲成年av天堂动漫网站| 日韩乱码人妻无码中文字幕视频 | 欧美xxxx做受欧美.88| 无码一区二区三区av在线播放 | 亚洲男人的天堂一区二区| 福利一区二区在线观看| 国精产品一区一区三区有限公司杨| 熟女亚洲综合精品伊人久久| 亚洲精品一区二区三区四区乱码| 国产国产人免费人成免费| 少妇扒开双腿自慰出白浆| 亚洲熟妇乱色一区二区三区| 亚洲免费成人av一区| 麻豆国产传媒精品视频| 国产高清自产拍av在线| 精品黑人一区二区三区| 综合激情网一区二区三区| 亚洲欧美自偷自拍视频图片| 一本精品99久久精品77| 亚洲欧美日韩久久一区二区| 四虎在线播放亚洲成人| 国产成人久久777777| 乱人伦人妻中文字幕在线| 国产三级视频网站| 亚洲人成人一区二区三区| 国产精品午夜爆乳美女视频| 国产一区二区三区粉嫩av|