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

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

Дата и время не синхронизируются

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

rv9c пишет:
И ещё не мало важный момент, электролитов на отладочной платке нет и возможна импульсная просадка напряжения (как раз тогда как происходит инициализация приемо-передатчика wifi, в этот момент максимальное потребление тока) отсюда и перезагрузка происходит. !Поэтому надо использовать качественный и короткий usb кабель!

Вы мегамозг! Дело было в кабеле.

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

Ну вот) теперь от вас radio id, будете первым тестером)

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

Пока красная плата не пришла, собрал себе вот такое радио.

http://wifiradio.su/internet-radio-iz-tp-link-tl-mr3020/

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

rv9c пишет:
Ну вот) теперь от вас radio id, будете первым тестером)

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

shurik12330
Offline
Зарегистрирован: 05.02.2018

Неделю назад получил красную плату. Только сегодня дошли руки до нее.

И радио сразу заработало!!! В наушниках поет!!!

Без всяких дополнительных кондеров и на проводках.

Так что дело все-таки в синей плате. Я перепробовал три штуки (две моих и одну знакомый передал из другого города, я их пропаивал и все было без толку)

shurik12330
Offline
Зарегистрирован: 05.02.2018

Красную плату покупал здесь 

https://www.aliexpress.com/item/VS1053-VS1053B-MP3-Module-With-SD-Card-S...

 

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

Все верно так и задумано. Зайдите в веб интерфейс по ip адресу приемника, далее вкладка "станции" в free версии доступна только 0 ячейка куда нужно написать имя станции и url потока станции и нажать кнопку Save. После этого нажимаете кнопку старт/стоп на "главной" либо нажать на физически подключенной кнопке, должен зазвучать поток. После выключения питания url и имя станции не сохранятся ТК это версия free. Сохранять и доступными станут все ячейки после активации.
Мне нужен radio id из вкладки "система".

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

rv9c пишет:
Все верно так и задумано. Зайдите в веб интерфейс по ip адресу приемника, далее вкладка "станции" в free версии доступна только 0 ячейка куда нужно написать имя станции и url потока станции и нажать кнопку Save. После этого нажимаете кнопку старт/стоп на "главной" либо нажать на физически подключенной кнопке, должен зазвучать поток. После выключения питания url и имя станции не сохранятся ТК это версия free. Сохранять и доступными станут все ячейки после активации. Мне нужен radio id из вкладки "система".

radio id во вкладке такой же как и в терминале 44592

 

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

rv9c пишет:
вкладка "станции" в free версии доступна только 0 ячейка куда нужно написать имя станции и url . После выключения питания url и имя станции не сохранятся ТК это версия free.
rv9c, я так понимаю, Вы в данной теме решили обкатать свой коммерческий продукт? Но тема и так толстенная с 2мя основными и несколькими сторонними проектами, причём открытыми. Вы бы создали свою, другую тему, обкатывать тут нечего, т.к. код закрыт, много желающих в этой теме не найдёте. А новички не повторят, т.к. отыскать Ваш проект в данной теме слишком сложно, уже через несколко новых страниц он затеряется.

kostake
Offline
Зарегистрирован: 01.05.2018

Добрый день. Прошу у вас помощи, совета.

Собрал радио по этому проекту https://github.com/Edzelf/Esp-radio , радио заиграло, правда не без костылей. Не хотел заводится VS1053 (синяя плата), пробовал и ножки 33/34 замыкать-ничего не помогло. пока не откинул резистор на 1кОм (от земли. после этого все стартует отлично и без замкнутых ножек). Может кому то поможет эта информация.

 

А я запутался в кнопках, точнее как их реализовать. Нужно две кнопки для переключения станций, в файле PDF проекта про это немного сказано.Напаял резисторы, посмотрел значения какие выдаются при замыкании той или иной кнопки. И дальше ступор, подскажите где надо прописать команды на них? Я просто только вчера познакомился с Arduino ide. Пытался в файлике Radio.ini прописать раздел Analog, но что-то ничего не получилось.

PS:картинки не стал вставлять, очень пост большой получается. 
udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

