sagar saini
Published © GPL3+

PT2315 WiFi Server Digital Signal Processor

Control BASS, TREBLE, MID and VOLUME with a lot of equalizer modes, all in a small PCB with WIFI, include PCB and code.

IntermediateFull instructions provided2 hours11
PT2315 WiFi Server Digital Signal Processor

Things used in this project

Hardware components

ESP8266 ESP-12E
Espressif ESP8266 ESP-12E
×1

Software apps and online services

Arduino IDE
Arduino IDE
NextPCB

Story

Read more

Custom parts and enclosures

GERBER

BOM

Schematics

Circuit diagram

Code

Arduino Code PT2315

Arduino
#include <Wire.h>
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>  // Include WiFiManager library

#define PT2315_address 0x40
#define EEPROM_SIZE 10

ESP8266WebServer server(80);

int volume = 10;
int att_l = 0;
int att_r = 0;
int bass = 0;
int treble = 0;
bool loudness = true;
bool mute_state = false;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  EEPROM.begin(EEPROM_SIZE);

  // Setup WiFi using WiFiManager
  WiFiManager wm;
  if (!wm.autoConnect("AudioConfigAP", "12345678")) {
    Serial.println("Failed to connect, restarting...");
    delay(3000);
    ESP.restart();
  }
  Serial.println("WiFi connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  volume = EEPROM.read(0);
  att_l = EEPROM.read(1);
  att_r = EEPROM.read(2);
  bass = EEPROM.read(3) - 7;
  treble = EEPROM.read(4) - 7;
  loudness = EEPROM.read(5);
  mute_state = EEPROM.read(6);

  applySettings();
  setupWebServer();
}

void loop() {
  server.handleClient();
}

void applySettings() {
  set_volume(volume);
  set_att_l(att_l);
  set_att_r(att_r);
  setBass(bass);
  setTreble(treble);
  set_loudness(loudness);
  set_mute(mute_state);
}

void saveSettings() {
  EEPROM.write(0, volume);
  EEPROM.write(1, att_l);
  EEPROM.write(2, att_r);
  EEPROM.write(3, bass + 7);
  EEPROM.write(4, treble + 7);
  EEPROM.write(5, loudness);
  EEPROM.write(6, mute_state);
  EEPROM.commit();
}

