26

Re: ESP32 + PCM5102A Интернет радио

При компиляции посмотрите сколько места осталось, добавьте новую станцию, снова посмотрите сколько осталось места, так Вы поймете примерное количество станций.

Но я думаю несколько сотен влезет.

27

Re: ESP32 + PCM5102A Интернет радио

Понял

28 (2022-03-15 22:45:12 отредактировано samand587)

Re: ESP32 + PCM5102A Интернет радио

Привет! Вот повторил. Отличный проект!http://forum.rcl-radio.ru/uploads/images/2022/03/7688ad40ad30ca127f10eb8096a5e6a9.jpg

29 (2022-03-16 10:32:23 отредактировано samand587)

Re: ESP32 + PCM5102A Интернет радио

А крякообразы в названиях станций на русском языке это проблема поддержки языка дисплеем? Или как то это можно побороть?

30

Re: ESP32 + PCM5102A Интернет радио

Я не вижу решение этой проблемы, без использования русифицированного дисплея.

31

Re: ESP32 + PCM5102A Интернет радио

Почему при переключении проскакивают каналы?

32

Re: ESP32 + PCM5102A Интернет радио

Добавьте паузу при нажатии кнопок:
if (digitalRead(13)==LOW){ct++;if(ct>CH-1){ct=0;}w=1;times1=millis();w1=1;ch="connection      ";lcd.setCursor(0,0);lcd.print(ch);menu=0;e_ct=1;delay(300);}
if (digitalRead(12)==LOW){ct--;if(ct<0){ct=CH-1;}w=1;times1=millis();w1=1;ch="connection      ";lcd.setCursor(0,0);lcd.print(ch);menu=0;e_ct=1;Serial.println(ct);delay(300);}

33

Re: ESP32 + PCM5102A Интернет радио

liman324 пишет:

Добавьте паузу...

Спасибо, отлично!

34

Re: ESP32 + PCM5102A Интернет радио

Возможно ли добавить еще одну точку доступа , что бы можно было подключиться к ней в не дома ?

35

Re: ESP32 + PCM5102A Интернет радио

А в ответ тишина . Жаль , что проект не развивается . Очередной одноразовый проект .

36

Re: ESP32 + PCM5102A Интернет радио

Возможно ли добавить еще одну точку доступа , что бы можно было подключиться к ней в не дома ?

Проект не предусматривает веб страницы, в чем необходимость управления радио удаленно?

37

Re: ESP32 + PCM5102A Интернет радио

Я имею ввиду , что бы прописать с скетче имя и пароль двух разных устройств . Одна домашняя , роутер . А вторая например смартфон , что бы слушать на природе . Не хочется тулить одинаковые имя и пароль на разных устройствах .

38

Re: ESP32 + PCM5102A Интернет радио

Можно сделать без точки доступа, например при включении зажать кнопку энкодера, при этом будут применены имя пароль для смартфона, а если не нажимать то для домашней сети.

39

Re: ESP32 + PCM5102A Интернет радио

liman324 пишет:

Можно сделать без точки доступа, например при включении зажать кнопку энкодера, при этом будут применены имя пароль для смартфона, а если не нажимать то для домашней сети.

А для этого скетч править нужно или и так сработает ? Эта идея мне нравится . А вообще отличный приемник получился . Все можно отрегулировать и без веб интерфейса . Один минус , это добавлять станции . Нужно перепрошивать . Но если сделать обновление прошивки по воздуху (ОТА) , то будет вообще бомба .

40

Re: ESP32 + PCM5102A Интернет радио

Вам нужно заменить весь блок setup:

void setup() {
  ESP32Encoder::useInternalWeakPullResistors=UP;
  encoder.attachHalfQuad(DT, CLK);
  encoder.setCount(0);
  Serial.begin(9600);
  pinMode(SW,INPUT);          // ENCODER SW 
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);

  if (digitalRead(SW)==LOW){WiFi.begin("login1", "password1");}
  else{WiFi.begin("login2", "password2");}

  lcd.init();lcd.backlight();
  lcd.setCursor(0,0);lcd.print("  ESP32  RADIO   ");
  lcd.setCursor(0,1);lcd.print("    PCM5102A     ");
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  lcd.clear();
  lcd.setCursor(0,0);lcd.print("IP:");lcd.print(WiFi.localIP());
  delay(2000);
  lcd.clear();
  EEPROM.begin(10);
  vol = EEPROM.read(0);
  ball = EEPROM.read(1)-16;
  bass = EEPROM.read(2)-40;
  mid = EEPROM.read(3)-40;
  treb = EEPROM.read(4)-40;
  ct = EEPROM.read(5);
  if(vol>21){vol=0;}
  if(ball>16){ball=0;}
  if(bass>16){bass=0;}
  if(mid>16){mid=0;}
  if(treb>16){treb=0;}
  if(ct>CH-1){ct=0;}
  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  delay(2000);
  audio.setBalance(ball);//+-16
  audio.setVolume(vol); // 0...21
  audio.setTone(0,0,0);//-40+16
  pinMode(CH_UP, INPUT_PULLUP);
  pinMode(CH_DOWN, INPUT_PULLUP);
}

