ESP, IoT Интернет-радио в форме головы Бендера. Обсуждение проекта.

Ветка обсуждения проекта Интернет-радио в форме головы Бендера
Страница проекта на AlexGyver.ru: https://alexgyver.ru/benderadio/
Видео:

Делитесь своими вариантами изготовления, модификациями и улучшениями!
=========================================================================
ВНИМАНИЕ! Если у вас не компилируется или не загружается скетч - значит вы сделали что-то неправильно. Специально для вас созданы две темы:
ESP8266, проблема с компиляцией скетча
ESP8266, проблема с загрузкой скетча
Читайте (ЧИТАЙТЕ! Не пишите!) эти темы, там уже есть решение вашей проблемы.
Здесь подобные вопросы считаются оффтопом и молча удаляются, а авторы получают баллы нарушений.
 

Комментарии

alfo

✩✩✩✩✩✩✩
22 Янв 2019
7
0
Покажите myoption ёрадио, ёрадио+Бендер и Бендер.ino.
myoption одинаковый в ёрадио и в ёрадио+Бендер
да и все стандартно, от себя ничего не добавлял, использовал последнею версию bender.ino
#ifndef myoptions_h
#define myoptions_h

#define L10N_LANGUAGE RU
#endif

/*******************************************************************
Плагин для ёRadio v0.9.300 и выше https://github.com/e2002/yoradio

Плагин сырой но работает...

*******************************************************************/

//#include <SPI.h>

#include <GyverMAX7219.h>
#include <RunningGFX.h>
#include <VolAnalyzer.h>
#include <FastLED.h>


#define ANALYZ_WIDTH (3 * 8)

#define CLK_PIN 21// CLK max7219
#define DATA_PIN 23// DI max7219
#define CS_PIN 22// CS max7219

//#define AMP 14 // включение усилителя на 14пин
//#define pin_foto_res 39 // SN пин фоторезистр(на +3в) + резистор 10кОм(на землю)
#define time_EYES 1 //если убрать или закоментировать эту строчку время будет отображаться во рту


class Tmr
{
public:
Tmr() {}
Tmr(uint16_t ms)
{
start(ms);
}

void start(uint16_t ms)
{
_prd = ms;
if (_prd) start();
}
void start()
{
if (!_prd) return;
_tmr = millis();
if (!_tmr) _tmr = 1;
}
void timerMode(bool mode)
{
_mode = mode;
}
void stop()
{
_tmr = 0;
}
bool state()
{
return _tmr;
}
bool tick()
{
return (_tmr && millis() - _tmr >= _prd) ? ((_mode ? stop() : start()), true) : false;
}
operator bool()
{
return tick();
}

private:
uint32_t _tmr = 0, _prd = 0;
bool _mode = 0;
};

MAX7219<5, 1, CS_PIN, DATA_PIN, CLK_PIN> mtrx;
RunningGFX run(&mtrx);

char pstr_g[100] = "ё-радио Bender";

byte vol_old;
byte num_old;
bool pulse = 0;
byte inf = 0;

#define STACK_SIZE 1024*2 /* Размер стека функции */

TaskHandle_t MaxTask;
//------------------------------------------
//недокументированные пременные
#define NUMNEXT display.numOfNextStation //
#define VOLUME config.store.volume

#define WEATHER_S config.store.showweather // триггер показа погоды
#define NUMSTAT_S config.store.numplaylist // триггер показа номера станции
#define NUMSTAT config.store.lastStation // номер станции
#define NAMESTAT config.station.name // имя станции

#define EYES config.store.brightness
#define MOUTH config.store.contrast


#define TITLE config.station.title
#define WEATHER network.weatherBuf // строка погоды

VolAnalyzer sound;
Tmr square_tmr(300);
Tmr eye_tmr(150);
Tmr matrix_tmr(1000);
Tmr bright_tmr(1000);

