WI-FI интернет радио.

10427 ответов [Последнее сообщение]
pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Duke пишет:

А кто пробовал edzelf ESP32 radio кириллизировать? Там, вроде, код открытый. Может, где-то тут уже проскакивало, но довольно тяжело найти в тутошней куче инфы... 

Вот и попробуйте! А мы воспользуемся.

Для начала просто заставку на русском отобразите - а с тэгами поможем

Duke
Offline
Зарегистрирован: 15.02.2017

В edzelf никаких заставок нет. Была бы возможность, наверное, бы не спрашивал, зачем же поучать что кому делать?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Duke пишет:

В edzelf никаких заставок нет. Была бы возможность, наверное, бы не спрашивал, зачем же поучать что кому делать?

Ну раз нет - добавьте. Я не поучаю, но предлагаю поучаствовать.

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

Realarty
Offline
Зарегистрирован: 25.03.2018

Вопрос к спецам по edzelf ESP32 radio. Временами при включении начинает первой работать радио не по умолчанию и громкость звука  меняется. В ведморде показывает автозапуск радио то 04 то 06 хотя должно 00. Несколько раз уже редактировал. Что это сбой при отключении (отключается с пульта вместе с комп.колонками) или типа запоминает последние данные (но не так как надо)?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

to kombatus

поменяйте функцию serial() на

////////////////////////////////////////
// receive the esp8266 stream
void serial()
{
  char temp;
  // when characters arrive over the serial port...
  if (Serial.available())
  {
    // wait a bit for the entire message to arrive
    delay(100);
    // read all the available characters
    while (Serial.available() > 0)
    {
      temp = Serial.read(); // переменная для чтения сериал порта
      switch (temp)
      {
        case '\n' : if (_index == 0) break;
        case '\r' :
          line[_index] = 0; // end of string
          _index = 0;
          Serial.println("Start parse");
          parse(line);
          break;
        default : // put the received char in line
          if (_index > BUFLEN - 1) break; // small memory so small buffer
          line[_index++] = temp;
      }
    }
  }
}

потом в строке монитора забейте Station Ip: 192.168.1.15 (или ip вашей карадивы)

потом ##CLI.ICY0#: personal station #123456

отпишитесь по результатам

 

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

Заменить в тексте автора?

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

Заменить в тексте автора?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Ну а где же еще?

ShAlex13
Offline
Зарегистрирован: 19.01.2018

pkmuum пишет:

Сделал что-то типа видеоинструкции по сборке, возможно видео поможет новичкам, обобщил некоторую полезную информацию полученную на форуме. (Извинятйте если, что назвал не по научному)

ссылка на видео: https://youtu.be/cZStT-QnCRU

Включи возможность оставлять комментарии.

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Realarty пишет:

Вопрос к спецам по edzelf ESP32 radio. Временами при включении начинает первой работать радио не по умолчанию и громкость звука  меняется. В ведморде показывает автозапуск радио то 04 то 06 хотя должно 00. Несколько раз уже редактировал. Что это сбой при отключении (отключается с пульта вместе с комп.колонками) или типа запоминает последние данные (но не так как надо)?

Вы у Эда (зельфа) напрямую спросите, на гитхабе он активно отвечает (по аглицки правда)

ShAlex13
Offline
Зарегистрирован: 19.01.2018

ShAlex13 пишет:

pilnikov пишет:

Что выдает?

Ничего

Запустился индикатор, соединял на макетке вот такими шнурками https://ru.aliexpress.com/item/Dupont-line-120pcs-10cm-male-to-male-male-to-female-and-female-to-female-jumper-wire/32352232311.html?spm=2114.13010708.0.0.eG1OeK

Не шнурки, а полноге г....о, некоторые даже обжаты только поверх изоляции...пипец

Припаял без макетки нормальными проводами, все показывает...

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Импортозамещение и УралКабель - наше все!!!! ;)

nadim
Offline
Зарегистрирован: 04.11.2017

KaRadio32 Подскажите как прикрутить такой пульт - некоторые кнопки срабатывают.

Я так понимаю нужно делать изменения в файле addon.c

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

правильно понимаете

в 