kostake, если у Вас VS работает при отключённом резисторе (как я понял на RST), то Вы оторвали ей сброс, и она может заглючить или перестать играть при смене станций или изменении громкости. Скорее всего Вы неправильно рапаяли диоды, в таком случае резистор всегда будет подавать 0 на ресет VSки, и она не заиграет.

Кнопки надо прописывать в Esp_radio.ino перед компиляцией.

#define asw1    246
#define asw2    329
#define asw3    497
 
 
 

 

kostake
Offline
Зарегистрирован: 01.05.2018

Спасибо. С кнопками попробую сегодня повозится. Мне так понимаю для переключения станций, нужны ASW2 и ASW3 ? 

Да, резистор с RST у VS1053 , самое интересное что громкость меняется,станции переключаются и все работает (наушники если подключать\отключать также без сбоев), сам пока не могу понять как так получается. Распайку диодов сразу проверил, но все правильно, понаблюдаю, может еще вылезет какой то сбой. 

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

 У меня сделано так - кнопки 2, 3я получается нажатием обоих (громк+, громк-, и станция вперёд)

        dbgprint ( "Analog button %d pushed, v = %d", anewval, v ) ;
        if ( anewval == 1 )                       // Button 1? 
        {
        ini_block.reqvol += 2  ;                  // увеличение громкости
        if ( ini_block.reqvol > 100 ) ini_block.reqvol = 100; 
 
        }
        else if ( anewval == 2 )                  // Button 2?
        {
        ini_block.reqvol -= 2  ;                  // Уменьшение громкости
        if ( ini_block.reqvol < 0) ini_block.reqvol = 0; 
        }
        else if ( anewval == 3 )                  // Button 3? (1+2)
        {
         ini_block.newpreset = currentpreset + 1 ; // Станция вперёд


//        ini_block.newpreset = currentpreset - 1 ; // Станция назад
//        ini_block.newpreset = 0 ;               // Станция 1

Как было изначально - не помню, возможно Вам тут ничего переделывать не надо, и по умолчанию так и будёт, как Вы хотите.

По поводу диодов - посмотрите, при проигрывании на 1 и/или 2 выводе VSки должен быть +, и соответственно через VS этот + заглушает RST VSки (если там + нет, то смотрите правильность подключения к ESP), хотя работает - тогда и не заморачивайтесь.

// NodeMCU  GPIO      Wired to LCD        Wired to VS1053      Wired to rest
// -------  ------    ---------------     -------------------  ---------------------
// D0       GPIO16    -                   pin 1 DCS            -
// D1       GPIO5     -                   pin 2 CS             LED on nodeMCU
// D2       GPIO4     -                   pin 4 DREQ           -
// D3       GPIO0     -                   -                    Control button "Next station"
// D4       GPIO2     pin 3 (D/C)         -                    (OR)Control button "Station 1"
// D5       GPIO14    pin 5 (CLK)         pin 5 SCK            -
// D6       GPIO12    -                   pin 7 MISO           -
// D7       GPIO13    pin 4 (DIN)         pin 6 MOSI           -
// D8       GPIO15    pin 2 (CS)          -                    (OR)Control button "Previous station"

Вот сравните выводы, на VS к выводам 1 и 2 идут GPIO 16 и GPIO 5. Переключение станций, можно было сделать на цифровых, если нет дисплея, но тогда аналог надо посадить на землю.

 

kostake
Offline
Зарегистрирован: 01.05.2018

Попробовал указать вот так:

#define NUMANA  3
//#define asw1    700
//#define asw2    240
//#define asw3    300
#define asw1    2000
#define asw2    240
#define asw3    300
//
 
мои значения 240 и 300 соответственно. Скомпилировал, прошил (команда upload в Arduino IDE) и пока безуспешно, реакции на кнопки нету. Где то я ошибаюсь. Прошивать модуль ( nodemcu v3 c CH340 на борту) же можно с напаянным VS1053 и дисплеем? 
udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Прошивать можно и с дисплеем, ошибок же прошивки не выдаёт? Смотрите, что в терминале, при нажати кнопок. Поставьте первое значение 700, например, его у Вас всё равно никогда не будет, но оно существующее.

kostake
Offline
Зарегистрирован: 01.05.2018

udavst пишет:

Прошивать можно и с дисплеем, ошибок же прошивки не выдаёт? Смотрите, что в терминале, при нажати кнопок. Поставьте первое значение 700, например, его у Вас всё равно никогда не будет, но оно существующее.

Получилось!!! Допаял третью кнопку, немного изменил сопротивления, внес ее значение, получились три кнопки по возрастающей (304,399,574) и все три заработали. А до этого и в терминале даже тишина была при нажатии кнопки.

Теперь все переключает, супер. Большое спасибо.

Уже забил свои радиаостанции, только никак не могу победить такое явление. например если у меня 6 станций, при прослушивании 6й и по команде "+1 станция", приемник переключаетя на первую станцию, что логично. А вот если стою на 1м пресете, и нажать "-1 станция",  то на дисплее просто черный экран и ничего нету, пока "+1 станция" не нажму.

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Да кнопку могли и не допаивать, просто значение поставить существующее )