void yoradio_on_setup()
{
#if (AMP>0)
pinMode(AMP, OUTPUT); // пин AMP как выход
#endif
mtrx.setBright(5); // яркость 0..15
xTaskCreatePinnedToCore(loopMaxTask, "MaxTask", STACK_SIZE, NULL, 4, &MaxTask, !xPortGetCoreID());
mtrx.begin();
run.setSpeed(30);
run.setText_P(pstr_g);
run.setWindow(0, ANALYZ_WIDTH-1, 0);
run.start();
}

void upd_bright()
{
#if (pin_foto_res > 0) //если пин фоторезистора указан
int osv = analogRead(pin_foto_res);
switch (osv)
{
case 0 ... 1000: mtrx.setBright(0); break;
case 3000 ... 4095: mtrx.setBright(15); break;
default: mtrx.setBright(map(osv, 1000, 3000, 0, 15)); break;
}
#else
uint8_t m = MOUTH, e = EYES;
uint8_t br[] = {m, m, m, e, e};
mtrx.setBright(br);
#endif
}

void print_val(char c, uint8_t v)
{
mtrx.rect(0, 0, ANALYZ_WIDTH - 1, 7, GFX_CLEAR);
mtrx.setCursor(8 * 0 + 2, 1);
mtrx.print(c);
mtrx.setCursor(8 * 1 + 2, 1);
mtrx.print(v / 10);
mtrx.setCursor(8 * 2 + 2, 1);
mtrx.print(v % 10);
mtrx.update();
}

// ========================= EYES =========================
void draw_eye(uint8_t i) //рисуем глаз i=0 (левый) i=1 (правый)
{
uint8_t x = ANALYZ_WIDTH + i * 8;
mtrx.rect(1 + x, 1, 6 + x, 6, GFX_FILL); //рисование прямоугольника глаз
mtrx.lineV(0 + x, 2, 5); //рисование линий чтобы скруглить глаза
mtrx.lineV(7 + x, 2, 5); //рисование линий чтобы скруглить глаза
mtrx.lineH(0, 2 + x, 5 + x); //рисование линий чтобы скруглить глаза
mtrx.lineH(7, 2 + x, 5 + x); //рисование линий чтобы скруглить глаза
}

void draw_eyeb(uint8_t i, int x, int y, int w = 2) //рисуем зрачок
{
x += ANALYZ_WIDTH + i * 8;
mtrx.rect(x, y, x + w - 1, y + w - 1, GFX_CLEAR);
}

void eye_ch() //глаза удивленные
{
mtrx.clear();
draw_eye(0);
draw_eye(1);
draw_eyeb(0, 4, 3, 3);
draw_eyeb(1, 1, 3, 3);
mtrx.update();
}

void anim_search() // анимация поиск wifi
{
static int8_t pos = 4, dir = 1;
static Tmr tmr(50);
if (tmr)
{
pos += dir;
if (pos >= 6) dir = -1;
if (pos <= 0) dir = 1;
mtrx.rect(ANALYZ_WIDTH, 2, ANALYZ_WIDTH + 16 - 1, 5, GFX_FILL);
draw_eyeb(0, pos, 3);
draw_eyeb(1, pos, 3);
mtrx.update();
}
}

void Show_time(uint8_t h, uint8_t m, uint8_t s) //void Show_time(uint8_t h, uint8_t m)
{
//upd_bright();
//mtrx.clear();
#if (time_EYES == 1)
drawNumber(h/10, ANALYZ_WIDTH+0, 1); // Первая цифра часа
drawNumber(h%10, ANALYZ_WIDTH+4, 1); // вторая цифра часа
drawNumber(m/10, ANALYZ_WIDTH+9, 1); // Первая цифра минут
drawNumber(m%10, ANALYZ_WIDTH+13, 1); // вторая цифра минут nowTm.minute()
#else
drawNumber(h/10, 1, 1); // Первая цифра часа
drawNumber(h%10, 5, 1); // вторая цифра часа
drawNumber(m/10, 9, 1); // Первая цифра минут
drawNumber(m%10, 13, 1); // вторая цифра минут nowTm.minute()
drawNumber(s/10, 17, 1); // Первая цифра секунд
drawNumber(s%10, 21, 1); // вторая цифра секунд nowTm.minute()
#endif

mtrx.update();
}