void irLoop() {
// IR
	event_ir_t evt;
	while (xQueueReceive(event_ir, &evt, 0)) {
		wakeLcd();
		uint32_t evtir = ((evt.addr) << 8) | (evt.cmd & 0xFF);
		ESP_LOGI(TAG,
				"IR event: Channel: %x, ADDR: %x, CMD: %x = %X, REPEAT: %d",
				evt.channel, evt.addr, evt.cmd, evtir, evt.repeat_flag);
		if (!evt.repeat_flag) // avoid repetition
			switch (evtir) {
			case 0xFF0046:
			case 0xFF18E7:
			case 0xF70812: /*(" FORWARD");*/
				changeStation(+1);
				break;
			case 0xFF0044:

подставляете свой код в case и псе. коды можно взять из ардуино скетча по тесту ик пультов

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

Пока вот что:

nadim
Offline
Зарегистрирован: 04.11.2017

pilnikov пишет:

коды можно взять из ардуино скетча по тесту ик пультов

Спасибо. Может подскажите сылку на этот скетч.

pkmuum
Offline
Зарегистрирован: 25.03.2018

Да вроде коментарии оставлять не запрещал. Я не против конструктивных коментариев.

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

to kombatus скобки посчитайте фигурные открытые и закрытые, я вроде добавлял одну, на скобку наводишь мышку она показывает где вторая. Может где обшибси. контрол + т нажмите для форматирования текста там тоже понятно становится где нету скобки (начало функции должно быть в нулевой колонке) или сворачивание кода (там плюсики появятся)

нашел - после free ram перед void serial () не закрыли ("}")

Я скеч смотрел для 1602 а не для нокии

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

nadim пишет:

Спасибо. Может подскажите сылку на этот скетч.

* Example circuit diagram:
 
kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

 

Вроде все правильно, но пугается и ничего не могу сделать.

C:\Users\Администратор\Desktop\sam\karadio-addons-master\karadio-addons-master\karadioNokia5110\ScrnFuncts.ino: In function 'void setup()':
 
ScrnFuncts:65: error: a function-definition is not allowed here before '{' token
 
ScrnFuncts:257: error: expected '}' at end of input
 
exit status 1
a function-definition is not allowed here before '{' token
pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Весь текст скеча с первой вкладки выложите

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

[code]
/*
  This implementation specific to Arduino Mini-Pro 328 running at 3.3V
  and used with a NOKIA 5110 Craphic LCD.

  Built under Arduino 1.6.10
  Derived from https://create.arduino.cc/projecthub/rayburne/tiny-serial-terminal-151988
*/
#define version 1.0
#include <EEPROM.h>
#include "Defines.h"                // Nokia 5110 LCD pin usage as controlled by "ScrnFuncts.ino"

// constants
const int  BAUD            = 28800;  // any standard serial value: 300 - 115200
const int  EEaddr          = 0;     // EEPROM address for storing WPM
const int  EEaddr1         = 2;     // EEPROM address for LCD address
const int  EEaddrIp        = 10;    // EEPROM address for the IP
// Arduino 328P pins (not physical)

const byte ContrastPin     = 8;     // D8 low activates the Contrast adjustment

// global prog variables

byte nRow;                          // line count      (0-5 for NOKIA LCD)
byte nColumn;                       // character count (0-11 for NOKIA LCD)
byte NOKIAcontrast;                 // LCD initialization contrast values B0 thru BF
char temp;


// Character array pointers
//char  msg[]       = {"Karadio for nokia 84*48 (c) KaraWin  "}; //
//char  BlankLine[]  = {"            "};  // Nokia 12 x 6 (84 * 48)
//   char  anim = {"-\\|/"};


// Karadio specific data
#define BUFLEN  200
char line[BUFLEN]; // receive budder
char station[BUFLEN];
char title[BUFLEN];
char nameset[BUFLEN];
char* ici;
unsigned index = 0;
unsigned iStation = 0;
unsigned iTitle = 0;
unsigned loopcount = 0;
unsigned loopcount1 = 0;
byte loopflip = 0;
char arrow[] = {0x7e};

void setup(void)
{
  char oip[20];
  pinMode(13, OUTPUT);
  pinMode(ContrastPin, INPUT);
  digitalWrite(ContrastPin, HIGH); // activate internal pullup resistor

  //   Serial.begin(BAUD);
  //    Serial.println(F("Karadio display nokia 84 * 48"));
  Serial.println(F("Free RAM available:")) ;
  //  Serial.print(freeRam());

  ////////////////////////////////////////
  // receive the esp8266 stream
  void serial()
  {
    char temp;
    // when characters arrive over the serial port...
    if (Serial.available())
    {
      // wait a bit for the entire message to arrive
      delay(100);
      // read all the available characters
      while (Serial.available() > 0)
      {
        temp = Serial.read(); // переменная для чтения сериал порта
        switch (temp)
        {
          case '\n' : if (_index == 0) break;
          case '\r' :
            line[_index] = 0; // end of string
            _index = 0;
            Serial.println("Start parse");
            parse(line);
            break;
          default : // put the received char in line
            if (_index > BUFLEN - 1) break; // small memory so small buffer
            line[_index++] = temp;
        }
      }
    }
  }




ReStart:  // Come back here if LCD contract is changed
  // Read the EEPROM to determine if display is using a custom contrast value
  NOKIAcontrast = EEPROM.read(EEaddr1);
  // Set the Nokia LCD Contrast to default or reset if EEPROM is corrupt or set to new value
  if (NOKIAcontrast  < 0xB0 || NOKIAcontrast > 0xBF) NOKIAcontrast = 0xB2;
  // LCD
  LcdInitialise();
  LcdClear();
  LcdString(msg);
  eepromReadStr(EEaddrIp, oip);
  displayStr(oip, 4, 2);
  delay(2000);
  if (!digitalRead(ContrastPin)) {
    NOKIAcontrast++;
    if (NOKIAcontrast > 0xBF) NOKIAcontrast = 0xB0;
    EEPROM.write(EEaddr1, NOKIAcontrast);
    goto ReStart;
  }

  nRow = 0; nColumn = 0;
  gotoXY(nColumn, nRow);
  //    LcdClear();  // nRow = 0; nColumn = 0 done by function LcdClear()

}

//scroll this at index istr at row on nline line
void scroll(char* ici, unsigned * istr, byte row, byte nline)
{
  unsigned len = strlen(ici + *istr);

  if ( len > ((nline)*LCD_NCOL)) // somethink to scroll
  {
    for (int i = 0; i < nline; i++) // clear lines
    {
      gotoXY(0, row + i);
      LcdString(BlankLine);
    }
    gotoXY(0, row);
    LcdnString(ici + *istr, nline * LCD_NCOL);
    *istr += (nline) * LCD_NCOL;
  } else if ((len > 0)) // &&(*istr >0))
  {
    if (*istr > 0)
      for (int i = 0; i < nline; i++) // clear lines
      {
        gotoXY(0, row + i);
        LcdString(BlankLine);
      }
    gotoXY(0, row);
    LcdnString(ici + *istr, nline * LCD_NCOL);
    *istr = 0;
  } else
  {
    *istr = 0;
  }
}
// display a string  in row row, and on nline lines
void displayStr(char* ici, byte row, byte nline)
{
  for (int i = 0; i < nline; i++) // clear lines
  {
    gotoXY(0, row + i);
    LcdString(BlankLine);
  }
  gotoXY(0, row);
  LcdnString(ici, nline * LCD_NCOL);
}
// Clear all buffers and indexes
void clearAll()
{
  iStation = 0;
  iTitle = 0;
  title[0] = 0;
  station[0] = 0;
  LcdClear();
  loopcount = 0;
  loopcount1 = -4;
}
void cleartitle()
{
  strcpy(title, arrow);
  title[1] = 0;
  iTitle = 0;
  for (int i = 3; i < 6; i++) // clear lines
  {
    gotoXY(0, i);
    LcdString(BlankLine);
  }
}

// cesure for next scroll
void cesure(char* from, int at)
{
  if (strlen(from) > at)
  {
    int i = 0;
    while (( from[at - i] != ' ') && ( i < LCD_NCOL))
    {
      i++;
    }
    if ((i < LCD_NCOL) && (i != 1))
    {
      char tmp[256];
      strcpy(tmp, from + at - i + 1);
      strcpy(from + at, tmp);
      for (i; i > 0; i--)
        from[at - i] = ' ';
    }
  }
}

int separator(char* from)
{
  byte len;
  char tmp[256];
  char* interp;
  int ret = 1;
  len = strlen(from);
  while (from[strlen(from) - 1] == ' ') from[strlen(from) - 1] = 0; // avoid blank at end
  while ((from[0] == arrow[0]) && (from[1] == ' ') ) {
    strcpy( from + 1, from + 2);
  }
  interp = strstr(from, " - ");
  while ( (interp != NULL) && ((interp - from) > LCD_NCOL * ret)) {
    cesure(from, LCD_NCOL * ret);
    interp = strstr(from, " - ");
    ret++;
  }
  //   Serial.println(from);
  if (interp != NULL)
  {
    len = strlen(from);
    if (from != station)
    {
      strcpy(tmp, arrow);
      strcpy(tmp + 1, interp + 3);
    } else
      strcpy(tmp, interp + 3);
    interp[0] = 0;
    //    Serial.println(tmp);
    len -= strlen(tmp) + 3;
    len %= LCD_NCOL;
    len = LCD_NCOL - len ;
    /*if (len != 12)*/for (byte i = 0; i < len; i++) interp[i] = ' ';
    strcpy(interp + len, tmp);
  }
  return ret;
}

// parse the karadio received line and do the job
void parse(char* line)
{
  int mul;
  removeUtf8((byte*)line);
  //   Serial.println(line);
  ////// Meta
  if ((ici = strstr(line, "ETA#: ")) != NULL)
  {
    cleartitle();
    strcpy(title + 1, ici + 6);
    mul = separator(title);
    while (strlen(title) > mul * LCD_NCOL)
      cesure(title, mul++*LCD_NCOL);
    scroll(title, &iTitle, 3, 3) ;
  } else
    ////// ICY0
    if ((ici = strstr(line, "Y0#: ")) != NULL)
    {
      int len;
      clearAll();
      LcdCurrentLine(2);
      strcpy(station, arrow);
      station[1] = 0;
      for (int i = 0; i < 2; i++) // clear lines
      {
        gotoXY(0, i);
        LcdString(BlankLine);
      }
      strcat(station, ici + 5);
      if (strlen(station) < 2) strcpy(station, nameset);
      mul =  separator(station);
      while (strlen(station) > mul * LCD_NCOL)
        cesure(station, mul++*LCD_NCOL);

      scroll(station, &iStation, 0, 2);
      //      displayStr(station,0,2);
    } else
      ////// STOPPED
      if ((ici = strstr(line, "STOPPED")) != NULL)
      {
        cleartitle();
        displayStr((char*)"  STOPPED   ", 4, 1);
      }
  /////// Station Ip
      else if ((ici = strstr(line, "Station Ip: ")) != NULL)
      {
        char sip[20];
        char oip[20];
        eepromReadStr(EEaddrIp, oip);
        if ( strcmp(oip, ici + 12) != 0)
          eepromWriteStr(EEaddrIp, ici + 12 );
        displayStr(ici + 12, 4, 2);
      } else
        //////Nameset
        if ((ici = strstr(line, "ESET#: ")) != NULL)
        {
          int len;
          strcpy(nameset, arrow);
          nameset[1] = 0;
          for (int i = 0; i < 2; i++) // clear lines
          {
            gotoXY(0, i);
            LcdString(BlankLine);
          }
          strcat(nameset, ici + 7);
          /*        mul =  separator(nameset);
                  while (strlen(nameset) > mul*LCD_NCOL)
                     cesure(nameset,mul++*LCD_NCOL);
                  scroll(nameset,&iStation,0,2);
          */
        } else
          //////Playing
          if ((ici = strstr(line, "YING#")) != NULL)
          {
            if (strlen(station) == 0)
            {
              mul =  separator(nameset);
              while (strlen(nameset) > mul * LCD_NCOL)
                cesure(nameset, mul++*LCD_NCOL);
              scroll(nameset, &iStation, 0, 2);
            }
          }
  for (int i = 0; i < BUFLEN; i++) line[i] = 0; // clear buffer line
}
void eepromReadStr(int addr, char* str)
{
  byte rd;
  do {
    rd = EEPROM.read(addr++);
    *str = rd;
    //    Serial.println(str[0],16);
    str++;
  } while (( rd != 0) && ( rd != 0xFF));
}
void eepromWriteStr(int addr, char* str)
{
  byte rd;
  do {
    EEPROM.write( addr++, *str);
    rd = *str;
    str++;
  } while (( rd != 0) && ( rd != 0xFF));
}
void loop(void)
{
  char temp;
  if ((temp = Serial.read()) != -1)
  {
    //      char temp = Serial.read();
    //      Serial << temp;  // for diagnostic and Arduino term echo
    switch (temp)
    {
      case '\n' : break;
      case '\r' :
        line[index] = 0; // end of string
        index = 0;
        parse(line);
        break;
      default : // put the received char in line
        if (index > BUFLEN) break; // small memory so small buffer
        line[index++] = temp;
    }
  }

  if (loopcount++ == -1)
  {
    if (loopcount1++ == 2)
    {
      digitalWrite(13, HIGH);
      if ((loopflip++ % 2) == 0)
        scroll(station, &iStation, 0, 2);
      else
        scroll(title, &iTitle, 3, 3) ;
      loopcount1 = 0; loopcount = 0;
      digitalWrite(13, LOW);
    }
  }
}

[/code]

 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
/*
  This implementation specific to Arduino Mini-Pro 328 running at 3.3V
  and used with a NOKIA 5110 Craphic LCD.

  Built under Arduino 1.6.10
  Derived from https://create.arduino.cc/projecthub/rayburne/tiny-serial-terminal-151988
*/
#define version 1.0
#include <EEPROM.h>
#include "Defines.h"                // Nokia 5110 LCD pin usage as controlled by "ScrnFuncts.ino"

// constants
const uint32_t  BAUD       = 115200;  // any standard serial value: 300 - 115200
const int  EEaddr          = 0;     // EEPROM address for storing WPM
const int  EEaddr1         = 2;     // EEPROM address for LCD address
const int  EEaddrIp        = 10;    // EEPROM address for the IP
// Arduino 328P pins (not physical)

const byte ContrastPin     = 8;     // D8 low activates the Contrast adjustment

// global prog variables

byte nRow;                          // line count      (0-5 for NOKIA LCD)
byte nColumn;                       // character count (0-11 for NOKIA LCD)
byte NOKIAcontrast;                 // LCD initialization contrast values B0 thru BF
char temp;

// Character array pointers
char  msg[]       = {"Karadio for nokia 84*48 (c) KaraWin  "}; //
char  BlankLine[]  = {"            "};  // Nokia 12 x 6 (84 * 48)
//   char  anim = {"-\\|/"};


// Karadio specific data
#define BUFLEN  180
char line[BUFLEN]; // receive budder
char station[BUFLEN];
char title[BUFLEN];
char nameset[BUFLEN];
char* ici;
unsigned index = 0;
unsigned iStation = 0;
unsigned iTitle = 0;
unsigned loopcount = 0;
unsigned loopcount1 = 0;
byte loopflip = 0;
char arrow[] = {0x7e};

void setup(void)
{
  char oip[20];
  pinMode(13, OUTPUT);
  pinMode(ContrastPin, INPUT);
  digitalWrite(ContrastPin, HIGH); // activate internal pullup resistor

  Serial.begin(BAUD);
  //    Serial.println(F("Karadio display nokia 84 * 48"));
  Serial.println(F("Free RAM available:")) ;
  Serial.print(freeRam());

ReStart:  // Come back here if LCD contract is changed
  // Read the EEPROM to determine if display is using a custom contrast value
  NOKIAcontrast = EEPROM.read(EEaddr1);
  // Set the Nokia LCD Contrast to default or reset if EEPROM is corrupt or set to new value
  if (NOKIAcontrast  < 0xB0 || NOKIAcontrast > 0xBF) NOKIAcontrast = 0xB2;
  // LCD
  LcdInitialise();
  LcdClear();
  LcdString(msg);
  eepromReadStr(EEaddrIp, oip);
  displayStr(oip, 4, 2);
  delay(2000);
  if (!digitalRead(ContrastPin)) {
    NOKIAcontrast++;
    if (NOKIAcontrast > 0xBF) NOKIAcontrast = 0xB0;
    EEPROM.write(EEaddr1, NOKIAcontrast);
    goto ReStart;
  }

  nRow = 0; nColumn = 0;
  gotoXY(nColumn, nRow);
  //    LcdClear();  // nRow = 0; nColumn = 0 done by function LcdClear()

}

//scroll this at index istr at row on nline line
void scroll(char* ici, unsigned* istr, byte row, byte nline)
{
  unsigned len = strlen(ici + *istr);

  if ( len > ((nline)*LCD_NCOL)) // somethink to scroll
  {
    for (int i = 0; i < nline; i++) // clear lines
    {
      gotoXY(0, row + i);
      LcdString(BlankLine);
    }
    gotoXY(0, row);
    LcdnString(ici + *istr, nline * LCD_NCOL);
    *istr += (nline) * LCD_NCOL;
  } else if ((len > 0)) // &&(*istr >0))
  {
    if (*istr > 0)
      for (int i = 0; i < nline; i++) // clear lines
      {
        gotoXY(0, row + i);
        LcdString(BlankLine);
      }
    gotoXY(0, row);
    LcdnString(ici + *istr, nline * LCD_NCOL);
    *istr = 0;
  } else
  {
    *istr = 0;
  }
}
// display a string  in row row, and on nline lines
void displayStr(char* ici, byte row, byte nline)
{
  for (int i = 0; i < nline; i++) // clear lines
  {
    gotoXY(0, row + i);
    LcdString(BlankLine);
  }
  gotoXY(0, row);
  LcdnString(ici, nline * LCD_NCOL);
}
// Clear all buffers and indexes
void clearAll()
{
  iStation = 0;
  iTitle = 0;
  title[0] = 0;
  station[0] = 0;
  LcdClear();
  loopcount = 0;
  loopcount1 = -4;
}
void cleartitle()
{
  strcpy(title, arrow);
  title[1] = 0;
  iTitle = 0;
  for (int i = 3; i < 6; i++) // clear lines
  {
    gotoXY(0, i);
    LcdString(BlankLine);
  }
}

// cesure for next scroll
void cesure(char* from, int at)
{
  if (strlen(from) > at)
  {
    int i = 0;
    while (( from[at - i] != ' ') && ( i < LCD_NCOL))
    {
      i++;
    }
    if ((i < LCD_NCOL) && (i != 1))
    {
      char tmp[256];
      strcpy(tmp, from + at - i + 1);
      strcpy(from + at, tmp);
      for (i; i > 0; i--)
        from[at - i] = ' ';
    }
  }
}

int separator(char* from)
{
  byte len;
  char tmp[256];
  char* interp;
  int ret = 1;
  len = strlen(from);
  while (from[strlen(from) - 1] == ' ') from[strlen(from) - 1] = 0; // avoid blank at end
  while ((from[0] == arrow[0]) && (from[1] == ' ') ) {
    strcpy( from + 1, from + 2);
  }
  interp = strstr(from, " - ");
  while ( (interp != NULL) && ((interp - from) > LCD_NCOL * ret)) {
    cesure(from, LCD_NCOL * ret);
    interp = strstr(from, " - ");
    ret++;
  }
  //   Serial.println(from);
  if (interp != NULL)
  {
    len = strlen(from);
    if (from != station)
    {
      strcpy(tmp, arrow);
      strcpy(tmp + 1, interp + 3);
    } else
      strcpy(tmp, interp + 3);
    interp[0] = 0;
    //    Serial.println(tmp);
    len -= strlen(tmp) + 3;
    len %= LCD_NCOL;
    len = LCD_NCOL - len ;
    /*if (len != 12)*/for (byte i = 0; i < len; i++) interp[i] = ' ';
    strcpy(interp + len, tmp);
  }
  return ret;
}

// parse the karadio received line and do the job
void parse(char* line)
{
  int mul;
  removeUtf8((byte*)line);
  //   Serial.println(line);
  ////// Meta
  if ((ici = strstr(line, "ETA#: ")) != NULL)
  {
    cleartitle();
    strcpy(title + 1, ici + 6);
    mul = separator(title);
    while (strlen(title) > mul * LCD_NCOL)
      cesure(title, mul++*LCD_NCOL);
    scroll(title, &iTitle, 3, 3) ;
  } else
    ////// ICY0
    if ((ici = strstr(line, "Y0#: ")) != NULL)
    {
      int len;
      clearAll();
      LcdCurrentLine(2);
      strcpy(station, arrow);
      station[1] = 0;
      for (int i = 0; i < 2; i++) // clear lines
      {
        gotoXY(0, i);
        LcdString(BlankLine);
      }
      strcat(station, ici + 5);
      if (strlen(station) < 2) strcpy(station, nameset);
      mul =  separator(station);
      while (strlen(station) > mul * LCD_NCOL)
        cesure(station, mul++*LCD_NCOL);

      scroll(station, &iStation, 0, 2);
      //      displayStr(station,0,2);
    } else
      ////// STOPPED
      if ((ici = strstr(line, "STOPPED")) != NULL)
      {
        cleartitle();
        displayStr((char*)"  STOPPED   ", 4, 1);
      }
  /////// Station Ip
      else if ((ici = strstr(line, "Station Ip: ")) != NULL)
      {
        char sip[20];
        char oip[20];
        eepromReadStr(EEaddrIp, oip);
        if ( strcmp(oip, ici + 12) != 0)
          eepromWriteStr(EEaddrIp, ici + 12 );
        displayStr(ici + 12, 4, 2);
      } else
        //////Nameset
        if ((ici = strstr(line, "ESET#: ")) != NULL)
        {
          int len;
          strcpy(nameset, arrow);
          nameset[1] = 0;
          for (int i = 0; i < 2; i++) // clear lines
          {
            gotoXY(0, i);
            LcdString(BlankLine);
          }
          strcat(nameset, ici + 7);
          /*        mul =  separator(nameset);
                  while (strlen(nameset) > mul*LCD_NCOL)
                     cesure(nameset,mul++*LCD_NCOL);
                  scroll(nameset,&iStation,0,2);
          */
        } else
          //////Playing
          if ((ici = strstr(line, "YING#")) != NULL)
          {
            if (strlen(station) == 0)
            {
              mul =  separator(nameset);
              while (strlen(nameset) > mul * LCD_NCOL)
                cesure(nameset, mul++*LCD_NCOL);
              scroll(nameset, &iStation, 0, 2);
            }
          }
  for (int i = 0; i < BUFLEN; i++) line[i] = 0; // clear buffer line
}
void eepromReadStr(int addr, char* str)
{
  byte rd;
  do {
    rd = EEPROM.read(addr++);
    *str = rd;
    //    Serial.println(str[0],16);
    str++;
  } while (( rd != 0) && ( rd != 0xFF));
}
void eepromWriteStr(int addr, char* str)
{
  byte rd;
  do {
    EEPROM.write( addr++, *str);
    rd = *str;
    str++;
  } while (( rd != 0) && ( rd != 0xFF));
}
////////////////////////////////////////
// receive the esp8266 stream
void serial()
{
  char temp;
  uint8_t _index = 0;

  // when characters arrive over the serial port...
  if (Serial.available())
  {
    // wait a bit for the entire message to arrive
    delay(100);
    // read all the available characters
    while (Serial.available() > 0)
    {
      temp = Serial.read();
      switch (temp)
      {
        case '\n' : if (_index == 0) break;
        case '\r' :
          line[_index] = 0; // end of string
          _index = 0;
          parse(line);
          break;
        default : // put the received char in line
          if (_index > BUFLEN - 1) break; // small memory so small buffer
          line[_index++] = temp;
      }
    }
  }
}

void loop(void)
{
  serial();

  if (loopcount++ == -1)
  {
    if (loopcount1++ == 2)
    {
      digitalWrite(13, HIGH);
      if ((loopflip++ % 2) == 0)
        scroll(station, &iStation, 0, 2);
      else
        scroll(title, &iTitle, 3, 3) ;
      loopcount1 = 0; loopcount = 0;
      digitalWrite(13, LOW);
    }
  }
}

Try it!

kombatus
Offline
Зарегистрирован: 24.03.2018

To pilnikov

Спасибо.

Все скомпилировалось и загрузилось.

После ввода вашей пробы 

"потом в строке монитора забейте Station Ip: 192.168.1.15 (или ip вашей карадивы)

потом ##CLI.ICY0#: personal station #123456

отпишитесь по результатам"

на экране поочередно меняются строки "personal station" и "#123456" в верхней части экрана начиная с 1 строки. На 3ей строке

горизонтальная линия

Вечером подключу к радио.

 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
const uint32_t  BAUD       = 115200;  // any standard serial value: 300 - 115200

Не забывайте


yt

 

kombatus
Offline
Зарегистрирован: 24.03.2018

Да, не забуду.

Gran mersi

rv9c
Offline
Зарегистрирован: 23.02.2018

Всех приветствую, предлагаю к повторению свою собственную конструкцию интернет радиоприемника на базе одной лишь ESP32 без внешних декодеров использую встроенный ЦАП. Думаю много писать нет смысла в видео все понятно будет. 

https://youtu.be/n2GIGMSg7fs

Схема, прошивка файл описания тут 

https://yadi.sk/d/gKyhVuGO3Uktzr

 

pkmuum
Offline
Зарегистрирован: 25.03.2018

При беглом изучении конструкция выглядит очень простой и легко повторимой. Я наверное попробую, только ESP32 из Китая пока не дошла. Вы бы видео сделали бы более детальное, что бы лишних вопросов у людей при повторении не возникало.

pkmuum
Offline
Зарегистрирован: 25.03.2018

Решил вмонтировать своё КаРадио в корпус. В качестве донора будет старый приемник абонентского радио. Подскажите кто-нибудь как правильно стерео сигнал аппаратно смешать в моно?

rv9c
Offline
Зарегистрирован: 23.02.2018

pkmuum, по вашей просьбе снял дополнительное видео) https://youtu.be/t0Wzh9b18sw

 

nadim
Offline
Зарегистрирован: 04.11.2017

pilnikov пишет:

правильно понимаете

в 

void irLoop() {
// IR
	event_ir_t evt;
	while (xQueueReceive(event_ir, &evt, 0)) {
		wakeLcd();
		uint32_t evtir = ((evt.addr) << 8) | (evt.cmd & 0xFF);
		ESP_LOGI(TAG,
				"IR event: Channel: %x, ADDR: %x, CMD: %x = %X, REPEAT: %d",
				evt.channel, evt.addr, evt.cmd, evtir, evt.repeat_flag);
		if (!evt.repeat_flag) // avoid repetition
			switch (evtir) {
			case 0xFF0046:
			case 0xFF18E7:
			case 0xF70812: /*(" FORWARD");*/
				changeStation(+1);
				break;
			case 0xFF0044:

подставляете свой код в case и псе. коды можно взять из ардуино скетча по тесту ик пультов

Что такое - псе

Получил коды для пульта через Arduino Uno и библиотеку IRremote

Код для кнопки 1 получил: 

FF30CF

FFFFFFFF

Как правильно сделать замену? Выдает ошибку при компиляции на некоторые кнопки не выдает ошибок - но все равно не работают.

/esp/Ka-Radio32/main/addon.c:554:3: error: previously used here
   case 0xFFFFFFFF:  /*(" FORWARD");*/  changeStation(+1);
 
прописывал так:
break;
case 0xFF30CF:
case 0xFFFFFFFF: /*(" 1");*/ nbStation('1'); 
break;

 

 

nik_nik45
nik_nik45 аватар
Offline
Зарегистрирован: 21.02.2018

pkmuum пишет:
Решил вмонтировать своё КаРадио в корпус. В качестве донора будет старый приемник абонентского радио. Подскажите кто-нибудь как правильно стерео сигнал аппаратно смешать в моно?
Да все просто : Выход правого канала через конденсатор10мкф. и резистор 1,0 ком соединить с переменным резистром  абоненского кромкоговорителя, если не изменяет память там он 68-75Ком .туда же подключить левый канал,опять же через конденсатор и резистор . .А после переменного резистора 68ком, через конденсатор на вход усилителя .

 

nik_nik45
nik_nik45 аватар
Offline
Зарегистрирован: 21.02.2018

rv9c пишет:
Всех приветствую, предлагаю к повторению свою собственную конструкцию интернет радиоприемника на базе одной лишь ESP32 без внешних декодеров использую встроенный ЦАП. Думаю много писать нет смысла в видео все понятно будет.
Интнресное решение с шунтированием выходов,

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

nadim пишет:

кострукция "switch / case" знаете как работает? посмотрите для примера в справочнике.

Из полученных кодов вам fffff не нужны вам нужны только первые 6 символов (24 бит) и case должны быть уникальные (без повторов) о чем вам компилятор и орет

Там в оригинальном коде создана болванка на сразу много кодов. Используются только те, у которых после case есть строчки.

rv9c
Offline
Зарегистрирован: 23.02.2018

Сделано это для того чтобы избавиться от паразитных шумов возникающих при переключении с потока на поток. Програмным способом не удалось победить) В будущем планирую эту пару полевых транзисторов использовать для регулировки громкости.

nik_nik45
nik_nik45 аватар
Offline
Зарегистрирован: 21.02.2018

Так  не удалось,программно шумы все задавить.)) Внешний ЦАП не хотите прикрутить. все таки у ESP32 встроенный 8 бит. Разница в звуке ощутима, ЦАП на I2S типа PCM5102 по веселее будет))