Вот по станции- не подскажу, у меня на 8266 только одно радио, и там кнопок не хватит для пред. станции

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

To: ShAlex13

Не подскажешь как получилось подключить русифицированный LCD от компании МЭЛТ? Какие там особенности, в чем отличия от подключения обычного китайского варианта? 

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

Владимир 2018 пишет:

To: ShAlex13

Не подскажешь как получилось подключить русифицированный LCD от компании МЭЛТ? Какие там особенности, в чем отличия от подключения обычного китайского варианта? 

аппаратно они близнецы братья. В мэлте другая прошивка в части знакогенератора и все.

Правда в МЭЛТЕ подсветка экрана всегда работает (припаян резюк на +5 в), а в китайцах она на ножки 15 16 выведена и по умолчанию, если никуда не подключать - то не светится. У мэлта 15 и 16 ножки идут перед первой (т.е. 15 16 1...14) у китайцев попорядку

robotosha.ru/electronics/lcd-hd44780.html

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

аппаратно они близнецы братья. В мэлте другая прошивка в части знакогенератора и все.

Правда в МЭЛТЕ подсветка экрана всегда работает (припаян резюк на +5 в), а в китайцах она на ножки 15 16 выведена и по умолчанию, если никуда не подключать - то не светится. У мэлта 15 и 16 ножки идут перед первой (т.е. 15 16 1...14) у китайцев попорядку

robotosha.ru/electronics/lcd-hd44780.html

Завтра буду пробовать его подключать, спасибо.

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

Владимир 2018 пишет:

To: ShAlex13

Не подскажешь как получилось подключить русифицированный LCD от компании МЭЛТ? Какие там особенности, в чем отличия от подключения обычного китайского варианта? 

Я не подключал еще.

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

To: ShAlex13

Не подскажешь как получилось подключить русифицированный LCD от компании МЭЛТ? Какие там особенности, в чем отличия от подключения обычного китайского варианта? 

Я не подключал еще.

Я вот подключил 2004 (МЭЛТ). Он у меня завелся, все работает, но русский отображаетя только с библиотекой LiquidCrystal_1602_RUS. Русские символы то в дисплей вшиты, выводить их при помощи 16-го кода можно, но чем тогда в практическом применении отличается китайский дисплей с русской библиотекой?

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

Да, вот еще возник вопрос про разницу в подключении и скетче между 1602 LCD дисплеем и 2004? Я подключил  2004, а использовал скетч для 1602. В скетче нужно что-то менять? А можно вставить, скажем, в 4-ю строку отображение реального времени?

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

Владимир 2018 пишет:

Я вот подключил 2004 (МЭЛТ). Он у меня завелся, все работает, но русский отображаетя только с библиотекой LiquidCrystal_1602_RUS. Русские символы то в дисплей вшиты, выводить их при помощи 16-го кода можно, но чем тогда в практическом применении отличается китайский дисплей с русской библиотекой?

Он и название станций и исполнителей пишет по русски?

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

Я вот подключил 2004 (МЭЛТ). Он у меня завелся, все работает, но русский отображаетя только с библиотекой LiquidCrystal_1602_RUS. Русские символы то в дисплей вшиты, выводить их при помощи 16-го кода можно, но чем тогда в практическом применении отличается китайский дисплей с русской библиотекой?