в этих строках пропишите логины и пароли
  if (digitalRead(SW)==LOW){WiFi.begin("login1", "password1");}
  else{WiFi.begin("login2", "password2");}

Нажмете кнопку энкодера при подачи питания сработает первый логин и пароль, после надписи на экране
ESP32  RADIO 
PCM5102A
кнопку можно отпустить


Но если сделать обновление прошивки по воздуху (ОТА) , то будет вообще бомба .

Есть статья - http://rcl-radio.ru/?p=92610

41

Re: ESP32 + PCM5102A Интернет радио

Ок . Большое спасибо . Домой доберусь , попробую перепрошить .

42

Re: ESP32 + PCM5102A Интернет радио

А здесь править надо что ни будь ?
  String ssid =     "";     // ssid сети WI-FI
  String password = "";     // пароль от сети WI-FI

43

Re: ESP32 + PCM5102A Интернет радио

нет, эти строки сейчас неактивны их можно удалить

44

Re: ESP32 + PCM5102A Интернет радио

Ок. Понял .

45

Re: ESP32 + PCM5102A Интернет радио

Попробовал я обновление по ОТА . Один раз обновляет и все , в следующий раз этот трюк больше не проходит . Может еще в скетче радио нужно какие строки добавлять ?
Попробовал 2 версию радио на олед , дисплей 0.96" работает , попробовал подключить дисплей 1.3 " тоже ssd1306 , уже не работает .

46

Re: ESP32 + PCM5102A Интернет радио

Подождите 1-2 дня я работаю над проектом, делаю чтение адресов каналов из файла.
Вы просто на форуме сохраняете простой текстовый файл с расширением html, где указываете через запятую адреса станций, в скетче просто указываете путь на этот файл и все. Меняете данный файла который находится на форуме, меняются адреса каналов в Вашем радио.

47

Re: ESP32 + PCM5102A Интернет радио

Подожду . Спасибо большое за помощь .

48

Re: ESP32 + PCM5102A Интернет радио

Просьба протестировать скетч с дисплеем 0,96 OLED

Перейдите на страницу

http://forum.rcl-radio.ru/internet_radio_esp32.php

http://forum.rcl-radio.ru/uploads/images/2022/04/bdee2b8fcb4d14ef6ec7f3acc480a0e7.png

Придумайте уникальное название Вашего файла, далее укажите список 10 станций, запишите файл, проверьте чтение файла.

В скетче поменяйте строку:

const String endpoint = "http://forum.rcl-radio.ru/internet_radio_esp32/data.html"; // это путь к Вашему уникальному файлу

загрузите новый скетч для 10 станций:

#include "Arduino.h"
#include "WiFi.h"
#include "Audio.h"             // https://github.com/schreibfaul1/ESP32-audioI2S.git
#include <Wire.h> 
#include <SSD1306.h>           // https://github.com/LilyGO/ESP32-OLED0.96-ssd1306.git
#include <ESP32Encoder.h>      // https://github.com/madhephaestus/ESP32Encoder.git
#include <EEPROM.h>
#include <HTTPClient.h>

#define I2S_DOUT      25  // DIN connection
#define I2S_BCLK      27  // Bit clock
#define I2S_LRC       26  // Left Right Clock
#define CLK           18  // CLK ENCODER
#define DT            19  // DT ENCODER
#define SW             5  // SW ENCODER  
#define CH_UP         13  // CH_UP BUTTON 
#define CH_DOWN       12  // CH_DOWN BUTTON    

 
#define CH            10  // кол-во станций
const String endpoint = "http://forum.rcl-radio.ru/internet_radio_esp32/data.html";

 
  Audio audio;
  SSD1306  display(0x3c, 21, 22);
  ESP32Encoder encoder;
  String ssid =     "Redmi Note 3";     // ssid сети WI-FI
  String password = "32481975";     // пароль от сети WI-FI
  
  String payload;
  
  String ch = "connection      ";
  String bitr;
  String url;
  unsigned long oldPosition  = -999,newPosition,times1,times_ch;
  bool w=1,w1,ball_1,bass_1,mid_1,treb_1,vol_1;
  int ct,old_ct = 1,menu,ball,bass,mid,treb,vol=15;
  bool e_vol,e_ball,e_bass,e_mid,e_treb,e_ct;
  int i_ch,t_ch,tic_ch;
  const char *listch[CH];
  String xval[CH];
  
 