rv9c
Offline
Зарегистрирован: 23.02.2018

Все дело в конечной цене устройста) Я пробовал с нешним ЦАП PCM5102 разница конечно есть. Моя концепция это: простое радио с минимальным количеством элементов, стабильно работающее и доступное для повторения всеми желающими с приемлемым качеством звука. Тем более что встроенный в ESP32 ЦАП достаточно не плох) для озвучивания фоновой музыкой комнаты, кухни, гаража. 

 

nik_nik45
nik_nik45 аватар
Offline
Зарегистрирован: 21.02.2018

Согласен . Сам слушал ESP32 без цап ,почти месяц пока ждал цап.

Меня больше заинтересовало "гашение" выходов полевиками ))

rv9c
Offline
Зарегистрирован: 23.02.2018

Записал кусочек как звучит радио и момент перехода с потока на поток на 24сек,  через микрофонный вход ноутбука) https://yadi.sk/d/cSVJeOhe3Uo5yZ

nadim
Offline
Зарегистрирован: 04.11.2017

pilnikov

Что может быть - те коды которые я получил для своего пульта не отрабатывают на KaRadio32. 

Вот например для восьмерки получил код FF4AB5 прописал его 

break;
case 0xFF4AB5: /*(" 8");*/ nbStation('8');
и не отрабатывает, а код из addon 
 