Он и название станций и исполнителей пишет по русски?

Пишет из-за библиотеки LiquidCrystal_1602_RUS, но не более 8-ми уникальных символов. Вот я и не понял как "русский" МЭЛТ подружить с Карадио.

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

Владимир 2018 пишет:

Пишет из-за библиотеки LiquidCrystal_1602_RUS, но не более 8-ми уникальных символов. Вот я и не понял как "русский" МЭЛТ подружить с Карадио.

Как то вторую кодовую страницу надо подключать (переключать)

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

Пишет из-за библиотеки LiquidCrystal_1602_RUS, но не более 8-ми уникальных символов. Вот я и не понял как "русский" МЭЛТ подружить с Карадио.

Как то вторую кодовую страницу надо подключать (переключать)

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

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

Владимир 2018 пишет:

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

https://static.chipdip.ru/lib/243/DOC000243344.pdf

Таблица 5 и 6

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

ShAlex13 пишет:

Владимир 2018 пишет:

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

https://static.chipdip.ru/lib/243/DOC000243344.pdf

Таблица 5 и 6. Полноценный русский во второй с 0С по FF

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

Ну, дошло как включить русский? И чем китаец от нашего отличается?

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

Попробуйте на китайце вывести строку "будильник сработал"

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

Все разобрался. Подключил библиотеку LiquidCrystalRus-master и все стало нормально. Лежит она тут:

https://github.com/mk90/LiquidCrystalRus

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
const unsigned char utf_recode[] PROGMEM =
{ 0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4, 0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f,
  0xa8, 0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab, 0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,
  0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f,
  0xbe, 0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0, 0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
};



String lcd_rus(String source)
{
  uint16_t i, k;
  String target = String();
  unsigned char n;
  char m = {' '};
  uint8_t utf_hi_char;

  k = source.length();
  i = 0;

  while (i < k)
  {
    n = source[i];
//    DBG_OUT_PORT.print("n = ");
//    DBG_OUT_PORT.println(n, HEX);

    if (n >= 0x80 && n < 0xD2)   // UTF-8 handling
    {
      if (n >= 0xC0) utf_hi_char = n - 0xD0;
      else
      {
        n &= 0x3F;
        if (!utf_hi_char && (n == 1)) m = (0xA2); // ё
        else if ((utf_hi_char == 1) && (n == 0x11)) m = (0xB5); // Ё
        else m = pgm_read_byte_near(utf_recode + n + (utf_hi_char << 6) - 0x10);
      }
    }
    else m = n;

    if (n != 0xD0 && n != 0xD1) target += String(m);

    i++;
  }
  return target;
}