void square_state() //квадратные глаза
{
square_tmr.start(400);
draw_eye(0);
draw_eye(1);
draw_eyeb(0, 2, 2, 4);
draw_eyeb(1, 2, 2, 4);
mtrx.update();
}


void angry_state() //злые глаза
{
square_tmr.start(400);
draw_eye(0);
draw_eye(1);
draw_eyeb(0, 3, 3);
draw_eyeb(1, 3, 3);
mtrx.lineH(0, ANALYZ_WIDTH, ANALYZ_WIDTH + 16 - 1, GFX_CLEAR);
mtrx.lineH(1, ANALYZ_WIDTH + 5, ANALYZ_WIDTH + 5 + 6 - 1, GFX_CLEAR);
mtrx.lineH(2, ANALYZ_WIDTH + 6, ANALYZ_WIDTH + 6 + 4 - 1, GFX_CLEAR);
mtrx.lineH(3, ANALYZ_WIDTH + 7, ANALYZ_WIDTH + 7 + 2 - 1, GFX_CLEAR);
mtrx.update();
}

void change_state() //призакрытые глаза
{
square_tmr.start(1000);
mtrx.clear();
draw_eye(0);
draw_eye(1);
mtrx.rect(ANALYZ_WIDTH, 0, ANALYZ_WIDTH + 16 - 1, 3, GFX_CLEAR);
draw_eyeb(0, 3, 5);
draw_eyeb(1, 3, 5);
mtrx.update();
}

void run_str()
{
strcpy(pstr_g, TITLE); //Копирует TITLE в pstr_g
run.setText(pstr_g); // строковая константа TITLE NAMESTAT
run.start();
}