void setup() {
  ESP32Encoder::useInternalWeakPullResistors=UP;
  encoder.attachHalfQuad(DT, CLK);
  encoder.setCount(0);
  Serial.begin(9600);
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid.c_str(), password.c_str());
  Wire.begin();Wire.setClock(400000L);
  display.init();
  display.flipScreenVertically();
  display.setContrast(100);
  display.clear();
  display.setFont(ArialMT_Plain_10);
  display.drawString(0, 10, "ESP32  RADIO");
  display.drawString(0, 25, "PCM5102A");
  display.display();
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  display.drawString(0, 40, "IP:" + WiFi.localIP().toString());
  display.display();
  delay(2000);
  EEPROM.begin(10);
  vol = EEPROM.read(0);
  ball = EEPROM.read(1)-16;
  bass = EEPROM.read(2)-40;
  mid = EEPROM.read(3)-40;
  treb = EEPROM.read(4)-40;
  ct = EEPROM.read(5);
  if(vol>21){vol=0;}
  if(ball>16){ball=0;}
  if(bass>16){bass=0;}
  if(mid>16){mid=0;}
  if(treb>16){treb=0;}
  if(ct>CH-1){ct=0;}
  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  delay(2000);
  display.clear();
  display.display();
  audio.setBalance(ball);//+-16
  audio.setVolume(vol); // 0...21
  audio.setTone(0,0,0);//-40+16
  pinMode(CH_UP, INPUT_PULLUP);
  pinMode(CH_DOWN, INPUT_PULLUP);
  pinMode(SW,INPUT);          // ENCODER SW 

  HTTPClient http;
  http.begin(endpoint);
  int httpCode = http.GET();
  if (httpCode > 0) {payload = http.getString();}
  http.end();  

  for(int kol_i=0;kol_i<CH;kol_i++){
  xval[kol_i] = getValue(payload, ',', kol_i);
  Serial.println(xval[kol_i]);
  }
  Serial.println();
  for(int kol_i=0;kol_i<CH;kol_i++){
  listch[kol_i] = xval[kol_i].c_str();
  }
}

String getValue(String data1, char separator, int index){
    int found = 0;
    int strIndex[] = { 0, -1 };
    int maxIndex = data1.length() - 1;
    for (int i = 0; i <= maxIndex && found <= index; i++) {
        if (data1.charAt(i) == separator || i == maxIndex) {
            found++;
            strIndex[0] = strIndex[1] + 1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }}
    return found > index ? data1.substring(strIndex[0], strIndex[1]) : "";
}
 