break;
case 0xDF2014: /*(" 5");*/ nbStation('5');
 
на пятерке отрабатывает как восьмерка.
 
Что делаю не так?
 
Коды кнопок которые я получил https://pastebin.com/Bab6qBWn
FF30CF 1
FF18E7   2
FF7A85   3
FF10EF 4
FF38C7   5
FF5AA5 6
FF42BD 7
FF4AB5 8
FF52AD   9
FFB04F 0
FF6897 - Volume
FF9867   + Volume
FFE01F back track
FFA857   forward track
FF906F play / pause
FF22DD  mode
FF02FD to bungle
FFC23D equalizer
FF629D Stop
FFE21D mute
FFA25D switch off

 

ValeraSashino
Offline
Зарегистрирован: 07.08.2017

Ничего не получается прошить, есть какой-то секрет?

ShAlex13
Offline
Зарегистрирован: 19.01.2018

ValeraSashino пишет:

Ничего не получается прошить, есть какой-то секрет?

Это смотрели? https://youtu.be/cZStT-QnCRU

ValeraSashino
Offline
Зарегистрирован: 07.08.2017

Прошу прощения, что там нужно увидеть?

Врубился вроде, прошивальщик в папку с кирилицей сунул. Думал, что лежащих в корне бинов достаточно.