Пользуйтесь. Вставьте в свой скетч и для того чтобы напечатать по русски набирайте lcd.print(lcd_rus("Привет");

Библиотека liquid crystall rus не нужна 

Подходит только для дисплеев с кириллическим знакогенератором

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

const unsigned char utf_recode[] PROGMEM =
{ 0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4, 0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f,
  0xa8, 0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab, 0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,
  0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f,
  0xbe, 0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0, 0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
};



String lcd_rus(String source)
{
  uint16_t i, k;
  String target = String();
  unsigned char n;
  char m = {' '};
  uint8_t utf_hi_char;

  k = source.length();
  i = 0;

  while (i < k)
  {
    n = source[i];
//    DBG_OUT_PORT.print("n = ");
//    DBG_OUT_PORT.println(n, HEX);

    if (n >= 0x80 && n < 0xD2)   // UTF-8 handling
    {
      if (n >= 0xC0) utf_hi_char = n - 0xD0;
      else
      {
        n &= 0x3F;
        if (!utf_hi_char && (n == 1)) m = (0xA2); // ё
        else if ((utf_hi_char == 1) && (n == 0x11)) m = (0xB5); // Ё
        else m = pgm_read_byte_near(utf_recode + n + (utf_hi_char << 6) - 0x10);
      }
    }
    else m = n;

    if (n != 0xD0 && n != 0xD1) target += String(m);

    i++;
  }
  return target;
}

Пользуйтесь. Вставьте в свой скетч и для того чтобы напечатать по русски набирайте lcd.print(lcd_rus("Привет");

Библиотека liquid crystall rus не нужна 

Подходит только для дисплеев с кириллическим знакогенератором

Чет не работает...

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

const unsigned char utf_recode[] PROGMEM =
{ 0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4, 0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f,
  0xa8, 0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab, 0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,
  0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f,
  0xbe, 0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0, 0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
};



String lcd_rus(String source)
{
  uint16_t i, k;
  String target = String();
  unsigned char n;
  char m = {' '};
  uint8_t utf_hi_char;

  k = source.length();
  i = 0;

  while (i < k)
  {
    n = source[i];
//    DBG_OUT_PORT.print("n = ");
//    DBG_OUT_PORT.println(n, HEX);

    if (n >= 0x80 && n < 0xD2)   // UTF-8 handling
    {
      if (n >= 0xC0) utf_hi_char = n - 0xD0;
      else
      {
        n &= 0x3F;
        if (!utf_hi_char && (n == 1)) m = (0xA2); // ё
        else if ((utf_hi_char == 1) && (n == 0x11)) m = (0xB5); // Ё
        else m = pgm_read_byte_near(utf_recode + n + (utf_hi_char << 6) - 0x10);
      }
    }
    else m = n;

    if (n != 0xD0 && n != 0xD1) target += String(m);

    i++;
  }
  return target;
}

Пользуйтесь. Вставьте в свой скетч и для того чтобы напечатать по русски набирайте lcd.print(lcd_rus("Привет");

Библиотека liquid crystall rus не нужна 

Подходит только для дисплеев с кириллическим знакогенератором

Чет не работает...

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

не ответ. признаки "не работает" есть?

/кусок скетча, фотки, логи..../

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

не ответ. признаки "не работает" есть?

/кусок скетча, фотки, логи..../

//#include <LiquidCrystalRus.h>// LiquidCrystalRus-master
#include <LiquidCrystal.h>


//#include <LiquidCrystal_1602_RUS.h>

/*

  Karadiolcd16x2.ino
  
*/
// include the library code:
//#include <LiquidCrystal_1602_RUS.h>
/*
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
*/
 
#define version 1.0
#include <EEPROM.h>
// constants
const int  BAUD            = 9600;  // 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

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

// Character array pointers
     char  msg[]       = {"РАДИО на LCD"}; //

  // char  msg[]       = {"Karadio lcd"}; //
   char  msg1[]      = {"(c) KaraWin"}; //
   char  blank[]     = {"                "};
// Karadio specific data
#define BUFLEN  200
#define LINES	2
char line[BUFLEN]; // receive buffer
char station[BUFLEN]; //received station
char title[BUFLEN];	// received title
char nameset[BUFLEN];
char* lline[LINES] ; // array of ptr of n lines 
int  iline[LINES] ; //array of index for scrolling
byte  tline[LINES] ;
char* ici;
unsigned index = 0;
unsigned loopcount = 0;
unsigned scrl = 0;


int x = 16;		//Width
char temp;

 // initialize the library with the numbers of the interface pins
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//LiquidCrystal_1602_RUS lcd(12, 11, 5, 4, 3, 2); // pins for RS, E, DB4, DB5, DB6, DB7
//LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
////////////////////////////////////////
// Clear all buffers and indexes
void clearAll()
{
      title[0] = 0;
      station[0]=0;
	  for (int i=0;i<LINES;i++)
	  {
      lline[i] = NULL;iline[i] = 0;tline[i] = 0;
       lcd.setCursor(0, i);
       lcd.print(blank);
	  }
}
////////////////////////////////////////
void cleartitle()
{
     title[0] = 0;
     for (int i = 1 ;i<LINES;i++)  // clear lines
     {
        lline[i] = NULL;
	      iline[i] = 0;
	      tline[i] = 0; 
        lcd.setCursor(0, i);
        lcd.print(blank);
     }  
     draw();
}


////////////////////////////////////////
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)); 
  *str = 0;
}