void setupWebServer() {
  server.on("/", HTTP_GET, []() {
    String html = "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.5'>"
      "<style>body{font-family:sans-serif;margin:0;display:flex;justify-content:center;align-items:center;height:100vh;}"
      ".container{text-align:center;} input[type=range]{width:135%;} .slider-group{margin:25px 0;} .value{font-weight:bold;margin-right:10px;}"
      "button{margin:10px;}</style></head><body>"
      "<div class='container'>"
      "<h2>PT2315 Audio Controller</h2>"
      "<div class='slider-group'><span class='value'>Volume: <span id='v0'>" + String(volume) + "</span></span><br><input type='range' min='0' max='63' value='" + String(volume) + "' onchange='send(this,0)'></div>"
      "<div class='slider-group'><span class='value'>Att Left: <span id='v1'>" + String(att_l) + "</span></span><br><input type='range' min='0' max='31' value='" + String(att_l) + "' onchange='send(this,1)'></div>"
      "<div class='slider-group'><span class='value'>Att Right: <span id='v2'>" + String(att_r) + "</span></span><br><input type='range' min='0' max='31' value='" + String(att_r) + "' onchange='send(this,2)'></div>"
      "<div class='slider-group'><span class='value'>Bass: <span id='v3'>" + String(bass) + "</span></span><br><input type='range' min='-7' max='7' value='" + String(bass) + "' onchange='send(this,3)'></div>"
      "<div class='slider-group'><span class='value'>Treble: <span id='v4'>" + String(treble) + "</span></span><br><input type='range' min='-7' max='7' value='" + String(treble) + "' onchange='send(this,4)'></div>"
      "<div class='slider-group'><button onclick='sendButton(5)'>Toggle Loudness</button> <span id='v5'>" + (loudness ? "ON" : "OFF") + "</span></div>"
      "<div class='slider-group'><button onclick='sendButton(6)'>Toggle Mute</button> <span id='v6'>" + (mute_state ? "ON" : "OFF") + "</span></div>"
      "<h3>Equalizer Presets</h3>"
      "<div class='slider-group'>"
      "<button onclick='eqMode(0)'>Vocal</button> <button onclick='eqMode(1)'>Bass</button> <button onclick='eqMode(2)'>Pop</button>"
      "<button onclick='eqMode(3)'>Rock</button> <button onclick='eqMode(4)'>Dance</button>"
      "</div>"
      "</div>"
      "<script>function send(el,i){fetch('/set?i='+i+'&v='+el.value);document.getElementById('v'+i).innerText=el.value;}"
      "function sendButton(i){fetch('/set?i='+i).then(()=>{let e=document.getElementById('v'+i);e.innerText=e.innerText=='ON'?'OFF':'ON';});}"
      "function eqMode(m){fetch('/eq?m='+m).then(()=>location.reload());}</script></body></html>";
    server.send(200, "text/html", html);
  });

  server.on("/set", HTTP_GET, []() {
    if (server.hasArg("i")) {
      int i = server.arg("i").toInt();
      int val = server.hasArg("v") ? server.arg("v").toInt() : -1;

      switch(i) {
        case 0: volume = val; set_volume(volume); break;
        case 1: att_l = val; set_att_l(att_l); break;
        case 2: att_r = val; set_att_r(att_r); break;
        case 3: bass = val; setBass(bass); break;
        case 4: treble = val; setTreble(treble); break;
        case 5: loudness = !loudness; set_loudness(loudness); break;
        case 6: mute_state = !mute_state; set_mute(mute_state); break;
      }
      saveSettings();
    }
    server.send(204, "text/plain", "");
  });

  server.on("/eq", HTTP_GET, []() {
    if (server.hasArg("m")) {
      int mode = server.arg("m").toInt();
      switch(mode) {
        case 0: bass = 0; treble = +4; break;           // Vocal
        case 1: bass = +6; treble = -2; break;          // Bass
        case 2: bass = +2; treble = +3; break;          // Pop
        case 3: bass = +4; treble = +4; break;          // Rock
        case 4: bass = +5; treble = +5; break;          // Dance
      }
      setBass(bass);
      setTreble(treble);
      saveSettings();
    }
    server.send(204, "text/plain", "");
  });

  server.begin();
}

void set_volume(int vol) {
  vol = constrain(vol, 0, 63);
  writeWire(vol);
}

void set_att_l(int att_l) {
  att_l = constrain(att_l, 0, 31);
  writeWire(0b10000000 + att_l);
}

void set_att_r(int att_r) {
  att_r = constrain(att_r, 0, 31);
  writeWire(0b10100000 + att_r);
}

void set_loudness(bool loud) {
  writeWire(0b01000000 + (loud << 2));
}

void setBass(int bass) {
  bass = constrain(bass, -7, 7);
  const byte bass_table[15] = {
    0b01100000, 0b01100001, 0b01100010, 0b01100011,
    0b01100100, 0b01100101, 0b01100110, 0b01100111,
    0b01101110, 0b01101101, 0b01101100, 0b01101011,
    0b01101010, 0b01101001, 0b01101000
  };
  writeWire(bass_table[bass + 7]);
}

void setTreble(int treb) {
  treb = constrain(treb, -7, 7);
  const byte treb_table[15] = {
    0b01110000, 0b01110001, 0b01110010, 0b01110011,
    0b01110100, 0b01110101, 0b01110110, 0b01111111,
    0b01111110, 0b01111101, 0b01111100, 0b01111011,
    0b01111010, 0b01111001, 0b01111000
  };
  writeWire(treb_table[treb + 7]);
}

void set_mute(bool mute) {
  if (mute) {
    set_volume(63);
  } else {
    set_volume(volume);
  }
}

void writeWire(byte a) {
  Wire.beginTransmission(PT2315_address);
  Wire.write(a);
  Wire.endTransmission();
}

Credits

sagar saini
88 projects • 98 followers
I am Sagar Saini an electronic hardware enthusiast

Comments