Прошилось, но радости мало, постоянный ребут

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
to nadim пробуйте 
void irLoop()
 {
// IR
event_ir_t evt;
	while (xQueueReceive(event_ir, &evt, 0))
	{
		wakeLcd();
		uint32_t evtir = ((evt.addr)<<8)|(evt.cmd&0xFF);
		ESP_LOGI(TAG,"IR event: Channel: %x, ADDR: %x, CMD: %x = %X, REPEAT: %d",evt.channel,evt.addr,evt.cmd, evtir,evt.repeat_flag );
		if (!evt.repeat_flag ) // avoid repetition
		switch(evtir)
		{
		case 0xDF2047:
		case 0xDF2002:
		case 0xFF0046: 
		case 0xFFA857:  /*(" FORWARD");*/  changeStation(+1);  
		break;
		case 0xDF2049:
		case 0xDF2041:
		case 0xFF0044:
		case 0xF70842:
		case 0xFF6897: /*(" LEFT");*/  setRelVolume(-5);  
		break;
		case 0xDF204A:
		case 0xFF0040:
		case 0xFF906F: /*(" -OK-");*/ stationOk();     
		break;
		case 0xDF204B:
		case 0xDF2003:
		case 0xFF0043:
		case 0xF70841:
		case 0xFF9867: /*(" RIGHT");*/ setRelVolume(+5);     
		break; // volume +
		case 0xDF204D:
		case 0xDF2009:
		case 0xFF0015:
		case 0xFFE01F: /*(" REVERSE");*/ changeStation(-1);
		break;
		case 0xDF2000:
		case 0xFF0016:
		case 0xFF30CF: /*(" 1");*/ nbStation('1');   
		break;
		case 0xDF2010:
		case 0xFF0019:
		case 0xFF18E7: /*(" 2");*/ nbStation('2');   
		break;
		case 0xDF2011:
		case 0xFF000D:
		case 0xFF7A85: /*(" 3");*/ nbStation('3');   
		break;
		case 0xDF2013:
		case 0xFF000C:
		case 0xFF10EF: /*(" 4");*/ nbStation('4');   
		break;
		case 0xDF2014:
		case 0xFF0018:
		case 0xFF38C7: /*(" 5");*/ nbStation('5');   
		break;
		case 0xDF2015:
		case 0xFF005E:
		case 0xFF5AA5: /*(" 6");*/ nbStation('6');   
		break;
		case 0xDF2017:
		case 0xFF0008:
		case 0xFF42BD: /*(" 7");*/ nbStation('7');   
		break;
		case 0xDF2018:
		case 0xFF001C:
		case 0xFF4AB5: /*(" 8");*/ nbStation('8');   
		break;
		case 0xDF2019:
		case 0xFF005A:
		case 0xFF52AD: /*(" 9");*/ nbStation('9');   
		break;
		case 0xDF2045:
		case 0xFF0042:
		case 0xFFC23D: /*(" *");*/   playStationInt(futurNum);   
		break;
		case 0xDF201B:
		case 0xFF0052:
		case 0xFFB04F: /*(" 0");*/ nbStation('0');   
		break;
		case 0xDF205B:
		case 0xFF004A:
		case 0xFF629D: /*(" #");*/  stopStation();    
		break;
		case 0xFF02FD: /*(" Info")*/
									toggletime();	
		break;
		default:;
		/*SERIALX.println(F(" other button   "));*/
		}// End Case

		if (evt.repeat_flag ) // repetition
		switch(evtir)
		{
		case 0xDF2047:
		case 0xDF2002:			
		case 0xFF0046: 
		case 0xFFA857:  /*(" FORWARD");*/  changeStation(+1); 
		break;
		case 0xDF204D:
		case 0xDF2009:
		case 0xFF0015:
		case 0xFFE01F:  /*(" REVERSE");*/ changeStation(-1); 
		break;
		case 0xDF2049:
		case 0xDF2041:
		case 0xFF0044:
		case 0xF70842:
		case 0xFF6897: /*(" LEFT");*/  setRelVolume(-5);  
		break;
		case 0xDF204B:
		case 0xDF2003:
		case 0xFF0043:
		case 0xF70841:
		case 0xFF9867: /*(" RIGHT");*/ setRelVolume(+5); 
		break; // volume +
		default:;
		} 						
	}
}
 

 