void loop(){   
   newPosition = encoder.getCount()/2;
 
//// ENCODER VOLUME ////////////////////////////////////////////// 
 if(menu==0){ 
 if(newPosition != oldPosition){oldPosition = newPosition;vol=vol-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(vol>21){vol=21;}if(vol<0){vol=0;}audio.setVolume(vol);vol_1=1;e_vol=1;times_ch=millis();}
    if(vol_1==1){vol_1=0;display.setFont(ArialMT_Plain_16);
    display.setColor(BLACK);display.fillRect(0, 40, 128, 19);display.setColor(WHITE);
    display.drawString(0, 40, "Volume " + String(vol) + " ");display.display();
    }}
///// ENCODER BALANCE ////////////////////////////////////////////
 if(menu==1){ 
 if(newPosition != oldPosition){oldPosition = newPosition;ball=ball-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(ball>16){ball=16;}if(ball<-16){ball=-16;}audio.setBalance(ball);ball_1=1;e_ball=1;times_ch=millis();}
    if(ball_1==1){ball_1=0;display.setFont(ArialMT_Plain_16);
    display.setColor(BLACK);display.fillRect(0, 40, 128, 19);display.setColor(WHITE);
    display.drawString(0, 40, "Balance " + String(ball) + " dB ");display.display();
    }}   
///// ENCODER BASS ////////////////////////////////////////////
 if(menu==2){ 
 if(newPosition != oldPosition){oldPosition = newPosition;bass=bass-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(bass>16){bass=16;}if(bass<-40){bass=-40;}audio.setTone(bass,mid,treb);bass_1=1;e_bass=1;times_ch=millis();}
    if(bass_1==1){bass_1=0;display.setFont(ArialMT_Plain_16);
    display.setColor(BLACK);display.fillRect(0, 40, 128, 19);display.setColor(WHITE);
    display.drawString(0, 40, "Bass " + String(bass) + " dB ");display.display();
    }}
///// ENCODER MIDDLE ////////////////////////////////////////////
 if(menu==3){ 
 if(newPosition != oldPosition){oldPosition = newPosition;mid=mid-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(mid>16){mid=16;}if(mid<-40){mid=-40;}audio.setTone(bass,mid,treb);mid_1=1;e_mid=1;times_ch=millis();}
    if(mid_1==1){mid_1=0;display.setFont(ArialMT_Plain_16);
    display.setColor(BLACK);display.fillRect(0, 40, 128, 19);display.setColor(WHITE);
    display.drawString(0, 40, "Middle " + String(mid) + " dB ");display.display();
    }}      
///// ENCODER TREBLE ////////////////////////////////////////////
 if(menu==4){ 
 if(newPosition != oldPosition){oldPosition = newPosition;treb=treb-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(treb>16){treb=16;}if(treb<-40){treb=-40;}audio.setTone(bass,mid,treb);treb_1=1;e_treb=1;times_ch=millis();}
    if(treb_1==1){treb_1=0;display.setFont(ArialMT_Plain_16);
    display.setColor(BLACK);display.fillRect(0, 40, 128, 19);display.setColor(WHITE);
    display.drawString(0, 40, "Treble " + String(treb) + " dB ");display.display();
    }}   
 
//// BUTTON //////////////////////////////////////////////   
 if (digitalRead(13)==LOW){ct++;if(ct>CH-1){ct=0;}w=1;times1=millis();w1=1;ch="connection      ";
 delay(300);w=1;w1=1;times_ch=millis();display.clear();menu=0;vol_1=1;e_ct=1;Serial.println(ct);}
 
 if (digitalRead(12)==LOW){ct--;if(ct<0){ct=CH-1;}w=1;times1=millis();w1=1;ch="connection      ";
 delay(300);w=1;w1=1;times_ch=millis();display.clear();menu=0;vol_1=1;e_ct=1;Serial.println(ct);}
 
 if (digitalRead(5)==LOW){menu++;if(menu>4){menu=0;}times1=millis();w=1;w1=1;display.clear();vol_1=1;ball_1=1;bass_1=1;mid_1=1;treb_1=1;if(menu==0){w=1;}delay(300);}
////////////////////////////////////////////////////////// 
 if (ct != old_ct) {ch!="connection      ";audio.connecttohost(listch[ct]);Serial.println(ct);old_ct = ct;w=1;}
 
  if(w==1&&ch!="connection      "){
  w=0;
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 20, "CH" + String(ct));
  display.drawString(40,20, String(bitr.toInt()/1000) + "k");
  display.display();
  }
 
  if(millis()-times_ch>500){
    display.setColor(BLACK);
    display.fillRect(0, 0, 128, 19);
    display.setColor(WHITE);
    times_ch=millis();
    int n_ch = ch.length();
    String s1 = ch.substring(i_ch,n_ch);
    display.setFont(ArialMT_Plain_16);
    display.drawString(0, 0, s1);
    display.display();
    tic_ch++;if(tic_ch>n_ch+5){tic_ch=0;}
    if(tic_ch>4){i_ch++;}if(i_ch>n_ch){i_ch=0;}
  }
 
  audio.loop();
 
//// EEPROM ///////////////////////////////////
  if(millis()-times1>5000&&w1==1){
  if(e_vol==1){e_vol=0;EEPROM.write(0,vol);}
  if(e_ball==1){e_ball=0;EEPROM.write(1,ball+16);}
  if(e_bass==1){e_bass=0;EEPROM.write(2,bass+40);}
  if(e_mid==1){e_mid=0;EEPROM.write(3,mid+40);}
  if(e_treb==1){e_treb=0;EEPROM.write(4,treb+40);}
  if(e_ct==1){e_ct=0;EEPROM.write(5,ct);}
  EEPROM.commit();}
  if(millis()-times1>10000&&w1==1){
  w1=0;if(menu!=0){w=1;menu=0;}}
 
} // loop
 
void audio_showstation(const char *info) {Serial.print("station     "); ch=info; Serial.println(info);}
void audio_showstreamtitle(const char *info) {Serial.print("streamtitle ");url=info; Serial.println(info);}
void audio_bitrate(const char *info) {Serial.print("bitrate     ");bitr = info; Serial.println(info);}
void audio_icyurl(const char *info) {Serial.print("icyurl      ");Serial.println(info);}
void audio_lasthost(const char *info) {Serial.print("lasthost    "); Serial.println(info);}

49 (2022-04-02 18:29:34 отредактировано folks)

Re: ESP32 + PCM5102A Интернет радио

Проверил . Работает . А кнопка прочитать для чего ? Просто копируются станции из верхнего окна .

50

Re: ESP32 + PCM5102A Интернет радио

Большое спасибо, буду публиковать изменения и дорабатывать с lcd1602