void drawNumber(int num, int x, int y)
{
// Обновленные паттерны для каждой цифры с увеличенной высотой
byte patterns[10][6][3] = {
{{1,1,1}, {1,0,1}, {1,0,1}, {1,0,1}, {1,0,1}, {1,1,1}}, // 0
{{0,1,0}, {1,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {1,1,1}}, // 1
{{1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}, {1,0,0}, {1,1,1}}, // 2
{{1,1,1}, {0,0,1}, {1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}}, // 3
{{1,0,1}, {1,0,1}, {1,0,1}, {1,1,1}, {0,0,1}, {0,0,1}}, // 4
{{1,1,1}, {1,0,0}, {1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}}, // 5
{{1,1,1}, {1,0,0}, {1,0,0}, {1,1,1}, {1,0,1}, {1,1,1}}, // 6
{{1,1,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}}, // 7
{{1,1,1}, {1,0,1}, {1,1,1}, {1,0,1}, {1,0,1}, {1,1,1}}, // 8
{{1,1,1}, {1,0,1}, {1,1,1}, {0,0,1}, {0,0,1}, {1,1,1}}};// 9

// Рисуем цифру в соответствии с паттерном
for (int i = 0; i < 6; i++) //i = 0,1,2,3,4,5
{
for (int j = 0; j < 3; j++) //j = 0,1,2
{
mtrx.dot(x + j, y + i, patterns[num][j]);
}
}
}

// ========================= ANALYZ =========================
///*
void analyz0(uint8_t vol)
{
static uint16_t offs;
offs += 20 * vol / 100;
for (uint8_t i = 0; i < ANALYZ_WIDTH; i++)
{
int16_t val = inoise8(i * 50, offs);
val -= 128;
val = val * vol / 100;
val += 128;
val = map(val, 45, 255 - 45, 0, 7);
mtrx.dot(i, val);
}
}

int gettime()
{
#if RTCSUPPORTED
rtc.getTime(&network.timeinfo);
#endif
//strftime(pstr_g , sizeof(pstr_g), "%H%M", &network.timeinfo);
strftime(pstr_g , sizeof(pstr_g), "%H%M%S", &network.timeinfo);
return atoi(pstr_g);
}


void loopMaxTask(void * pvParameters)
{
sound.setAmpliDt(200);
sound.setTrsh(0);
sound.setPulseMin(50);
sound.setPulseMax(99);

square_tmr.timerMode(1);

while (WiFi.status() != WL_CONNECTED)
{
anim_search();
run.tick();
if (WiFi.getMode()==WIFI_AP)
{
run.stop();
strcpy(pstr_g, "Создана точка: ");
strcat(pstr_g, apSsid); // strcat(str1, str2); Прибавляет str2 к str1
strcat(pstr_g, " с паролем: ");
strcat(pstr_g, apPassword);
run.setText(pstr_g); //
mtrx.clear();
run.start();
eye_ch();
break;
}
vTaskDelay(1);//
}

while (WiFi.getMode()==WIFI_AP)
{
if (run.tick()==2)
{
run.stop();
#if RTCSUPPORTED
Show_time(gettime()/10000, gettime()%10000/100, gettime()%100);
#endif
strcpy(pstr_g, "для настройки зайдите на http:/192.168.4.1/ ");
run.setText(pstr_g);
run.start();
}
vTaskDelay(1);//
}

vol_old = VOLUME;
num_old = NUMSTAT;

while(true)
{ // ============ LOOP ===============

square_tmr.tick();

if (bright_tmr) upd_bright(); //1раз в секунду обновление яркости

max7219();

vTaskDelay(1);//
} // ============ LOOP ===============
vTaskDelete( NULL );//
} //loopMaxTask
//------------------------------------------------------

void max7219()
{
static int f_vol = 0;
static int f_num = 0;

// изменение номера станции
if (NUMSTAT != num_old and inf>0)
{
eye_ch();
num_old = NUMSTAT;

switch (NUMSTAT)
{
case 0 ... 99: print_val('s', NUMSTAT); break;
case 100 ... 999:
mtrx.rect(0, 0, ANALYZ_WIDTH - 1, 7, GFX_CLEAR);
mtrx.setCursor(8 * 0 + 2, 1);
mtrx.print("s");

drawNumber(NUMSTAT/100, 8, 1); // Первая цифра
drawNumber((NUMSTAT%100)/10, 12, 1); // вторая цифра
drawNumber(NUMSTAT%10, 16, 1); // третья цифра
mtrx.update();

break;
}


f_num= 100 * 2; // 1 секунды показ станции
inf=1;
}

if (f_num != 0)
{
f_num--;
if (f_num >0)
{
delay(10);
return;
}
else
{
run.setText(NAMESTAT);
run.start();
square_state();
}
}
// изменение номера станции end


// громкость
if (VOLUME != vol_old and inf>0)
{
if (player.status() == PLAYING)
angry_state();
vol_old = VOLUME;
f_vol= 100 * 2; // 2 секунды показ громкости

switch (VOLUME)
{
case 0 ... 99: print_val('v', VOLUME); break;
case 100 ... 254:
mtrx.rect(0, 0, ANALYZ_WIDTH - 1, 7, GFX_CLEAR);
mtrx.setCursor(8 * 0 + 2, 1);
mtrx.print("v");

drawNumber(VOLUME/100, 8, 1); // Первая цифра
drawNumber((VOLUME%100)/10, 12, 1); // вторая цифра
drawNumber(VOLUME%10, 16, 1); // третья цифра
mtrx.update();

break;
}

}
if (f_vol != 0)
{
f_vol--;
if (f_vol >0)
{
delay(10);
return;
}
else
{
if (player.status() != PLAYING)
{
mtrx.rect(0, 0, ANALYZ_WIDTH - 1, 7, GFX_CLEAR);
mtrx.update();
}
}
}
// громкость end

switch (display.mode())
{

case PLAYER:
{
if (player.status() == PLAYING) //-----------PLAYNG-------------------
{
switch (inf)
{
case 0: //было выключено
case 20:
if (run.tick()==2)
{
// upd_bright();
eye_ch();
#if (AMP>0)
digitalWrite (AMP, HIGH); //при включении высокий уровень
#endif
strcpy(pstr_g, "подключено с ip: ");
strcat(pstr_g, WiFi.localIP().toString().c_str());
strcat(pstr_g, " ");
strcat(pstr_g, NAMESTAT);
run.setText(pstr_g);
run.start();
inf=10;
}
break;

case 21: inf=1; break;

case 1 ... 9: //было остановлено или смена станции
mtrx.clear();
square_state();
inf=10;
#if (AMP>0)
digitalWrite (AMP, HIGH); //при включении высокий уровень
#endif
strcpy(pstr_g, NAMESTAT); //Копирует NAMESTAT в pstr_g
run.setText(pstr_g);
run.start();
break;

case 10: //прокрутка сообщения
if (run.tick()==2) //бегущая строка закончилась
{
run.stop();
inf=11;
}
break;

case 11: //прокрутки сообщения НЕТ
{
if (strncmp(pstr_g, TITLE, 7)!=0) //если произошла смена "TITLE"
{
eye_ch();
run_str();
inf=10;
}


if (eye_tmr and !square_tmr.state())
{
draw_eye(0);
draw_eye(1);
static uint16_t pos;
pos += 15;
uint8_t x = inoise8(pos);
uint8_t y = inoise8(pos + UINT16_MAX / 4);
x = constrain(x, 40, 255 - 40);
y = constrain(y, 40, 255 - 40);
x = map(x, 40, 255 - 40, 2, 5);
y = map(y, 40, 255 - 40, 2, 5);

if (pulse)
{ //расширяющиеся глаза
pulse = 0;
int8_t sx = random(-1, 1);
int8_t sy = random(-1, 1);
draw_eyeb(0, x + sx, y + sy, 3);
draw_eyeb(1, x + sx, y + sy, 3);
}
else
{ //бегающие глаза
draw_eyeb(0, x, y);
draw_eyeb(1, x, y);
}
// //конец отрисовки глаз

// mtrx.update();
}


player.getVUlevel();
if (sound.tick(map(player.vuLeft, 0, 254, 0, 127)))
{
if (sound.pulse()) pulse = 1;

mtrx.rect(0, 0, ANALYZ_WIDTH - 1, 7, GFX_CLEAR);
analyz0(sound.getVol()); //рисование рта точками sound.getVol()

mtrx.update();
} //конец рисование рта
} //case 11:
break; //case 11:
} //switch (inf)
} //if (player.status() == PLAYING)
else
{ //-----------STOPPED-------------------
switch (inf)
{
case 0: //было выключено
case 20: //было потеряно соединение
if (run.tick()==2)
{
eye_ch();
#if (AMP>0)
digitalWrite (AMP, LOW); //при выключении низкий уровень
#endif
strcpy(pstr_g, "подключено с ip: ");
strcat(pstr_g, WiFi.localIP().toString().c_str());
run.setText(pstr_g);
run.start();
inf=1;
}
break;
case 21: inf=2; break;
case 10:
case 11:
change_state();
inf=1;
#if (AMP>0)
digitalWrite (AMP, LOW); //при выключении низкий уровень
#endif
// run_str();
strcpy(pstr_g, TITLE); //Копирует TITLE в pstr_g
run.setText(pstr_g);
run.start();
break;

case 1: //прокрутка сообщения
if (run.tick()==2)
{
inf=2;
#if (time_EYES == 1)
mtrx.clear();
#else
change_state();
#endif
}
break;

case 2: //показ времени
if (matrix_tmr)
{
Show_time(gettime()/10000, gettime()%10000/100, gettime()%100); //245948

/*
if (gettime()/10000==16 and gettime()%10000/100==40) //заготовка для будильника заведен на 16-40
player.sendCommand({PR_PLAY, 3}); //включится станция "3" - "камедирадио"
*/
}
break;



} //switch (inf)
}
} //display.mode()==PLAYER)
break; //case PLAYER:


case LOST:
{
if (inf<20)
{
#if (AMP>0)
digitalWrite (AMP, LOW); //при выключении низкий уровень
#endif
inf=20;
run.setText("Соединение потеряно");
run.start();
change_state();
}

if (run.tick()==2)
{
inf=21;
run.stop();
#if (time_EYES == 1)
mtrx.clear();
#endif
}

if (matrix_tmr and inf>20)
{
mtrx.dot(ANALYZ_WIDTH+8, 7, gettime()%2);
Show_time(gettime()/10000, gettime()%10000/100, gettime()%100); //245948
}
delay(10);

} //case LOST:
break; //case LOST:

case UPDATING:
{
if (inf<20)
{
inf=20;
eye_ch();
run.setText(const_DlgUpdate); // строковая константа TITLE NAMESTAT
run.start();
}
run.tick();
}

break; //case UPDATING:


} //switch (display.mode())

} //void max7219()

Ёрадио надеюсь сток?
Да, сток. Даже специально взял версию v0.9.300, которая была указана в bender.ino

Какую esp используете?
А тут начинается самое интересно.
Плата у меня ESP32 Devkit V4 38 пинов, их у меня пару штук и на них проблема.
Взял тут ESP32 Devkit V1 30 пинов и о чудо проблема ушла

В общем для меня загадка что не так с ESP32 Devkit V4 при добавлении в прошивку bender.ino
Так же как еще более не понятно почему когда втыкаю плату в компьютер проблема уходит
но видимо буду собирать на ESP32 Devkit V1 30
 

alfo

✩✩✩✩✩✩✩
22 Янв 2019
7
0
@alfo,
В myoptions что всего одна строчка узазывающая язык? А подключение цапа, энкодера где? Не удивительно что глючит. Где-то так должно быть.
не думаю что отсутствие энкодера влияет на звук
энкдор не добавлен потому что я его и не подключал

на тему цапа все очень просто
оно не описано потому что в прошивке yoradio и так по умолчанию пины
#define I2S_DOUT 27 /* DIN connection */
#define I2S_BCLK 26 /* BCLK Bit clock */
#define I2S_LRC 25 /* WSEL Left Right Clock */

это можно проверить через генератор https://e2002.github.io/docs/myoptions-generator.html в проекте yoradio
если выбраны эти пины то он не добавляет в myoptions описание цапа
из вашего же примера выходит что цап нужно описать в myoptions но при это в примере пины закомментированы и раскомментирован только пин I2S_DOUT
как бы тоже не очень то цап будет работать с одним пином
 

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
40
15
@alfo,
Спорить не буду но все мододелы с 4pda обеими руками за как можно полное заполнение myoptions. Ну и указать что у Вас бездисплейная система тоже нужно. Мое дело посоветовать, а слушать или нет дело Ваше. Я их уже маленькую кучку собрал и далеко не сток.
 

alfo

✩✩✩✩✩✩✩
22 Янв 2019
7
0
@iponkada2
прописал цап и даже прописал
#define DSP_MODEL DSP_DUMMY
не смотря на то что это и так дефолтная настройка
ситуация не улучшилась
 

maloir

★✩✩✩✩✩✩
14 Сен 2019
116
39
начинаются затыки
Вроде как решали эту проблему так:
Если радиостанции заикаются при прослушивании, как будто буфера не хватает
поменять #define RADIO_BUFFER (1600 * 25) - но не знаю помогало это кому то или нет.
и такой вариант:
Добавьте audio.setConnectionTimeout(50000, 50000); где-нибудь например в setup, просто дефолтный таймаут очень маленький Вроде это решает вопрос с буферизацией потока.
Добавить в core0.cpp:

void core0(void* p) {

// ========================= SETUP =========================

………………………….

audio.setBufsize(RADIO_BUFFER, –1);

audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);

audio.setVolume(data.state ? data.vol : 0);

data.station = constrain(data.station, 0, sizeof(stations) / sizeof(char*) – 1);

reconnect = stations[data.station];

audio.setConnectionTimeout(50000, 50000);

но так же не знаю, помогало или нет. Может кто еще что напишит.
 
  • Лойс +1
Реакции: Дмитрий1131

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
40
15
Посмотрите в мониторе порта что происходит на обеих платах, может натолкнет на решение. Китайцы на некоторых платах не правильно шелкографию наносят - cmd позначали как gnd и у многих вообще не запускалось. Прозвоните все ли подписанные gnd являются таковыми и попробуйте назначить другие пины - на ЦАП не 27 а какой-то другой и матрицы на другие пины. Ну и проверить правильность подключения. Проверить выход стаба даёт ли 3,3. Проверить вначале железо, а потом искать косяки в коде. Пару страниц назад выкладывал свой доработанный bender.ino попробуйте его.
 
Изменено:

maloir

★✩✩✩✩✩✩
14 Сен 2019
116
39
Насколько помню такое было по началу с прошивкой Гайвера, потом вроде не возникало проблем таких, ну я так не помню, да и сам собирал, не было. вот буквально на днях собрал все хорошо.
 

alfo

✩✩✩✩✩✩✩
22 Янв 2019
7
0
@iponkada2
проблема в том что при подключении кабеля usb затыки магическим образом пропадают
что как бы могло бы намекать на проблемы питания (но я все прозванивал и проверял, про cmd я в курсе)
но в то же время если прошить yoradio без bender то все хорошо, что заставляет задуматься о bender.ino
на тему цапа тоже момент такой, если бы звук просто затыкался,
но и на матрицах рта в момент затыка прямая линия, то есть, с учетом того что анализ звука происходит на уровне esp, выглядит как проблема именно на самой esp
так же пробовал блок питания менять на 5 амперный то же не помогло
в общем идей полно только ничего не подтверждается когда проверяешь
поведение очень странное
вот появилась идея логи роутера посмотреть во время затыков)
 

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
40
15
@alfo,
Монитор порта посмотрите и мой Бендер возьмите. Ресурсов у esp хватает - у меня без проблем одновременно работало с матрицами и дисплеем ssd1306.
 