ValeraSashino
Offline
Зарегистрирован: 07.08.2017

rv9c пишет:

Всех приветствую, предлагаю к повторению свою собственную конструкцию интернет радиоприемника на базе одной лишь ESP32 без внешних декодеров использую встроенный ЦАП. Думаю много писать нет смысла в видео все понятно будет. 

https://youtu.be/n2GIGMSg7fs

Схема, прошивка файл описания тут 

https://yadi.sk/d/gKyhVuGO3Uktzr

 

А кто-нибудь это повторял? Я хотел послушать, как звучит, дисплея такого нет, может, из-за его отсутствия ничего не работает?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Вот желание иногда возникает матом поругаться. Не хвататет тямки даже на то, чтобы тупо залить чей то код. И начинается - дисплея нет - не работает нихера. А слабо чуток код поправить и запустить шнягу в вариате без экрана или с экраном, который есть... В радиве что главное? Экран? Нихера. Радио должно петь! и псе! Просто петь. А то, что екран не робит это трабла 18ая и только ваша, и служит лишь предлогом. Человек старался, писал, а вы - экрана нет - желания нет! 

Простите за тон и многа букв, накипело.

ValeraSashino
Offline
Зарегистрирован: 07.08.2017

pilnikov пишет:

Вот желание иногда возникает матом поругаться. Не хвататет тямки даже на то, чтобы тупо залить чей то код. И начинается - дисплея нет - не работает нихера. А слабо чуток код поправить и запустить шнягу в вариате без экрана или с экраном, который есть... В радиве что главное? Экран? Нихера. Радио должно петь! и псе! Просто петь. А то, что екран не робит это трабла 18ая и только ваша, и служит лишь предлогом. Человек старался, писал, а вы - экрана нет - желания нет! 

Простите за тон и многа букв, накипело.

Написано красиво. Если б я мог так легко бинарник подправить, вопросов бы не задавал. Лапухнулся с первым постом, не спорю. А вопрос вроде конкретный задал, может ли ребутиться из-за отсутствия дисплея. Можно было ответить да или нет. 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

а исходников нет?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

rv9c, дайте иходник, не жадничайте, перед пацанами неудобно