////////////////////////////////////////
void eepromWriteStr(int addr, char* str)
{
  byte rd;
  do {
    EEPROM.write( addr++,*str);
    rd = *str;
    str++;
  } while (( rd != 0)&&( rd != 0xFF)); 
  EEPROM.write( addr,0);
}


////////////////////////////////////////
// parse the karadio received line and do the job
void parse(char* line)
{
  int mul;
//     removeUtf8((byte*)line);
//   Serial.println(line);
 ////// Meta title
   if ((ici=strstr(line,"META#: ")) != NULL)
   {
     cleartitle(); 
     strcpy(title,ici+7);    
	 lline[1] = title; 
	 draw();	
   } else 
 
 ////// ICY0 station name
   if ((ici=strstr(line,"ICY0#: ")) != NULL)
   {
      int len;
      clearAll();
	  if (strlen(ici+7) == 0) strcpy (station,nameset);
      else strcpy(station,ici+7);
	  lline[0] = station;
	  draw();
   } else
 ////// STOPPED  
   if ((ici=strstr(line,"STOPPED")) != NULL)
   {
       cleartitle();
       strcpy(title,"STOPPED");
	   lline[1] = title;
	       draw();	
   }    
 /////// Station Ip      
   else  
   if ((ici=strstr(line,"Station Ip: ")) != NULL) 
   {
       char oip[20];
//   Serial.println(line);
       eepromReadStr(EEaddrIp, oip);
       if ( strcmp(oip,ici+12) != 0)
         eepromWriteStr(EEaddrIp,ici+12 ); 
   }
}


////////////////////////////////////////
//Setup all things, check for contrast adjust and show initial page.
void setup(void) {
    char oip[20];
   Serial.begin(BAUD);
   while (!Serial) { ;}

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  pinMode(13, OUTPUT); // led
//    Serial.println(F("Free RAM available:")) ;
//    Serial.print(freeRam());
	lcd.clear();
  lcd.noAutoscroll() ;

  lcd.print(msg);
  lcd.setCursor(0, 1);
  lcd.print(msg1);
  delay(3000); 
  clearAll();
	eepromReadStr(EEaddrIp, oip);
	lline[0] = (char*)"IP:";
	lline[1] = oip;
	draw();

}

////////////////////////////////////////
// receive the esp8266 stream
void serial()
{
    char temp;
    while ((temp=Serial.read()) != -1)
    {
	    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;
	    }
    }
}

////////////////////////////////////////
// draw all lines
void draw()
{
    lcd.clear();
		for (int i = 0;i < LINES;i++)
		{
			serial();
      lcd.setCursor(0, i);
			if ((lline[i] != NULL)) lcd.print(lline[i]+iline[i]);
      delay(1);
		}
}
////////////////////////////////////////
// scroll each line
void scroll()
{
unsigned len;
	for (int i = 0;i < LINES;i++)
	{   
	   if (tline[i]>0) 
	   {
	     if (tline[i] == 4) iline[i]= 0;
	     tline[i]--;		 
	   } 
	   else
	   {
		   len = strlen(lline[i]+(iline[i]));
		   if (len > x) iline[i]++;
		  else 
			{tline[i] = 6;}
	   }
	}
	draw();
}

////////////////////////////////////////
void loop(void) {
	serial();
    if (loopcount++ == 0xffff)
    {
	    loopcount = 0;
		if (++scrl%6 == 0) digitalWrite(13, HIGH);	
		scroll();	
		digitalWrite(13, LOW);
    }
}

///////////////////////////////////////////
const unsigned char utf_recode[] PROGMEM =
{ 0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4, 0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f,
  0xa8, 0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab, 0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,
  0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f,
  0xbe, 0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0, 0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
};