alfo

✩✩✩✩✩✩✩
22 Янв 2019
7
0
@alfo,
Монитор порта посмотрите и мой Бендер возьмите. Ресурсов у esp хватает - у меня без проблем одновременно работало с матрицами и дисплеем ssd1306.
так а что смотреть то, я же пишу что при попытке посмотреть проблем ни каких нет
так что ничего интересного там и не видно.
ну у меня с ili9488 все прекрасно пашет, правда без матриц)))
 

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
40
15
@alfo,
Попробуйте прошить как Врум но поставить галочку что есть psram или другие варианты вровера выберите.
 

maloir

★✩✩✩✩✩✩
14 Сен 2019
116
39
Ребята кто нибудь измерял потребления головы? сколько она потребляет при работе?
 

Igorb68

✩✩✩✩✩✩✩
15 Ноя 2022
10
4
@maloir, у меня получается от 350 мА до ампера, в зависимости от включенной яркости матриц. у меня зеленые матрицы. при комфортной на мой взгляд яркости 600 мА на пике.
 
  • Лойс +1
Реакции: maloir

werdes

★✩✩✩✩✩✩
3 Янв 2024
9
11
@maloir,
вот тут более подробно:
 

Contemplator

✩✩✩✩✩✩✩
15 Дек 2018
17
1
Для тех кто устал бороться со "звоном" LED матриц, выкладываю свою версию ПП. На максимальной громкости еле уловимое шипение усилителя. Плата односторонняя, разведена под установку УНЧ PAM8403 (торчком) либо PAM8406.
 

Вложения

  • 21.1 KB Просмотры: 7

maloir

★✩✩✩✩✩✩
14 Сен 2019
116
39
Замерил сборку Valem 3 версию на потребление, китайским тестором. Синие матрицы. Один динамик 3 V 4 Om. У меня вышло так:
Включение ~130 мА, Подключение ~ 190 мА, в режиме часов ~180 мА, работа радио, громкость 255 - 220 мА, громкость 25 -190 мА показания примерные, так как пока не удается заставить работать стабильно. Получается примерно на полной мощности потребление составит ~ 400 - 450 мА (примерно, так как матрицы у меня почему то ни как ни регулируются, ни энкондером, ни веб). Из учета что аккумулятор 18650 с емкостью 2500 Ah с потреблением 1 Ампер работает примерно два с половиной часа (правда, у меня для проверки был только высокотоковый), то при потреблении 500 ампер такой аккумулятор этом режиме проработает примерно 5 часов, а в режиме часов (~ 180 ) часов 12. Вот такой расчет у меня получился. Если у кого есть возможность замерить свои показания будет интересно. Теперь для Бендера холдер для батареи довести до ума и можно пользоваться 18650.