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

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

толстый пишет:

Нескромный вопрос, а карадио у Вас вообще  работает? Звук то есть? Может оно тупо не запускается и выводить то нечего. Стандартными дисплеями, я так понял, проверить не выйдет?  Короче: лог ESP в студию(с)

Все работает, станции гоняет, подключается мгновенно. 

Опрос с порта есп:

plugin size 234 117 
plugin sta⸮⸮a⸮k⸮⸮⸮q⸮⸮⸮⸮c⸮ޡ⸮b⸮⸮S⸮⸮R!a⸮⸮⸮⸮⸮⸮A⸮b\a^⸮⸮⸮⸮⸮⸮a⸮aB⸮⸮%DZ⸮cS⸮B⸮qA⸮⸮V.⸮F⸮⸮A⸮⸮⸮A⸮Bb⸮⸮AQC5⸮⸮A@s!⸮Wu⸮e⸮⸮L⸮Z⸮!⸮5
External ram not detected
 
uart speed: 19200
Release 1.9, Revision 6
SDK 2.0.0(30727a0)
data  : 0x3ffe8000 ~ 0x3ffe8874, len: 2164
rodata: 0x3ffe8880 ~ 0x3ffe92e0, len: 2656
bss   : 0x3ffe92e0 ~ 0x3fff0bd8, len: 30968
heap  : 0x3fff0bd8 ~ 0x40000000, len: 62504
Heap size: 39352
size_map: 4
Eeprom_start: 3e0000
Eeprom_start1: 3d0000
Flash size: 4194304
t0 task: 40108870
t1 task: 401088c8
t2 task: 40108920
t3 task: 40108978
t4 task: 401089d0
Heap size: 32432
mode : sta(40:f5:20:2e:19:84)
add if0
SCI_Mode (0x4800) = 0x4802
SCI_Status (0x48) = 0x4C
VS Version (VS1053 is 4) = 4
SCI_ClockF = 0xB800
I2S Speed: 0
device: 40108a58
plugin size 6350 3175 
plugin start: 7 1 8050 6
plugin size 234 117 
plugin start: 7 1 8f00 6
volume: 78
UART READY
AP1: TP-LINK_B3F792, AP2: 
 AP1:Station Ip: 192.168.0.100
Trying TP-LINK_B3F792 ,  I: 0 status: 1
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 5
pm open phy_2,type:2 0 0
cnt 
 
connected with TP-LINK_B3F792, channel 1
dhcp client start...
ip:192.168.0.100,mask:255.255.255.0,gw:192.168.0.1
 AP1:Station Ip: 192.168.0.100
No panel
I2S Speed: 0
autostart: playing:1, currentstation:3
##CLI.STOPPED# from playStationInt
##CLI.NAMESET#: 3 Loungefm - Chillout
##CLI.URLSET#: cast.loungefm.com.ua
##CLI.PATHSET#: /chillout128
##CLI.PORTSET#: 80
##CLI.OVOLSET#: 0
##CLI.VOL#: 78
##CLI.ICY5#: 128
##CLI.ICY7#:  ice-samplerate=44100;ice-bitrate=128;ice-channels=2
##CLI.PLAYING#
 
##CLI.META#: Claes Rosen - Ivory Bells Part 2 (Original Mix)
 
толстый
Offline
Зарегистрирован: 10.02.2020

Почитал про аддон. Он обязан работать с KaRadio на ESP8266 ибо разрабатывался под него.

У меня в логе есть эти пункты, а они типа нужны  программе для вывода инфы  ##CLI.ICY0#: at IP 192.168.0.101 и ##CLI.ICY0#: JamendoLounge

Варианта два: программа или электрика.

1. Пробуйте прошить скетч с OLD. А в ESP замените скорость порта на 28800. Вдруг эта версия специально под 8266. А без old под 32

2. Убедитесь что есть контакт между TX-ESP и RX-arduino(тестер). Убедитесь,что RX передает данные(как я хз). Убедитесь , что RX ардуинки принимает. Проще всего прошить пустой скетч и закоротив RX-TX на ардуине(от ESP отсоединить - спалите порт) послать в монитор символ.- должен вернутся тот-же.

twaen
Offline
Зарегистрирован: 31.07.2020

Добрый день, заказал на али psram64h (3.3v) и не могу найти схему как подключить к esp-wroom-32.

Максимум что выдал гугл :

https://thingpulse.com/esp32-how-to-use-psram/

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/external-ram.html

благодарю за любую помощь

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

twaen пишет:

Добрый день, заказал на али psram64h (3.3v) и не могу найти схему как подключить к esp-wroom-32.

Максимум что выдал гугл :

https://thingpulse.com/esp32-how-to-use-psram/

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/external-ram.html

благодарю за любую помощь

Посмотрите у меня в блоге - как я себе делал...

LINK - PSRAM

twaen
Offline
Зарегистрирован: 31.07.2020

спс

а как узнать номер ревизии?

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

twaen пишет:

спс

а как узнать номер ревизии?

В расширенных логах можно посмотреть, есть несколько логов - какая команда не помню - попробуйте перебрать.

DMS
Offline
Зарегистрирован: 09.01.2020

Хочу заказать ардуину, вдруг понадобится (дисплей подключить или еще чего), а под рукой нет.

Какую лучше брать?

Чето их много всяких... про, нано, 5В, 3В, 168, 328, с usb и без...

twaen
Offline
Зарегистрирован: 31.07.2020

uno r3 5v 328 самая нормальная

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

twaen пишет:

uno r3 5v 328 самая нормальная

А чем Nano 328 не угодила? под небольшие проекты само то, и размер соответственно.

twaen
Offline
Зарегистрирован: 31.07.2020

ShAlex13 пишет:

А чем Nano 328 не угодила? под небольшие проекты само то, и размер соответственно.

ну хотя бы шилды подключать будет по сложнее

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

twaen пишет:

ну хотя бы шилды подключать будет по сложнее

Шилды это уже для мажоров :)

Q100
Offline
Зарегистрирован: 18.02.2019

pilnikov пишет:

 

 

Такая получилась конструкция в сборе. Усилитель управляется сигналом светодиода "Status" + гаснет при подключении ушей. От лития тоже работает. Шумов стало на порядок меньше. Пока не припаял дисплей - вообще было не понятно: стартует или нет - резко начинало играть при подключении к станции. 

 

Когда (где,почем) можно будет заказать:)?

SinglWolf
SinglWolf аватар
Offline
Зарегистрирован: 15.12.2019

PlatformIO наконец-то умеет menuconfig из коробки...

Радиола успешно переехала на ESP-IDF ver. 4.1.0 и потихоньку обзаводится menuconfig`ом на русском языке.

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

Q100 пишет:

Когда (где,почем) можно будет заказать:)?

Pilnikov собака inbox.ru

DM86
Offline
Зарегистрирован: 11.09.2020

И снова та же песня) Пока китайцы несут 32ю плату, рашил побаловаться дислеем от самсунг, и он вполне себе хорошо и просто запустился. Но вот незадача, скачал прошивку для i2c дисплея 1602, и попробовал скомпилировать и тут ошибка, как я понимаю своими примитивными знаниями, проблема с объявлением подключаемых выводов для библиотеки i2c, сами библы все установлены. Хочу esp8266 подружить для вывода инфы о радиостанции  в karadio с этим дисплеем. Элементарно не то что зашить, так скомпилировать не выходит. Не пойму в чем дело, подскажите пожалуйста, в чем проблема....

 

Catbear
Catbear аватар
Offline
Зарегистрирован: 14.10.2019

Опять вопрос не совсем по теме: а каким припоем лучше паять мелкие smd? Аля как у Pilnikov на платах? Если можно с ссылкой. Подскажите пожалуйста!

miha2011
Offline
Зарегистрирован: 19.03.2020

Добрый день.

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

Что бы он работал как проекционные часы.

SinglWolf
SinglWolf аватар
Offline
Зарегистрирован: 15.12.2019

miha2011 пишет:
Добрый день.
А к радио нельзя привязать проекционный экран, что бы все проекцировать например на стену?
Что бы он работал как проекционные часы.

Идея интересная. Знать бы как с радио пересылать инфу на это устройство.
Ссылки, даташит, библиотеки есть?

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

SinglWolf пишет:

miha2011 пишет:
Добрый день.
А к радио нельзя привязать проекционный экран, что бы все проекцировать например на стену?
Что бы он работал как проекционные часы.

Идея интересная. Знать бы как с радио пересылать инфу на это устройство.
Ссылки, даташит, библиотеки есть?

Разбирался с несколькими такими "проекторами" - там тупо семисегментный индикатор и примитивная линза... куда чего посылать то?

SinglWolf
SinglWolf аватар
Offline
Зарегистрирован: 15.12.2019

nva пишет:
Разбирался с несколькими такими "проекторами" - там тупо семисегментный индикатор и примитивная линза... куда чего посылать то?

Я имел в виду не проектор, а именно девайс на картинке. Думал там tft дисплей.

miha2011
Offline
Зарегистрирован: 19.03.2020

SinglWolf пишет:

nva пишет:
Разбирался с несколькими такими "проекторами" - там тупо семисегментный индикатор и примитивная линза... куда чего посылать то?

Я имел в виду не проектор, а именно девайс на картинке. Думал там tft дисплей.

 

А эти проекторы отдельно продаются? По идее им ведь без разницы что проектировать, хоть часы хоть информацию  с радио.

Catbear
Catbear аватар
Offline
Зарегистрирован: 14.10.2019

Интересно, а кто-нибудь знает, чем примечателен этот модуль: [US$4.14]AI-Thinker® WiFi ESP8266 Upgrade ESP32 S2 Chip ESP-12K Module 100M Communication Distance Module Board from Electronic Components & Supplies on banggood
https://banggood.app.link/x0EdWT4mW9
Облегчит он что-нибудь в изготовлении Karadio? Или это что то типа vrower с доппамятью?

SinglWolf
SinglWolf аватар
Offline
Зарегистрирован: 15.12.2019

Catbear пишет:
Интересно, а кто-нибудь знает, чем примечателен этот модуль: [US$4.14]AI-Thinker® WiFi ESP8266 Upgrade ESP32 S2 Chip ESP-12K Module 100M Communication Distance Module Board from Electronic Components & Supplies on banggood https://banggood.app.link/x0EdWT4mW9 Облегчит он что-нибудь в изготовлении Karadio? Или это что то типа vrower с доппамятью?

Это модуль с чипом ESP32-S2, без расширенной памяти.
Кратко - новый проц, умеет USB OTG, 43 программируемых GPIO.
Подробно

На Али уже wrover'ы с новым чипом появились

Catbear
Catbear аватар
Offline
Зарегистрирован: 14.10.2019

SinglWolf пишет:

Catbear пишет:
Интересно, а кто-нибудь знает, чем примечателен этот модуль: [US$4.14]AI-Thinker® WiFi ESP8266 Upgrade ESP32 S2 Chip ESP-12K Module 100M Communication Distance Module Board from Electronic Components & Supplies on banggood https://banggood.app.link/x0EdWT4mW9 Облегчит он что-нибудь в изготовлении Karadio? Или это что то типа vrower с доппамятью?

Это модуль с чипом ESP32-S2, без расширенной памяти.
Кратко - новый проц, умеет USB OTG, 43 программируемых GPIO.
Подробно

На Али уже wrover'ы с новым чипом появились

Спасибо за инфо! В, общем, пока каких то революционных изменений для проекта он не несет.

Vanya venikov
Offline
Зарегистрирован: 22.09.2020

Народ, ни у кого нет информации касательно поддержки ogg vorbis в новой прошивке KA-RADIO32 версия с VS1053B? Год назад собрал, все играло, больше не пробовал, в феврале был апгрейд "по воздуху" и вот недавно попробовал несколько радиостанций ничего не работает. При этом все потоки живые, и с разным битрейтом, в том числе и дефолтный поток из прошивки autostart:

playing:1, currentstation:178

##CLI.NAMESET#: 178 Radio Ici et Maintenant

##CLI.URLSET#: radio.rim952.fr

##CLI.PATHSET#: /stream.ogg.m3u
##CLI.PORTSET#: 8001
##CLI.OVOLSET#: 0
##CLI.VOL#: 97
##CLI.URLSET#: radio.rim952.fr
##CLI.PATHSET#: /stream.ogg
##CLI.PORTSET#: 8000
##CLI.STOPPED# from C_PLIST
##CLI.ICY0#: Radio Ici & Maintenant
##CLI.ICY3#: http:\/\/radio.rim952.fr:8001\/stream.ogg
##CLI.ICY4#: Eklektik
##CLI.ICY6#: Liquidsoap Radio!
##CLI.ICY7#:  channels=2;quality=0.3;samplerate=44100
##CLI.PLAYING#
 
Ra_spb
Offline
Зарегистрирован: 22.09.2020

Доброго вечера всем.

Не пинайте сильно, уж мочи нет вычитывать... :-D

Скажите, было ли в процессе где-то допиливание на тему реконнекта в случае потери станции?

Т.е. ситуация: играет радио, радуемся. А радио (само вещание) взяло и отключилось. Может на секунду (в описании оригинального проекта на гитхабе есть про after a short while Karadio retries to relaunch, а насколько  - не ясно)  и если опаньки - то нате вам ошибку красивую, и вручную перезапуск.

А вот в моем случае низя перезапуск вручную. Совсем. Т.е. надо ждать потока -  хоть секунду, хоть час, хоть месяц с тремя ресетами по пути.

Обсуждалось такое? Ткните слепого, плиз... или просто скажите "было", я вздохну, и снова начну заново шерстить... :-P

 

PS: Сорри, наплодил дублей... думал ни одно сообщение ни ушло, а оно вон как :(

LSVPiter
Offline
Зарегистрирован: 26.01.2016

Здравствуйте,

Есть ли проект для karadio32 на wemos, в котором отрабатываются в автоматическом режиме две ситуации:

1. При кратковременном пропадании потока (но ошибка об этом сформировалась в веб-интерфейсе: "Invalid adress") автоматически с некоторым дискретом (1-5секунд) пробовать принять поток, который был до формирования ошибки?

2. В случае пропадания связи по wi-fi будет ли автоматическое подключение к сети и воспроизведение того же потока, что и до пропадания, когда wi-fi восстановится?

---------------------------

- выложенный проект (скомпелированные файлы для загрузки) автора на гитхабе предусматривает работу с разными вариантами esp32, например будет ли он работат с esp32 на wemos?

В частности как программапонимает, что установлен модуль esp32 wemos с ОЗУ обьёмом 4М? Она считывает id esp32 зашитый на заводе или надо править конфигурационный файл и заново компилировать?

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

Для пропадания вифи есть команда wifi.auto("1") 

Вемос швемос - это все просто платко-лепители. Память дополнительная определяется макросом heap, который возвращает доступный объем "кучи", сиречь оперативки.

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

Catbear пишет:

SinglWolf пишет:

Catbear пишет:
Интересно, а кто-нибудь знает, чем примечателен этот модуль: [US$4.14]AI-Thinker® WiFi ESP8266 Upgrade ESP32 S2 Chip ESP-12K Module 100M Communication Distance Module Board from Electronic Components & Supplies on banggood https://banggood.app.link/x0EdWT4mW9 Облегчит он что-нибудь в изготовлении Karadio? Или это что то типа vrower с доппамятью?

Это модуль с чипом ESP32-S2, без расширенной памяти.
Кратко - новый проц, умеет USB OTG, 43 программируемых GPIO.
Подробно

На Али уже wrover'ы с новым чипом появились

Спасибо за инфо! В, общем, пока каких то революционных изменений для проекта он не несет.

Можно попробовать собрать прошивочку под этот чип, но имхуется мне что это будет вариант только с вээской. Зато можно будет поэксперементировать с параллельными дисплеями. Гпиошек то до и больше. Еще и уэсби он борд. Это плюс. Может флешку уэсбишную сможет как плеер поиграть.

Ra_spb
Offline
Зарегистрирован: 22.09.2020

pilnikov пишет:

Для пропадания вифи есть команда wifi.auto("1")

А для ожидания потока, пока не появится, не попадалось решение?

Vanya venikov
Offline
Зарегистрирован: 22.09.2020

Прошил версию KaRadio32_19R6.bin - ogg vorbis завелся, никто не знает по поводу этого бага разработчик в курсе?

толстый
Offline
Зарегистрирован: 10.02.2020

Результат жестокого закостыливания аддона для OLED . Для LCD2004.

1.- название станции из списка

2.- название станции из тегов

3.- автор

4.- композиция.

Скроллинг отключен(не поборол). Первая строка меняется раз 5 сек. - либо название станции либо дата со временем.

Закинуть в папку karadioU8glib из скачаного karadio-addons-master. Подключение как для OLED. Проверено на KaRadio32_19R7 не самой последней.

/*

  KaradioU8glib.pde

*/

//-------------------------------------------------------
// UnComment the following line if you want the IR remote
//#define IR
// Uncomment the following line to use the IRLib2 library
//#define IRLib2
//=========================
// Uncomment your oled type
//=========================
#define oled096
//#define oled130
//#define Nokia5110
//-------------------------------------------------------

// your timezone offset
#define TZO 1

#undef SERIAL_RX_BUFFER_SIZE
#define SERIAL_RX_BUFFER_SIZE 128
#include <LiquidCrystal_I2C.h>
#include "u8glibConf.h"
#include <EEPROM.h>
#include <time.h>
#include <avr/pgmspace.h>
#ifdef IR
#ifdef IRLib2
#include <IRLibDecodeBase.h>
#include <IRLib_P01_NEC.h>
//#include <IRLib_P02_Sony.h>
//#include <IRLib_P03_RC5.h>
//#include <IRLib_P04_RC6.h>
//#include <IRLib_P05_Panasonic_Old.h>
//#include <IRLib_P06_JVC.h>
#include <IRLib_P07_NECx.h>
//#include <IRLib_P08_Samsung36.h>
//#include <IRLib_P09_GICable.h>
//#include <IRLib_P10_DirecTV.h>
//#include <IRLib_P11_RCMM.h>
//include additional protocols here
#include <IRLibCombo.h>
//#include <IRLibRecv.h>
#include <IRLibRecvPCI.h>
#else
#include "IRremote.h"
#endif
#endif


#define PIN_LED 13
#define PIN_PLAYING 12
#define  BAUD       19200   // any standard serial value: 300 - 115200

// nams <--> num of line
#define STATIONNAME 0
#define STATION1  1
#define STATION2  2
#define IP        3
#define GENRE     2
#define TITLE1    3
#define TITLE2    4
#define VOLUME    5


// constants
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


#ifdef IR
char irStr[4];
// IR define and objects
#ifdef IRLib2
#define PIN_IRRECV  2
IRrecvPCI irrecv(PIN_IRRECV);//create instance of receiver using pin PIN_IRRECV
IRdecode irDecoder;   //create decoder
IRdecode results; //create decoder
#else
#define PIN_IRRECV	11
IRrecv irrecv(PIN_IRRECV); // The IR
decode_results results;
#endif
#endif
bool state = false; // start stop on Ok key
//-----------
#ifdef IR
// Character array pointers
char  msg2[]       = {"IR+lcd V1.5"}; //
#else
char  msg2[]     = {"lcd V1.5"}; //
#endif
char  msg1[]   = {"(c) KaraWin"}; //
char  msg[]   = {" Karadio"};

// Karadio specific data
#define BUFLEN  180
#define LINES	4
char line[BUFLEN]; // receive buffer
char station[BUFLEN]; //received station
char title[BUFLEN];	// received title
char nameset[BUFLEN / 2]; // the local name of the station
char nameNum[5]; // the number of the station
char genre[BUFLEN / 2]; // the local name of the station
char* lline[LINES] ; // array of ptr of n lines
uint8_t  iline[LINES] ; //array of index for scrolling
uint8_t  tline[LINES] ;
int16_t volume;
unsigned index = 0;
unsigned loopScroll = 0;
unsigned loopDate = 0;
char oip[20];
String a;

uint16_t y ;		//Height of a line
uint16_t yy;		//Height of screen
uint16_t x ;		//Width
uint16_t z ;		// an internal offset for y

byte NOKIAcontrast;                 // LCD initialization contrast values B0 thru BF

struct tm *dt;
time_t timestamp = 0;
bool syncTime = false;
bool askDraw  = false;
bool itAskTime = true;
unsigned loopTime = 0;
LiquidCrystal_I2C lcd(0x3f, 20, 4);

////////////////////////////////////////
void u8g_prepare(void) {
  if (u8g.getWidth() == 84)
    u8g.setFont(u8g_font_5x8);
  else
    //	u8g.setFont(u8g_font_6x13);
    u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}


////////////////////////////////////////
//Setup all things, check for contrast adjust and show initial page.
void setup2()
{
  clearAll();
  lline[0] = (char*)msg;
  lline[1] = (char*)msg1;
  lline[2] = (char*)msg2;
  nameNum[0] = 0;
  eepromReadStr(EEaddrIp, oip);
  lline[3] = (char*)"IP:";
  lline[4] = oip;
  draw(0);
  digitalWrite(PIN_PLAYING, LOW);
}

void setTimer2()
{
  cli();//stop interrupts
  TCCR2A = 0;// set entire TCCR2A register to 0
  TCCR2B = 0;// same for TCCR2B
  TCNT2  = 0;//initialize counter value to 0
  // set compare match register for 1khz increments
  OCR2A = F_CPU / 1000 / 64 - 1; // (must be <256)
  // turn on CTC mode
  TCCR2A |= (1 << WGM21);
  // Set CS21 bit for 64 prescaler
  TCCR2B |= (1 << CS22) ;
  // enable timer compare interrupt
  TIMSK2 |= (1 << OCIE2A);
  sei();//allow interrupts
}

void setTimer1()
{
  //set timer1 interrupt at 4Hz
  cli();//stop interrupts
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;//initialize counter value to 0
  // set compare match register for 4hz increments
  //  OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536)
  OCR1A = F_CPU / 4096 - 1; // = (16*10^6) / (2*1024) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler
  TCCR1B |= (1 << CS12) | (1 << CS10);
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  sei();//allow interrupts
}

ISR(TIMER2_COMPA_vect)
{
  cli();//stop interrupts
  serial();
  sei();//allow interrupts
}

ISR(TIMER1_COMPA_vect)
{ //timer1 interrupt 4Hz
  if (loopTime % 4 == 0) // 1hz
  {
    timestamp++;  // time update
    loopDate++;
    if (!syncTime) itAskTime = true; // first synchro if not done
    askDraw = true;
  }
  loopScroll++;
  if ((++loopTime % 7200) == 0) itAskTime = true; // refresh ntp time every 30Mn
}


void setup(void) {
  char  msg3[] = {"Karadio"};
  Serial.begin(BAUD);
  lcd.init();
  lcd.backlight();
  while (!Serial) ;

  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_PLAYING, OUTPUT);
  pinMode(ContrastPin, INPUT);
  digitalWrite(ContrastPin, HIGH); // activate internal pullup resistor
  digitalWrite(PIN_PLAYING, LOW);

#ifdef IR
  irrecv.enableIRIn(); // Start the IR receiver
  irStr[0] = 0;
#endif

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 > 0xCF) NOKIAcontrast = 0xB8;
  u8g.setContrast(2 * (NOKIAcontrast - 0x80));
  u8g_prepare();
  y = u8g.getFontLineSpacing();
  yy = u8g.getHeight();
  x = u8g.getWidth();
  z = 0;
  clearAll();

  for (int i = 0; i < 5; i++)
  {
    u8g.firstPage();
    do {
      //  		if (!(i%2)) u8g.drawFrame(0,0,x/2-1,yy/2-1);
      //	      else u8g.drawFrame(0,0,x-1,yy-1);
      u8g.drawStr(u8g.getWidth() / 2 - (u8g.getStrWidth(msg3) / 2), u8g.getHeight() / 3, msg3);
    } while ( u8g.nextPage() );
    delay(500);
    if (i % 2)u8g.setScale2x2();
    else u8g.undoScale();
  }
  lline[0] = (char*)msg;
  lline[1] = (char*)msg1;
  //	lline[2] =(char*) msg2;
  nameNum[0] = 0;
  eepromReadStr(EEaddrIp, oip);
  lline[3] = (char*)"IP:";
  lline[4] = oip;
  draw(0);
  delay(2000);
  if (!digitalRead(ContrastPin)) {
    NOKIAcontrast += 1;
    if (NOKIAcontrast > 0xCF) NOKIAcontrast = 0xB0;
    EEPROM.write(EEaddr1, NOKIAcontrast) ;
    itoa(NOKIAcontrast, title, 16);
    lline[2] = title;
    goto ReStart;
  }
  setTimer2();
  setTimer1();
  lline[2] = (char*)msg2;
  draw(0);
}

////////////////////////////////////////
// Clear all buffers and indexes
void clearAll()
{
  title[0] = 0;
  station[0] = 0;
  for (int i = 1; i < LINES; i++) {
    lline[i] = NULL;
    iline[i] = 0;
    tline[i] = 0;
  }
}
////////////////////////////////////////
void cleartitle()
{
  title[0] = 0;
  for (int i = 3; i < LINES; i++) // clear lines
  {
    lline[i] = NULL;
    iline[i] = 0;
    tline[i] = 0;
  }
}

////////////////////////////////////////
void removeUtf8(byte *characters)
{
  int index = 0;
  while (characters[index])
  {
    if ((characters[index] >= 0xc2) && (characters[index] <= 0xc3)) // only 0 to FF ascii char
    {
      //      Serial.println((characters[index]));
      characters[index + 1] = ((characters[index] << 6) & 0xFF) | (characters[index + 1] & 0x3F);
      int sind = index + 1;
      while (characters[sind]) {
        characters[sind - 1] = characters[sind];
        sind++;
      }
      characters[sind - 1] = 0;

    }
    index++;
  }
}

////////////////////////////////////////
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);
}


////////////////////////////////////////
void separator(char* from)
{
  byte len;
  char* interp;
  len = strlen(from);
  while (from[strlen(from) - 1] == ' ') from[strlen(from) - 1] = 0; // avoid blank at end
  while ((from[0] == ' ') ) {
    strcpy( from, from + 1);
  }
  interp = strstr_PF(from, PSTR(" - "));
  if (from == nameset) {
    lline[0] = nameset;
    lline[1] = NULL;
    lline[2] = NULL;
    return;
  }
  if (interp != NULL)
  {
    from[interp - from] = 0;
    lline[(from == station) ? 1 : 3] = from;
    lline[(from == station) ? 2 : 4] = interp + 3;
  } else
  {
    lline[(from == station) ? 1 : 3] = from;
  }

}
////////////////////////////////////////
// parse the karadio received line and do the job
void parse(char* line)
{
  char* ici;
  removeUtf8((byte*)line);
  //////  reset of the esp
  if ((ici = strstr_PF(line, PSTR("VS Version"))) != NULL) setup2();
  else
    ////// Meta title
    if ((ici = strstr_PF(line, PSTR("META#: "))) != NULL)
    {
      cleartitle();
      strcpy(title, ici + 7);
      separator(title);
      askDraw = true;
    } else
      ////// ICY4 Description
      if ((ici = strstr_PF(line, PSTR("ICY4#: "))) != NULL)
      {
        //      cleartitle();
        strcpy(genre, ici + 7);
        lline[2] = genre;
        askDraw = true;
      } else
        ////// ICY0 station name
        if ((ici = strstr_PF(line, PSTR("ICY0#: "))) != NULL)
        {
          int len;
          clearAll();
          if (strlen(ici + 7) == 0) strcpy (station, nameset);
          else strcpy(station, ici + 7);
          separator(station);
          askDraw = true;
        } else
          ////// STOPPED
          if ((ici = strstr_PF(line, PSTR("STOPPED"))) != NULL)
          {
            digitalWrite(PIN_PLAYING, LOW);
            cleartitle();
            strcpy_P(title, PSTR("STOPPED"));
            separator(title);
            askDraw = true;
          }
  /////// Station Ip
          else if ((ici = strstr_PF(line, PSTR("Station Ip: "))) != NULL)
          {
            eepromReadStr(EEaddrIp, oip);
            if ( strcmp(oip, ici + 12) != 0)
              eepromWriteStr(EEaddrIp, ici + 12 );
          } else
            //////Nameset
            if ((ici = strstr_PF(line, PSTR("MESET#: "))) != NULL)
            {
              int len;
              strcpy(nameset, ici + 8);
              ici = strstr(nameset, " ");
              strncpy(nameNum, nameset, ici - nameset + 1);
              nameNum[ici - nameset + 1] = 0;
              strcpy(nameset, nameset + strlen(nameNum));
              separator(nameset);
            } else
              //////Playing
              if ((ici = strstr_PF(line, PSTR("YING#"))) != NULL)
              {
                digitalWrite(PIN_PLAYING, HIGH);
                if (strcmp_P(title, PSTR("STOPPED")) == 0)
                {
                  title[0] = 0;
                  separator(title);
                  askDraw = true;
                }
              } else
                //////Volume
                if ((ici = strstr(line, "VOL#:")) != NULL)
                {
                  volume = atoi(ici + 6);
                  askDraw = true;;
                } else
                  //////Date Time  ##SYS.DATE#: 2017-04-12T21:07:59+01:00
                  if ((ici = strstr(line, "SYS.DATE#:")) != NULL)
                  {
                    char lstr[30];
                    if (*(ici + 11) != '2') //// invalid date. try again later
                    {
                      askDraw = true;
                      return;
                    }
                    strcpy(lstr, ici + 11);
                    dt = gmtime(&timestamp);
                    int year, month, day, hour, minute, second;
                    sscanf(lstr, "%04d-%02d-%02dT%02d:%02d:%02d", &(year), &(month), &(day), &(hour), &(minute), &(second));
                    dt->tm_year = year; dt->tm_mon = month - 1; dt->tm_mday = day;
                    dt->tm_hour = hour; dt->tm_min = minute; dt->tm_sec = second;
                    dt->tm_year -= 1900;
                    timestamp = mktime(dt);
                    syncTime = true;
                  }
}


////////////////////////////////////////
// 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
        line[index++] = temp;
        if (index > BUFLEN - 1) //break; // small memory so small buffer
        {
          Serial.println(F("overflow"));
          line[index] = 0;
          parse(line);
          index = 0;
        }

    }
  }
}

////////////////////////////////////////
// draw all lines
void draw(int xx)
{
  char strsec[30];
  dt = gmtime(&timestamp);
  if (x == 84)
    sprintf(strsec, "%02d-%02d  %02d:%02d:%02d", (dt->tm_mon) + 1, dt->tm_mday, dt->tm_hour, dt->tm_min, dt->tm_sec);
  else
    sprintf(strsec, "%02d-%02d-%04d  %02d:%02d:%02d", dt->tm_mday, (dt->tm_mon) + 1, dt->tm_year + 1900, dt->tm_hour, dt->tm_min, dt->tm_sec);

  //lcd.autoscroll();
  if (dt->tm_sec % 10 == 0) lcd.clear();
  lcd.setCursor(0, 0);
  a = lline[0]; a =  a.substring(0, 20);
  if (dt->tm_sec % 10 < 5)lcd.print(a);
  else lcd.print(strsec);                    //station
  a = lline[1]; a =  a.substring(0, 20);
  lcd.setCursor(0, 1); lcd.print(a);    //title
  a = lline[3]; a =  a.substring(0, 20);
  lcd.setCursor(0, 2); lcd.print(a);    //nameset
  a = lline[4]; a =  a.substring(0, 20);
  lcd.setCursor(0, 3); lcd.print(a);    //nameNum //strsec //lline[0]



  /*
    u8g.firstPage();
    do {
      u8g.drawHLine(0, (4 * y) - (y / 2) - 5, x);
      u8g.drawBox(0, 0, x - 1, y);
      for (int i = 0; i < LINES; i++)
      {
        if (i == 0)u8g.setColorIndex(0);
        else u8g.setColorIndex(1);
        if (i >= 3) z = y / 2 - 3; else z = -1;
        if ((lline[i] != NULL))
        {
          if (i == 0)
          {
            if (nameNum[0] == 0)  u8g.drawStr(1, 0, lline[i] + iline[i]);
            else
            {
              u8g.drawStr(1, 0, nameNum);
              u8g.drawStr(u8g.getStrPixelWidth(nameNum) - 2, 0, lline[i] + iline[i]);
            }
          }
          else u8g.drawStr(0, y * i + z, lline[i] + iline[i]);
        }
        if (i == VOLUME)
        {
          u8g.drawFrame(0, y * i + z + (y / 2) - 1, x - 1, 3);
          u8g.drawHLine(0, y * i + z + (y / 2), ((uint16_t)(x * volume) / 255));
        }
      }
      //time
      //  if ((lline[4] == NULL)||(x==84))
      u8g.drawStr(x / 2 - (u8g.getStrWidth(strsec) / 2), yy - y, strsec);
    } while ( u8g.nextPage() );
  */
}
////////////////////////////////////////
// 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 = u8g.getStrWidth(lline[i] + iline[i]);
      if (i == 0)	 len += u8g.getStrWidth(nameNum) ;
      if (len > x)
      {
        iline[i]++;
        askDraw = true;
      }
      else
        tline[i] = 6;
    }
  }
  }
*/
#ifdef IR
void nbStation(char nb)
{
  if (strlen(irStr) >= 3) irStr[0] = 0;
  uint8_t id = strlen(irStr);
  irStr[id] = nb;
  irStr[id + 1] = 0;
}
void translateIR() // takes action based on IR code received
//  KEYES Remote IR codes (NEC P01)
//  and Ocean Digital remote (NEC P07)
{
#ifdef IRLib2
  if (irrecv.getResults())
  {
    results.decode();
#else
  if ((irrecv.decode(&results)))
  {
#endif

    //  Uncomment the following line to see the code of your remote control and report to the case the value
#ifdef IRLib2
    //	    Serial.print(F("Protocol:"));Serial.print(results.protocolNum);Serial.print(F("  value:"));Serial.println(results.value,HEX);
#else
    //      Serial.print(F("Protocol:"));Serial.print(results.decode_type);Serial.print(F("  value:"));Serial.println(results.value,HEX);
#endif
    //      Serial.print(F("  value:"));Serial.println(results.value,HEX);
    switch (results.value)
    {
      case 0xFF629D:
      case 0x10EF48B7:	/*(" FORWARD");*/  irStr[0] = 0; Serial.print(F("cli.next\r")); break;

      case 0xFF22DD:
      case 0x10EFA857:
      case 0x10EF42BD: /*(" LEFT");*/  irStr[0] = 0; Serial.print(F("cli.vol-\r"));  break;

      case 0xFF02FD:
      case 0x10EF7887:		/*(" -OK-");*/
        {
          //      state?Serial.print(F("cli.start\r")):Serial.print(F("cli.stop\r"));
          if (strlen(irStr) > 0)
          {
            Serial.print(F("cli.play(\"")); Serial.print(irStr); Serial.print(F("\")\r"));
            irStr[0] = 0;
          }
          else
          {
            state ? Serial.print(F("cli.start\r")) : Serial.print(F("cli.stop\r"));
            /*				  if (state)
                       Serial.print("cli.start\r");
            			  	else
            			  		Serial.print("cli.stop\r");
            */
          }
          state = !state;
          irStr[0] = 0;
          break;
        }
      case 0xFFC23D:
      case 0x10EF28D7:
      case 0x10EF827D: /*(" RIGHT");*/ irStr[0] = 0; Serial.print(F("cli.vol+\r"));  break; // volume +
      case 0xFFA857:
      case 0x10EFC837:	/*(" REVERSE");*/ irStr[0] = 0; Serial.print(F("cli.prev\r")); break;
      case 0xFF6897:
      case 0x10EF807F: /*(" 1");*/ nbStation('1');   break;
      case 0xFF9867:
      case 0x10EF40BF: /*(" 2");*/ nbStation('2');   break;
      case 0xFFB04F:
      case 0x10EFC03F: /*(" 3");*/ nbStation('3');   break;
      case 0xFF30CF:
      case 0x10EF20DF: /*(" 4");*/ nbStation('4');   break;
      case 0xFF18E7:
      case 0x10EFA05F: /*(" 5");*/ nbStation('5');   break;
      case 0xFF7A85:
      case 0x10EF609F: /*(" 6");*/ nbStation('6');   break;
      case 0xFF10EF:
      case 0x10EFE01F: /*(" 7");*/ nbStation('7');   break;
      case 0xFF38C7:
      case 0x10EF10EF: /*(" 8");*/ nbStation('8');   break;
      case 0xFF5AA5:
      case 0x10EF906F: /*(" 9");*/ nbStation('9');   break;
      case 0xFF42BD:
      case 0x10EFE817: /*(" *");*/   irStr[0] = 0; Serial.print(F("cli.stop\r")); break;
      case 0xFF4AB5:
      case 0x10EF00FF: /*(" 0");*/ nbStation('0');   break;
      case 0xFF52AD:
      case 0x10EFB847: /*(" #");*/   irStr[0] = 0; Serial.print(F("cli.start\r")); break;
      case 0xFFFFFFFF: /*(" REPEAT");*/break;
      default:;
        /*Serial.println(" other button   ");*/
    }// End Case
    ;
#ifdef IRLib2
    irrecv.enableIRIn();      //Restart receiver
#else
    irrecv.resume(); // receive the next value
#endif
  }
} //END translateIR
#endif

void askTime()
{
  if (itAskTime) // time to ntp. Don't do that in interrupt.
  {
    Serial.print(F("sys.date\r")) ;
    itAskTime = false;
  }
}

////////////////////////////////////////
void loop(void) {
#ifdef IR
  translateIR();
#endif
  // Serial.println(dt->tm_sec/10);
  // Serial.println(dt->tm_sec%10);
  // delay(500);
  // scrolling control and draw control
  if (loopScroll >= 1 ) // 500ms
  {
    digitalWrite(PIN_LED, !digitalRead(PIN_LED)); // blink led
    loopScroll = 0;
    if (askDraw) // something to display
    {
      askDraw = false;
      draw(0);
    }
    //      else
    //    scroll();
  }
  // ntp control and first info demand
  if (loopDate >= 5)
  {
    loopDate = 0;
    if (itAskTime)
    {
      if (!syncTime) // time to ntp. Don't do that in interrupt.
      {
        Serial.print(F("\rsys.tzo(\"")) ; Serial.print(TZO);
        Serial.print(F("\")\r"));
        Serial.print(F("cli.info\r")); // Synchronise the current state
        itAskTime = false;
      }
      else askTime();
    }
  }
}

 

 

Catbear
Catbear аватар
Offline
Зарегистрирован: 14.10.2019

pilnikov пишет:

Catbear пишет:

SinglWolf пишет:

Catbear пишет:
Интересно, а кто-нибудь знает, чем примечателен этот модуль: [US$4.14]AI-Thinker® WiFi ESP8266 Upgrade ESP32 S2 Chip ESP-12K Module 100M Communication Distance Module Board from Electronic Components & Supplies on banggood https://banggood.app.link/x0EdWT4mW9 Облегчит он что-нибудь в изготовлении Karadio? Или это что то типа vrower с доппамятью?

Это модуль с чипом ESP32-S2, без расширенной памяти.
Кратко - новый проц, умеет USB OTG, 43 программируемых GPIO.
Подробно

На Али уже wrover'ы с новым чипом появились

Спасибо за инфо! В, общем, пока каких то революционных изменений для проекта он не несет.

Можно попробовать собрать прошивочку под этот чип, но имхуется мне что это будет вариант только с вээской. Зато можно будет поэксперементировать с параллельными дисплеями. Гпиошек то до и больше. Еще и уэсби он борд. Это плюс. Может флешку уэсбишную сможет как плеер поиграть.

У Вас на плате есть SD карта, но она еще "в резерве". Я, наверное, пишу ерунду: раз там дохрена gpio, может с этим чипом проще ее будет задействовать, да и usb otg.

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

Плату придется перерабатывать. Надо подождать пока кто нить не прикупит зверька. И над ним поэксперементировать ;) 

толстый
Offline
Зарегистрирован: 10.02.2020

Пришла ESP8266. Прошил под KaRadio последний релиз + VS, потом на всякий обновился через OTA. Итог:

To DM86: LCD работает. Проверяйте  прошивки, настройки, соединение, живость портов.

To Vanya venikov: OGG запело только на 192 kb/s, на 64 та же (типа) станция  не поет. На ESP32 на 1.9R7 не поют обе.

толстый
Offline
Зарегистрирован: 10.02.2020

Увидел что в аддонах для карадио на STM есть подключения цифрового приёмника на IIC. Тут вроде писали, что в программе  есть закомментированные блоки для его работы. Это просто пожелания аддоно-делателей с заделом не будущее? Или обычная лень, типа что-то взяли или изменили, а поменять схему (забыли, лень, некогда, сами разберутся , чай не маленькие)? Кто-нибудь проверял? 

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

толстый пишет:

Увидел что в аддонах для карадио на STM есть подключения цифрового приёмника на IIC. Тут вроде писали, что в программе  есть закомментированные блоки для его работы. Это просто пожелания аддоно-делателей с заделом не будущее? Или обычная лень, типа что-то взяли или изменили, а поменять схему (забыли, лень, некогда, сами разберутся , чай не маленькие)? Кто-нибудь проверял? 

Как раз типа таким, на SI4735, и пытаюсь "мучаться"... Но в фуллрежиме... типа и КВ с SSB и прочим... ФоМа уж прицепом.

Но не на СТМ, а на ЕСП32

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

nva пишет:

Как раз типа таким, на SI4735, и пытаюсь "мучаться"... Но в фуллрежиме... типа и КВ с SSB и прочим... ФоМа уж прицепом.

Но не на СТМ, а на ЕСП32

Интересно, можно подробнее?

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

ShAlex13 пишет:

nva пишет:

Как раз типа таким, на SI4735, и пытаюсь "мучаться"... Но в фуллрежиме... типа и КВ с SSB и прочим... ФоМа уж прицепом.

Но не на СТМ, а на ЕСП32

Интересно, можно подробнее?

По подробнее... ну пока получается все раздельно... на одной ЕСПешке вроде получается запустить и интернетрадио и вещь от Рикардо Каррати (он написал замечательную библу для SI4735 для всеволнового эфирного приемника) ... трабла для меня как недопрограммера оформить это в визуальный фейс для тача на 9341...

толстый
Offline
Зарегистрирован: 10.02.2020

To nva: Микруха интересная, будем посмотреть. Вопрос был больше о том, что на гите у GPC для ESP и схемы правильные, и настройки на фото, и файлы. А в карадио-аддонс - то связь не дорисуют , то лишнюю приблуду добавят, то файлов каких-то лишних насуют :)

To ShAlex: Всё же это ветка для интернет радио. Всем 73.

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

толстый пишет:

To nva: Микруха интересная, будем посмотреть. 

Как то получается что СиликонЛабс уже ее потихому замещает более новыми... останутся китайские "закрома".

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

To nva: Заведите отдельную ветку "Всеволновый эфирный приемник"

Очень интересно. 73!

толстый
Offline
Зарегистрирован: 10.02.2020

Не- не-не. Ежели в коалициии с инетрадио, то туть и только туть.

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

ShAlex13 пишет:

To nva: Заведите отдельную ветку "Всеволновый эфирный приемник"

Очень интересно. 73!

Для завести и вести надо время... а его не хватает... да я и просто чаще повторяльщик... беру инфу в группе в фейсе. https://www.facebook.com/groups/532613604253401/ (не реклама), там и Рикардо постоянно онлайн, куча вариантов программы, плат, схем... герберы для своих плат брал оттуда. Там и наши соотечественники отметились..

 

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

nva пишет:

беру инфу в группе в фейсе. https://www.facebook.com/groups/532613604253401/ (не реклама), там и Рикардо постоянно онлайн, куча вариантов программы, плат, схем... герберы для своих плат брал оттуда. Там и наши соотечественники отметились..

Ради этого заводить еще одну говносеть нет желания...

DM86
Offline
Зарегистрирован: 11.09.2020

толстый пишет:

To DM86: LCD работает. Проверяйте  прошивки, настройки, соединение, живость портов.

Разобрался, все норм, работает и на 32 и на 8266.

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

Но самое главное это отсутствие кириллицы. Пробовал скачать библиотеки с кириллицей, но тогда ругается компилятор на строку begin.lcd(BAUD). Как понимаю проблема разрешима, но откуда лучше копать?

толстый
Offline
Зарегистрирован: 10.02.2020

Для замены станции: Вместо  "ICY0#: "    вставляем       "ESET#: "

Подергиваться будет так как обновляются все строки.

Ругается потому что подсовываете не ту библиотеку( с Амперки спокойно подошла). Но главное , судя по фото, русского у Вас в дисплее нет. Как вариант искать(делать) библиотеку с использованием своих символов. В начале темы было обсуждение и попытки, но по итогу всё равно будет кривенько - не более 8 русских букв на экран, остальные как повезёт.

толстый
Offline
Зарегистрирован: 10.02.2020

Ещё получилось подключить китайский LCD12864. Правда время не устанавливается, то-ли ESP8266 такая, то-ли отвалилось, то-ли уровень маленький. А проверять уже лень, т.к. использовать всё равно не буду.

 

 

nva
nva аватар
Offline
Зарегистрирован: 19.04.2019

ShAlex13 пишет:

nva пишет:

беру инфу в группе в фейсе. https://www.facebook.com/groups/532613604253401/ (не реклама), там и Рикардо постоянно онлайн, куча вариантов программы, плат, схем... герберы для своих плат брал оттуда. Там и наши соотечественники отметились..

Ради этого заводить еще одну говносеть нет желания...

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

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

nva пишет:

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

А где-то можно качнуть архив радио ESP32+SI4735 ?