String lcd_rus(String source)
{
  uint16_t i, k;
  String target = String();
  unsigned char n;
  char m = {' '};
  uint8_t utf_hi_char;

  k = source.length();
  i = 0;

  while (i < k)
  {
    n = source[i];
//    DBG_OUT_PORT.print("n = ");
//    DBG_OUT_PORT.println(n, HEX);

    if (n >= 0x80 && n < 0xD2)   // UTF-8 handling
    {
      if (n >= 0xC0) utf_hi_char = n - 0xD0;
      else
      {
        n &= 0x3F;
        if (!utf_hi_char && (n == 1)) m = (0xA2); // ё
        else if ((utf_hi_char == 1) && (n == 0x11)) m = (0xB5); // Ё
        else m = pgm_read_byte_near(utf_recode + n + (utf_hi_char << 6) - 0x10);
      }
    }
    else m = n;

    if (n != 0xD0 && n != 0xD1) target += String(m);

    i++;
  }
  return target;
}

 

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

Прикладываю фото. В одном случае не работает, в другом работает.

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

по фото конечно видно какой не работает, но точно по фото не определить "почему"

Я вижу на самом деле тоже два пути - первый вы сами добиваетесь чтобы работало

второй https://github.com/pilnikov/Karadio-addon-lcd1602-rus, но для него нужна еще одна есп8266 и pcf8574. Хотя часть кода можно попробовать запустить на уно (по крайней мере парсер, декодер и драйвер экрана). Также выше я для kombatus'a давал пример скеча с модифицированным парсером и serial()

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

по фото конечно видно какой не работает, но точно по фото не определить "почему"

Я вижу на самом деле тоже два пути - первый вы сами добиваетесь чтобы работало

второй https://github.com/pilnikov/Karadio-addon-lcd1602-rus, но для него нужна еще одна есп8266 и pcf8574. Хотя часть кода можно попробовать запустить на уно (по крайней мере парсер, декодер и драйвер экрана). Также выше я для kombatus'a давал пример скеча с модифицированным парсером и serial()

Если я правильно понял, то вся схема будет состоять из радио блока (VS+ESP+усилитель НЧ) и блока управления (LCD типа "МЭЛТ" с I2C-переходником+ESP)? 

А можно посмотреть фото или видео, что это в конечном варианте будет представлять собой? Удобно ли таким пультом пользоваться будет? Наверное нужен еще аккумулятор дополнительно для питания блока управления?

И еще вопрос по скетчу, который я предоставил. Там переменная "i", она не повторяется случайно? Так и должно быть?

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

Переменные бывают локальные, это когда они используются внутри функции только, и глобальные, которые об^являются один раз в начале программы и действуют для любой ее части. Локальные могут быть с одним и тем же именем для разных функций.
Видео тут youtube.com/watch?v=1wGhiEEFEFc
Батарейка, да нужна.
Еще надо допилить/пригладить энкодер. Либо сделать на кнопках. Имхо на них удобнее. Дописать парочку мессаг на экранчик в части отображения уровня громкости.
Поможете?

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

Кстати большинство оригинальных аддонов для карадио есть не что иное как драйвер экрана только. И подключаются все по ком порту, т.е. проводом.

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:
Переменные бывают локальные, это когда они используются внутри функции только, и глобальные, которые об^являются один раз в начале программы и действуют для любой ее части. Локальные могут быть с одним и тем же именем для разных функций. Видео тут youtube.com/watch?v=1wGhiEEFEFc Батарейка, да нужна. Еще надо допилить/пригладить энкодер. Либо сделать на кнопках. Имхо на них удобнее. Дописать парочку мессаг на экранчик в части отображения уровня громкости. Поможете?

Про переменую "i" стало ясно. 

Видео уже смотрел раньше. Теперь понятно к чему оно относится.

Даже не знаю чем я смогу помочь со своим уровнем знаний, особенно в написании программ?

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

там нет ничего сложного, и в основном нужно не написание, а идеи "как реализовать" + потестить

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

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

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

там нет ничего сложного, и в основном нужно не написание, а идеи "как реализовать" + потестить

Если только потестить, то мне нужно приобрести еще один дисплей с поддержкой русского и ESP-шку. Имеется китайский LCD.

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

Дисплей же есть вроде? Вам надо тока есп (200р) и платку pcf8574(50р)

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:
Дисплей же есть вроде? Вам надо тока есп (200р) и платку pcf8574(50р)

Дисплей буду на днях встраивать на постоянку. А заказывать остальные детали все равно нужно. Китайский вариант дисплея не подойдет?

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

пойдет, но вам придется самому его адаптировать