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

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

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

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

Если кто знает хитрые способы правильного позиционирования квадратных корпусов мелкосхем - поделитесь.

EagleB3
Offline
Зарегистрирован: 12.04.2020

Особые ноу-хау вряд ли у кого найдутся. Основных два:

1) Паяльная паста на плату через маску, паять ИК (предпочтительно) и силы поверхностного натяжения сами поставят корпус на место. Если воздухом - то лучше с соотв. насадкой, чтобы потоком воздуха с поплывшей пасты не сдвинуть.

2) Флюс, две ножки по диагонали, еще флюс и "микроволна".

sergejb52
Offline
Зарегистрирован: 16.07.2016

читаю Ваше садо и мазо ржунимагу. неужели мне предстоит тоже. а более вменяемую ide не посоветуете?

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

EagleB3
Offline
Зарегистрирован: 12.04.2020

sergejb52 пишет:
читаю Ваше садо и мазо ржунимагу. неужели мне предстоит тоже. а более вменяемую ide не посоветуете?
На самом деле, все довольно просто, когда понимаешь что участвует в процессе, и какие задачи, и на каком участке оно выполняет. А поскольку компоненты взаимосвязаны, почти каждый из них при установке норовит добавить что-то для себя. И в одном мануале начинают с одного, в другом - с другого, в третьем - с середины.

Для небольших правок IDE не сильно нужен. Пошаговой трассировки без эмулятора ESP32 все равно не будет. Красивый синтаксис вам много кто нарисует, хоть бы даже и Notepad++. А если работать с проектом чтобы все под рукой в одном флаконе - Visual Studio Code или Atom.

Насчет среды: даже после того, как у меня все заработало из виндовой консоли администратора, Visual Studio Code с плагином Espressif компилировать проект отказался. Сам я его вряд ли одолею. Но если кто нибудь (это как-бы намек... :) :) :) )  поможет, то обязуюсь переложить и это "хождение по мукам" во внятный мануал. Просто так донимать вопросами про настройку VSC, без которого можно обойтись, совесть не позволяет.

По горячим следам пишу мануал для уровня "продвинутый чайник". Не знаю, нужен ли он кому-то, но, по крайней мере я наведу порядок (?!... Надеюсь...) у себя в голове. Для проверки пройду по этому мануалу шаг-за-шагом на чистом разделе ОС, и, если все поставится-скомпилируется - то выложу куда-нибудь.

pilnikov пишет:
а если написать в ем: git clone https://github.com/pilnikov/adf.git - получите клон моей папки на локальной машине
pilnikov, а вы не будете против, если я в том мануале опишу процесс разворачивания вашего мода в качестве базы?

 

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

пожалуйте

по поводу vsc

я тут пытался visual gdb к студии прикрутить, чтоб esp-prog заюзать..... Пришлось студию переустанавливать а вместе с ней и idf снова перезалил начистую. Теперь дома vsc проект тоже перестал собирать с чистого листа. После сборки консолью - собирает, а если почистить папку build - нет. Ругается на сбой в настройках кэша Cmake. Ему подавай правильные environment variables. А где их настраивать - я не знаю. На работе студия старая (не трогал еще, и если честно, то боюсь) - там работает плагин.

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

sergejb52 пишет:

читаю Ваше садо и мазо ржунимагу. неужели мне предстоит тоже. а более вменяемую ide не посоветуете?

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

на самом деле редакторов полно: и студия (большая) и код(vsc, -маленький) и notepad'oм тоже можно. Только собрать проект не везде получается.

По поводу клея резинового...

а если полигон шириной 0.2мм и между ними 0.35мм? Это чип есп32 такой и корпус qfn - совсем безногий.

sergejb52
Offline
Зарегистрирован: 16.07.2016

Тогда флюс и фен легкоплавкий припой ну и нижний подогрев. но это уже больше на левшу с блохой смахивает.

sergejb52
Offline
Зарегистрирован: 16.07.2016

Установил по инструкции производителя еклипс и их тулзу. вроде норм работает .

BlackMax
Offline
Зарегистрирован: 24.09.2018

выдает ошибку в Вашей функции

 
String lcd_rus(String source)
{
 
- LCD1602.h:410: error: a function-definition is not allowed here before '{' token

 

 

 

 

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

sergejb52 пишет:
Установил по инструкции производителя еклипс и их тулзу. вроде норм работает .

сделайте видос по установке - польза точно будет.

BlackMax
Offline
Зарегистрирован: 24.09.2018

C:\Users\BlackMax\AppData\Local\Temp\arduino_build_763494\sketch\LCD1602.h: In function 'void dsp_update()':

LCD1602.h:410: error: a function-definition is not allowed here before '{' token

{

^

Esp32_radio_02:5826: error: expected '}' at end of input

Esp32_radio_02:5826: error: expected '}' at end of input

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

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

String lcd_rus(String source)
 
pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

BlackMax пишет:

выдает ошибку в Вашей функции

 
String lcd_rus(String source)
{
 
- LCD1602.h:410: error: a function-definition is not allowed here before '{' token
 
//***********************************************************************************************
//                                D S P _U P D A T E                                            *
//***********************************************************************************************
// Show a selection of the 4 sections                                                           *
//***********************************************************************************************
void dsp_update()
{
  static uint16_t cnt = 0 ;                             // Reduce updates

  if ( cnt++ != 8 )                                     // Action every 8 calls
  {
    return ;
  }
  cnt = 0 ;
  if ( enc_menu_mode != VOLUME )                        // Encoder menu mode?
  {
    dline[0].str = tftdata[3].str.substring(0,16) ;     // Yes, different lines
    dline[1].str = tftdata[3].str.substring(16) ;
  }

перед этим кодом вставляете мой

const byte 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)
{
 String target;

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

  unsigned char n = 0x0;
  char m;
  
  while (i < k) 
  {
    n = source[i]; i++;

    if (n == 0xD0 || n == 0xD1)   // UTF-8 handling
	{
      switch (n) 
	  {
        // Позиция символа в массиве utf_recode вычисляется по формуле pos = код символа - 0х90 для символов от А до п, с кодами от 0x90 по 0xBF,
		// с позициями с нулевой по сорок седьмую (0x2F в HEX)
        // Для символов от р до я, с кодами от 0x80 по 0x8F, с позициями с сорок восьмой (0x30 в HEX) по шестьдесят третью (0x3F в HEX)
        // - формула pos = (код символа - 0х80) + 0x30 = код символа - 0х50
		// ё и Ё стоят особняком (выбиваются из общего строя) поэтому для них отдельные строки.

        case 0xD0: 
            n = source[i]; i++;
            if (n == 0x81) m = 0xA2; // Ё
			else if (n >= 0x90 && n <= 0xBF) m = pgm_read_byte_near(utf_recode + n - 0x90); // от А до п
            break;
        case 0xD1: 
            n = source[i]; i++;
            if (n == 0x91) m = 0xB5; // ё
            else if (n >= 0x80 && n <= 0x8F) m = pgm_read_byte_near(utf_recode + n - 0x50); // от р до я
            break;
      }
    }
    else m = n;
    
	target += m;
  }
  return target;
}

потом правите 2 строчки

    dline[0].str = tftdata[3].str.substring(0,16) ;     // Yes, different lines
    dline[1].str = tftdata[3].str.substring(16) ;

Это все в LCD1602.h

Я завтра постараюсь сам попробовать собрать все у себя (без проверки на железе)

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


//***************************************************************************************************
//*  LCD1602.h -- Driver for LCD 1602 display with I2C backpack.                                    *
//***************************************************************************************************
// The backpack communicates with the I2C bus and converts the serial data to parallel for the      *
// 1602 board.  In the serial data, the 8 bits are assigned as follows:                             *
// Bit   Destination  Description                                                                   *
// ---   -----------  ------------------------------------                                          *
//  0    RS           H=data, L=command                                                             *
//  1    RW           H=read, L=write.  Only write is used.                                         *
//  2    E            Enable                                                                        *
//  3    BL           Backlight, H=on, L=off.  Always on.                                           *
//  4    D4           Data bit 4                                                                    *
//  5    D5           Data bit 5                                                                    *
//  6    D6           Data bit 6                                                                    *
//  7    D7           Data bit 7                                                                    *
//***************************************************************************************************
//
// Note that the display function are limited due to the minimal available space.
 
#include <driver/i2c.h>
 
#define I2C_ADDRESS 0x3F                                     // Adjust for your display
#define ACKENA      true                                     // Enable ACK for I2C communication
// Color definitions for the TFT screen (if used)
#define BLACK   0
#define BLUE    1
#define RED     1
#define GREEN   0
#define CYAN    GREEN | BLUE
#define MAGENTA RED | BLUE
#define YELLOW  RED | GREEN
#define WHITE   RED | GREEN | BLUE
 
#define DELAY_ENABLE_PULSE_SETTLE    50      // Command requires > 37us to settle
#define FLAG_BACKLIGHT_ON    0b00001000      // Bit 3, backlight enabled (disabled if clear)
#define FLAG_ENABLE          0b00000100      // Bit 2, Enable
#define FLAG_RS_DATA         0b00000001      // Bit 0, RS=data (command if clear)
#define FLAG_RS_COMMAND      0b00000000      // Command
 
#define COMMAND_CLEAR_DISPLAY               0x01
#define COMMAND_RETURN_HOME                 0x02
#define COMMAND_ENTRY_MODE_SET              0x04
#define COMMAND_DISPLAY_CONTROL             0x08
#define COMMAND_FUNCTION_SET                0x20
#define COMMAND_SET_DDRAM_ADDR              0x80
//
#define FLAG_DISPLAY_CONTROL_DISPLAY_ON     0x04
#define FLAG_DISPLAY_CONTROL_CURSOR_ON      0x02
//
#define FLAG_FUNCTION_SET_MODE_4BIT         0x00
#define FLAG_FUNCTION_SET_LINES_2           0x08
#define FLAG_FUNCTION_SET_DOTS_5X8          0x00
//
#define FLAG_ENTRY_MODE_SET_ENTRY_INCREMENT 0x02
#define FLAG_ENTRY_MODE_SET_ENTRY_SHIFT_ON  0x01
//
// Various macro's to mimic the ST7735 version of display functions
#define dsp_setRotation()                                          // Use standard landscape format
#define dsp_print(a)                                               // Print a string 
#define dsp_println(a)                                             // Print string plus newline
#define dsp_fillRect(a,b,c,d,e)                                    // Fill a rectange
#define dsp_setTextSize(a)                                         // Set the text size
#define dsp_setTextColor(a)                              
#define dsp_setCursor(a,b)                                         // Position the cursor
#define dsp_erase()         tft->sclear()                          // Clear the screen
#define dsp_getwidth()      16                                     // Get width of screen
#define dsp_getheight()     2                                      // Get height of screen
#define dsp_usesSPI()       false                                  // Does not use SPI
 
#define TFTSECS 4                                           // 4 sections, only 2 used
scrseg_struct     tftdata[TFTSECS] =                        // Screen divided in 4 segments
{
  { false, WHITE,   0,  0, "" },                            // 1 top line (dummy)
  { false, WHITE,   0,  0, "" },                            // 8 lines in the middle
  { false, WHITE,   0,  0, "" },                            // 4 lines at the bottom
  { false, WHITE,   0,  0, "" }                             // 4 lines at the bottom for rotary encoder
} ;
 
const byte 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)
{
 String target;
 
  uint16_t i = 0;
  uint16_t k = source.length();
 
  unsigned char n = 0x0;
  char m;
  
  while (i < k) 
  {
    n = source[i]; i++;
 
    if (n == 0xD0 || n == 0xD1)   // UTF-8 handling
  {
      switch (n) 
    {
        // Позиция символа в массиве utf_recode вычисляется по формуле pos = код символа - 0х90 для символов от А до п, с кодами от 0x90 по 0xBF,
    // с позициями с нулевой по сорок седьмую (0x2F в HEX)
        // Для символов от р до я, с кодами от 0x80 по 0x8F, с позициями с сорок восьмой (0x30 в HEX) по шестьдесят третью (0x3F в HEX)
        // - формула pos = (код символа - 0х80) + 0x30 = код символа - 0х50
    // ё и Ё стоят особняком (выбиваются из общего строя) поэтому для них отдельные строки.
 
        case 0xD0: 
            n = source[i]; i++;
            if (n == 0x81) m = 0xA2; // Ё
      else if (n >= 0x90 && n <= 0xBF) m = pgm_read_byte_near(utf_recode + n - 0x90); // от А до п
            break;
        case 0xD1: 
            n = source[i]; i++;
            if (n == 0x91) m = 0xB5; // ё
            else if (n >= 0x80 && n <= 0x8F) m = pgm_read_byte_near(utf_recode + n - 0x50); // от р до я
            break;
      }
    }
    else m = n;
    
  target += m;
  }
  return target;
}
 
 
class LCD1602
{
  public:
                     LCD1602 ( uint8_t sda, uint8_t scl ) ; // Constructor
    void             print ( char c ) ;                     // Send 1 char
    void             reset() ;                              // Perform reset
    void             sclear() ;                             // Clear the screen
    void             shome() ;                              // Go to home position
    void             scursor ( uint8_t col, uint8_t row ) ; // Position the cursor
    void             scroll ( bool son ) ;                  // Set scroll on/off
  private:
    i2c_config_t     i2c_config ;                           // I2C configuration
    i2c_cmd_handle_t hnd ;                                  // Handle for driver
    void             scommand ( uint8_t cmd ) ;
    void             strobe ( uint8_t cmd ) ;
    void             swrite ( uint8_t val, uint8_t rs ) ;
    void             write_cmd ( uint8_t val ) ;
    void             write_data ( uint8_t val ) ;
    uint8_t          bl  = FLAG_BACKLIGHT_ON ;              // Backlight in every command
    uint8_t          xchar = 0 ;                            // Current cursor position (text)
    uint8_t          ychar = 0 ;                            // Current cursor position (text)
} ;
 
LCD1602* tft = NULL ;
 
bool dsp_begin()
{
  dbgprint ( "Init LCD1602, I2C pins %d,%d", ini_block.tft_sda_pin,
             ini_block.tft_scl_pin ) ;
  if ( ( ini_block.tft_sda_pin >= 0 ) &&
       ( ini_block.tft_scl_pin >= 0 ) )
  {
    tft = new LCD1602 ( ini_block.tft_sda_pin,
                        ini_block.tft_scl_pin ) ;           // Create an instance for TFT
  }
  else
  {
    dbgprint ( "Init LCD1602 failed!" ) ;
  }
  return ( tft != NULL ) ;
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2  write functions                                *
//***********************************************************************************************
// Write functins for command, data and general.                                                *
//***********************************************************************************************
void LCD1602::swrite ( uint8_t val, uint8_t rs )          // General write, 8 bits data
{
  strobe ( ( val & 0xf0 ) | rs ) ;                        // Send 4 LSB bits
  strobe ( ( val << 4 ) | rs ) ;                          // Send 4 MSB bits
}
 
 
void LCD1602::write_data ( uint8_t val )
{
  swrite ( val, FLAG_RS_DATA ) ;                           // Send data (RS = HIGH)
}
 
 
void LCD1602::write_cmd ( uint8_t val )
{
  swrite ( val, FLAG_RS_COMMAND ) ;                        // Send command (RS = LOW)
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S T R O B E                                  *
//***********************************************************************************************
// Send data followed by strobe to clock data to LCD.                                           *
//***********************************************************************************************
void LCD1602::strobe ( uint8_t cmd )
{
  scommand ( cmd | FLAG_ENABLE ) ;                  // Send command with E high
  scommand ( cmd ) ;                                // Same command with E low
  delayMicroseconds ( DELAY_ENABLE_PULSE_SETTLE ) ; // Wait a short time
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S C O M M A N D                              *
//***********************************************************************************************
// Send a command to the LCD.                                                                   *
// Actual I/O.  Open a channel to the I2C interface and write one byte.                         *
//***********************************************************************************************
void LCD1602::scommand ( uint8_t cmd )
{
  hnd = i2c_cmd_link_create() ;                           // Create a link
  if ( i2c_master_start ( hnd ) |
       i2c_master_write_byte ( hnd, (I2C_ADDRESS << 1) |  // Add I2C address to output buffer
                                    I2C_MASTER_WRITE,
                               ACKENA ) |
       i2c_master_write_byte ( hnd, cmd | bl,             // Add command including BL state
                               ACKENA ) |
       i2c_master_stop ( hnd ) |                          // End of data for I2C
       i2c_master_cmd_begin ( I2C_NUM_0, hnd,             // Send bufferd data to LCD
                              10 / portTICK_PERIOD_MS ) )
  {
    dbgprint ( "LCD1602 communication error!" ) ;         // Something went wrong (not connected)
  }
  i2c_cmd_link_delete ( hnd ) ;                           // Link not needed anymore
}
 
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: P R I N T                                    *
//***********************************************************************************************
// Put a character in the buffer.                                                               *
//***********************************************************************************************
void LCD1602::print ( char c )
{
  write_data ( c ) ;
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S C U R S O R                                *
//***********************************************************************************************
// Place the cursor at the requested position.                                                  *
//***********************************************************************************************
void LCD1602::scursor ( uint8_t col, uint8_t row )
{
  const int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 } ;
  
  write_cmd ( COMMAND_SET_DDRAM_ADDR |
              ( col + row_offsets[row] ) ) ; 
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S C L E A R                                  *
//***********************************************************************************************
// Clear the LCD.                                                                               *
//***********************************************************************************************
void LCD1602::sclear()
{
  write_cmd ( COMMAND_CLEAR_DISPLAY ) ;
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S C R O L L                                  *
//***********************************************************************************************
// Set scrolling on/off.                                                                        *
//***********************************************************************************************
void LCD1602::scroll ( bool son )
{
  uint8_t ecmd = COMMAND_ENTRY_MODE_SET |               // Assume no scroll
                 FLAG_ENTRY_MODE_SET_ENTRY_INCREMENT ;
 
  if ( son )                                            // Scroll on?
  {
    ecmd |= FLAG_ENTRY_MODE_SET_ENTRY_SHIFT_ON ;        // Yes, change function
  }
  write_cmd ( ecmd ) ;                                  // Perform command
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: S H O M E                                    *
//***********************************************************************************************
// Go to home position.                                                                         *
//***********************************************************************************************
void LCD1602::shome()
{
  write_cmd ( COMMAND_RETURN_HOME ) ;
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2 :: R E S E T                                    *
//***********************************************************************************************
// Reset the LCD.                                                                               *
//***********************************************************************************************
void LCD1602::reset()
{
  scommand ( 0 ) ;                                // Put expander to known state
  delayMicroseconds ( 1000 ) ;
  for ( int i = 0 ; i < 3 ; i++ )                 // Repeat 3 times
  {
    strobe ( 0x03 << 4 ) ;                        // Select 4-bit mode
    delayMicroseconds ( 4500 ) ;
  }
  strobe ( 0x02 << 4 ) ;                          // 4-bit
  delayMicroseconds ( 4500 ) ;
  write_cmd ( COMMAND_FUNCTION_SET |
              FLAG_FUNCTION_SET_MODE_4BIT |
              FLAG_FUNCTION_SET_LINES_2 |
              FLAG_FUNCTION_SET_DOTS_5X8 ) ;
  write_cmd ( COMMAND_DISPLAY_CONTROL |
              FLAG_DISPLAY_CONTROL_DISPLAY_ON ) ;
  sclear() ;
  write_cmd ( COMMAND_ENTRY_MODE_SET |
              FLAG_ENTRY_MODE_SET_ENTRY_INCREMENT ) ;
  shome() ;
  for ( char a = 'a' ; a < 'q' ; a++ )
  {
    print ( a ) ;
  }
}
 
 
//***********************************************************************************************
//                                L C D 1 6 0 2                                                 *
//***********************************************************************************************
// Constructor for the display.                                                                 *
//***********************************************************************************************
LCD1602::LCD1602 ( uint8_t sda, uint8_t scl )
{
  esp_err_t        espRc ;
 
  i2c_config.mode = I2C_MODE_MASTER,
  i2c_config.sda_io_num = (gpio_num_t)sda ;
  i2c_config.sda_pullup_en = GPIO_PULLUP_DISABLE ;
  i2c_config.scl_io_num = (gpio_num_t)scl ;
  i2c_config.scl_pullup_en = GPIO_PULLUP_DISABLE ;
  i2c_config.master.clk_speed = 100000 ;
  if ( i2c_param_config ( I2C_NUM_0, &i2c_config ) != ESP_OK )
  {
    dbgprint ( "param_config error!" ) ;
  }
  else if ( i2c_driver_install ( I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0 ) != ESP_OK )
  {
    dbgprint ( "driver_install error!" ) ;
  }
  reset() ;
}
 
struct dsp_str
{
  String          str ;
  uint16_t        len ;                                 // Length of string to show
  uint16_t        pos ;                                 // Start on this position of string
  uint8_t         row ;                                 // Row on display  
} ;
 
dsp_str dline[2] = { { "", 0, 0, 0 },
                     { "", 0, 0, 0 }
                   } ;
 
//***********************************************************************************************
//                                D S P _U P D A T E _ L I N E                                  *
//***********************************************************************************************
// Show a selected line                                                                         *
//***********************************************************************************************
void dsp_update_line ( uint8_t lnr )
{
  uint8_t         i ;                                // Index in string
  const char*     p ;
 
  p = dline[lnr].str.c_str() ;
  dline[lnr].len = strlen ( p ) ;
  //dbgprint ( "Strlen is %d, str is %s", len, p ) ;
  if ( dline[lnr].len > 16 )
  {
    if ( dline[lnr].pos >= dline[lnr].len )
    {
      dline[lnr].pos = 0 ;
    }
    else
    {
      p += dline[lnr].pos ;
    }
    dline[lnr].len -= dline[lnr].pos ;
    if ( dline[lnr].len > 16 )
    {
      dline[lnr].len = 16 ;
    }
  }
  else
  {
    dline[lnr].pos = 0 ;                             // String fits on screen
  }
  dline[lnr].pos++ ;
  tft->scursor ( 0, lnr ) ;
  for ( i = 0 ; i < dline[lnr].len ; i++ )
  {
    if ( ( *p >= ' ' ) && ( *p <= '~' ) )            // Printable?
    {
      tft->print ( *p ) ;                            // Yes
    }
    else
    {
      tft->print ( ' ' ) ;                           // Yes, print space
    }
    p++ ;
  }
  for ( i = 0 ; i < ( 16 - dline[lnr].len ) ; i++ )  // Fill remainder
  {
    tft->print ( ' ' ) ;
  }
  if ( *p == '\0' )                                  // At end of line?
  {
    dline[lnr].pos = 0 ;                             // Yes, start allover
  }
}
 
 
//***********************************************************************************************
//                                D S P _U P D A T E                                            *
//***********************************************************************************************
// Show a selection of the 4 sections                                                           *
//***********************************************************************************************
void dsp_update()
{
  static uint16_t cnt = 0 ;                             // Reduce updates
 
  if ( cnt++ != 8 )                                     // Action every 8 calls
  {
    return ;
  }
  cnt = 0 ;
  if ( enc_menu_mode != VOLUME )                        // Encoder menu mode?
  {
    dline[0].str = lcd_rus(tftdata[3].str.substring(0,16)) ;     // Yes, different lines
    dline[1].str = lcd_rus(tftdata[3].str.substring(16)) ;
  }
  else
  {
    dline[0].str = lcd_rus(tftdata[1].str);                     // Local copy
    dline[1].str = lcd_rus(tftdata[2].str);                     // Local copy
  }  
  dline[0].str.trim() ;                                 // Remove non printing
  dline[1].str.trim() ;                                 // Remove non printing
  if ( dline[0].str.length() > 16 )
  {
    dline[0].str += String ( "  " ) ;
  }
  if ( dline[1].str.length() > 16 )
  {
    dline[1].str += String ( "  " ) ;
  }
  dsp_update_line ( 0 ) ;
  dsp_update_line ( 1 ) ;
}
 
 
//**************************************************************************************************
//                                      D I S P L A Y B A T T E R Y                                *
//**************************************************************************************************
// Dummy routine for this type of display.                                                         *
//**************************************************************************************************
void displaybattery()
{
}
 
 
//**************************************************************************************************
//                                      D I S P L A Y V O L U M E                                  *
//**************************************************************************************************
// Dummy routine for this type of display.                                                         *
//**************************************************************************************************
void displayvolume()
{
}
 
 
//**************************************************************************************************
//                                      D I S P L A Y T I M E                                      *
//**************************************************************************************************
// Dummy routine for this type of display.                                                         *
//**************************************************************************************************
void displaytime ( const char* str, uint16_t color )
{
}
 
 
 
 
 
он же "вживую"
 
 
 
BlackMax
Offline
Зарегистрирован: 24.09.2018

Разобрался я с кодом, но по этому алгоритму сдвига на экран выводятся только буквы - А,М,Е,С,Т,В,О,Н,К.Х,р,о,с,у,е - тоесть стали выводится буквы похожие из английского шрифта

остальные пробелом идут,  кодировка китайской кириллицы совпадает с МЭЛТ с страницей 0 знакогенератора.

Ваша функция похоже работает с страницей 1 знакогенератора МЭЛТ.

вот китайский знакогенератор, адреса с 0xA0 - 0xC7 , с 0xE0 - 0xE7 по ходу

 

 

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

Попробуйте присвоить строкам dline[0] и dline[1] перед обработкой (после строчки cnt = 0;) значение "АБВГабвг" - и посмотрите результат. Если все ок, нужно будет поискать где происходит подготовка этих строк. Если не ок - посмотреть  в

D S P _U P D A T E _ L I N E  - 

for ( i = 0 ; i < dline[lnr].len ; i++ )
  {
    if ( ( *p >= ' ' ) && ( *p <= '~' ) )            // Printable?
    {
      tft->print ( *p ) ;                            // Yes
    }
    else
    {
      tft->print ( ' ' ) ;                           // Yes, print space
    }
    p++ ;
  }
  for ( i = 0 ; i < ( 16 - dline[lnr].len ) ; i++ )  // Fill remainder
  {
    tft->print ( ' ' ) ;
  }
  if ( *p == '\0' )                                  // At end of line?
  {
    dline[lnr].pos = 0 ;                             // Yes, start allover
  }
 
этот кусочек.
BlackMax
Offline
Зарегистрирован: 24.09.2018

вызов tft-> print () поместит символ на дисплей. Это ответ Эда. D S P _U P D A T E _ L I N E - . Будем сегодня пробовать

Onegin45
Offline
Зарегистрирован: 27.11.2018

Парни, всем привет. Ну вы тут и ударились в высокие материи, аж стыдно со своими проблемам  в эту ветку лезть стало... А проблема такая - стоковое Карадио на стоковом епс32. Подвернулся дисплей на 7735s 128х160. ну, думаю, чего бы не прикрутить.  Но, как оказалось, это тебе не i2s, пинов поболее, и все называются диковинно. И ладно бы одинаково, а то с вариациями разными. Вечер убил, сопоставляя инфу из разных источников, но вроде запустить получилось. Остался в воздухе один пин под названием BL. Прочитал, что это контроль подсветки экрана, но нигде не могу найти, куда его к ЕСП-хе подключать. Подскажите, может у кого есть инфа, который пин на ЕСП32 отвечает за гашение экрана в стоковой (в смысле залитой бинарником с гитхаба) Карадио? Спасибо.

BlackMax
Offline
Зарегистрирован: 24.09.2018
//***********************************************************************************************
//                                D S P _U P D A T E                                            *
//***********************************************************************************************
// Show a selection of the 4 sections                                                           *
//***********************************************************************************************
void dsp_update()
{
  static uint16_t cnt = 0 ;                             // Reduce updates
//  dline[0].str = lcd_rus("АБВГабвг");
//  dline[1].str = lcd_rus("АБВГабвг");
 
  if ( cnt++ != 8 )                                     // Action every 8 calls
  {
    return ;
  }
  cnt = 0 ;
  if ( enc_menu_mode != VOLUME )                        // Encoder menu mode?
  {
    dline[0].str = lcd_rus(tftdata[3].str.substring(0,16)) ;     // Yes, different lines
    dline[1].str = lcd_rus(tftdata[3].str.substring(16)) ;
  }
  else
  {
   dline[0].str = lcd_rus("АБВГабвг");
 //   dline[0].str = lcd_rus(tftdata[1].str);                     // Local copy
    dline[1].str = lcd_rus(tftdata[2].str);                     // Local copy
  }  
  dline[0].str.trim() ;                                 // Remove non printing
  dline[1].str.trim() ;                                 // Remove non printing
  if ( dline[0].str.length() > 16 )
  {
    dline[0].str += String ( "  " ) ;
  }
  if ( dline[1].str.length() > 16 )
  {
    dline[1].str += String ( "  " ) ;
  }
  dsp_update_line ( 0 ) ;
  dsp_update_line ( 1 ) ;
}
 
 
******** В первой строке показывает (А В а), то есть все таки это верный путь,
только русский не видит знакогенератор
 
после   cnt = 0 ; подставлял - ни чего не показывает.
 
 В D S P _U P D A T E _ L I N E пробовал, ни чего не получилось
sergejb52
Offline
Зарегистрирован: 16.07.2016

sergejb52
Offline
Зарегистрирован: 16.07.2016

всё в Ваших руках. в модах у кого то видел. моддер не обидится?

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

to BlackMax этот


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

const byte 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
};
 

void setup()
{
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  Serial.begin(115200);

  lcd.clear();
  lcd.setCursor(0, 0); // первая строка
  lcd.print(lcd_rus("АаБбЯя"));
  lcd.setCursor(0, 1); // вторая строка
  lcd.print(lcd_rus("щёЁ\xEF\xED"));

}


void loop()
{
}

 
String lcd_rus(String source)
{
 String target;
 
  uint16_t i = 0;
  uint16_t k = source.length();
 
  unsigned char n = 0x0;
  char m;
  
  while (i < k) 
  {
    n = source[i]; i++;
 
    if (n == 0xD0 || n == 0xD1)   // UTF-8 handling
  {
      switch (n) 
    {
        // Позиция символа в массиве utf_recode вычисляется по формуле pos = код символа - 0х90 для символов от А до п, с кодами от 0x90 по 0xBF,
    // с позициями с нулевой по сорок седьмую (0x2F в HEX)
        // Для символов от р до я, с кодами от 0x80 по 0x8F, с позициями с сорок восьмой (0x30 в HEX) по шестьдесят третью (0x3F в HEX)
        // - формула pos = (код символа - 0х80) + 0x30 = код символа - 0х50
    // ё и Ё стоят особняком (выбиваются из общего строя) поэтому для них отдельные строки.
 
        case 0xD0: 
            n = source[i]; i++;
            if (n == 0x81) m = 0xA2; // Ё
      else if (n >= 0x90 && n <= 0xBF) m = pgm_read_byte_near(utf_recode + n - 0x90); // от А до п
            break;
        case 0xD1: 
            n = source[i]; i++;
            if (n == 0x91) m = 0xB5; // ё
            else if (n >= 0x80 && n <= 0x8F) m = pgm_read_byte_near(utf_recode + n - 0x50); // от р до я
            break;
      }
    }
    else m = n;
    
  target += m;
  }
  return target;
}
 

скеч запустите с вашим дисплеем. Можно на простой ардуинке (уно, мини). Фотоотчет не забудьте

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

to BlackMax

в функции dsp_update_line ( uint8_t lnr )

смените тип указателя      const char*     p ;
                                   на  uint8_t*         p ;
 
строку         if ( ( *p >= ' ' ) && ( *p <= '~' ) )            // Printable?
замените на if ( (( *p >= 0x20 ) && ( *p <= 0x7A )) | (( *p >= 0x41 ) && ( *p <= 0xC7 )) )            // Printable?
 
 
BlackMax
Offline
Зарегистрирован: 24.09.2018

Хорошо, проверю так. При получении проверял, кириллица есть. На работе проверить не могу, только подготовить скетч, корпоративка, дрова не поставить.

sergejb52
Offline
Зарегистрирован: 16.07.2016

lcd.begin(16,2);                      // initialize the lcd

нет?

conler
Offline
Зарегистрирован: 29.09.2012

Плохенько как-то ААС на тда1387 работает с вровером (замутил крутую обвязку - И/У, фильтр правильный и по шумам всё, с трудом, но победил). ААС потоки вроде как "жует", но присутствуют регулярные микрозатыки, джиты и прочие "немузыкальные" дополнения. На МП3 всё прекрасно. Как обычно - трёпа много про программное декодирование ААС, а в итоге анус. Декодирование ААС явно пилили топором. Разочарован, в очередной раз проект теперь под 1053 перепиливать... Больше года это радио собираю...

1053(1063) наше всё!

Всем добра!

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

to conler

Патч ставьте для ААС:

sys.patch("x")	: Change the status of the vs1053 patch at power on. 
		0 = Patch will not be loaded, 
                1 or up = Patch will be loaded (default) at power On
sys.patch	: Display the vs1053 patch status
conler
Offline
Зарегистрирован: 29.09.2012

nadim, патч это ведь для vs1053 какие-то нюансы править, у меня ведь просто цап тда1387 (хоть и с навороченной обвязкой), но попробовал - разницы не услышал. Как были "вставки" на ААС из мусора и щелчков, так и остались. Только МП3 корректно, причем играет очень даже хорошо, радует. ААС в данной реализации как-то кривовато у меня играет. Играет, спору нет, но слушать такое невозможно, если только новости на кухне.

...Может кто потоки ААС подкинуть (или подсказать где искать), может я "неправильные" беру? Например http://stream1.radiord.ru:8000/live128.aac (там вообще ААС?) играет без нареканий, но такое я пока не слушаю, даже в гараже :). Иное что нашел играет с проблемами в звуке. Где проблема может быть? Питальник вровера ДС/ДС 2А, сеть хорошая - антенна легкий "хруст" на УМЗЧ наводила но решилось поворотом/наклоном и заменой антенны. Провода дисплея в экране (наводка от шины ушла, от слова совсем, неистово рекомендую тем, кто дислей на проводах вешает! Экран шины подключал с одной стороны на землю рядом с малосигнальной ЗЧ, но уверен точка вариабельна от конкретной реализации). Крови попили дроссели развязки цифровой и аналоговой земель - шли возбуды фильтров ЦАПа, их клипило, даже УМЗЧ tda8944j на ультразвуке "грелась", часть убрал - запело без шумов. Также удалось реализовать "тихое" питание операционников фильтров ЦАПа и "BassBoost"  (+/-12В) на копеечных mc34063 - вот тут без индуктивностей по шинам никак не обошлось :). По взаиморасположению - вся ВЧ и шумные преобразователи - направо, звук - налево, "пересечения" исключил после десятой итерации :) +"Земля наше Всё"!

Всем добра!

EagleB3
Offline
Зарегистрирован: 12.04.2020

conler пишет:
"Земля наше Всё"!
А не нарисуете ли схемку? Вот этого всего. С дросселями и землями.

conler пишет:
там вообще ААС?
Там ААС, 128 кБит. Я для поиска/настройки/проверки/радио-на-десктопе использую программу RadioSure. Находибельна в сети. Показывает текущие параметры потока, который воспроизводится.

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

To conler
Патч только для VS1053 я просто не заметил что вы используете ЦАП.

conler
Offline
Зарегистрирован: 29.09.2012

EagleB3подход с дросселями развязки земли цифры и аналога у меня не прошел (читайте выше год назад). Схему могу дать в с-плане, свои печатки, но толку от сего?. Классика - "потенциал земли", так вроде это понимается "гуляет". тда1387 с обвязкой на гираторном фильтре не проста и будет большинству неинтересна и нереализуема (4 высокоскоростных недешевых "AD" ОУ + организация +/-питальников для них без шума + правильные земли), но звучит прекрасно. Пока есть потоки МП3 - кайфую с поделки. Фотки изделия позже (панель едет почтой, со дня на день). "Bass-boost" - классика из детства, многократно обкатанная - стр. 61 журнала "Радио" №8 за 1986 год.

фу блин! Прка изложение тут писал сгорела сковородка с завтраком. Не, лучше только читать...

Madjestik58
Offline
Зарегистрирован: 03.03.2019

Дошли руки до перехода на TTGO T8 V1.7. Как понимаю, здесь много у кого она есть, судя по форуму. И чет возникла проблема. При питание от USB - запускается. Тобишь по схеме подаем на VCC 5В. Если тупо подать 5В на пин питания 5В - не стартует (при этом 3В появляется на плате, тобишь понижайка работает). Пришлось перемычку из провода кинуть между VCC (плюс на microUSB) и 5В пином. У меня багованная версия или так и должно быть?

А то смотрю схему Т8 и не вижу причин не работы по 5В линии. https://github.com/LilyGO/TTGO-T8-ESP32/blob/master/Schematic.pdf

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

у вас усб -> ком (ср2104) при такой схеме питания не работает. А еэспихе пофиг - ей надо тока 3v3. 

Madjestik58
Offline
Зарегистрирован: 03.03.2019

Не понял ответа. Подав на пин 5V - 5 вольт, я получаю на пине 3V - 3 вольта. Далее как понимаю эти 3Вольта должны уйти прямо на ESP. Но запуска нет. Где на этой схеме, есть зависимость старта с линией VCC на microUSB порте?

В чем смысл платы, если без перемычки из провода (между microUSB и 5V пином) она не стартует. Колхоз какой-то.

 

И еще вопрос, надо еще докупить ESP32 с PSRAM для Karadio  в других помещениях, 16Мб брать или 4Мб достаточно и слухов о том, что будут нужно более 4Мб не было? Спасибо.

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

Как вы понимаете что есп не стартует? На экранчике ничего не появляется? Попробуйте нажать резет (проверьте на пине "en" наличие 3в при питании от +5в). Скорее всего у вас не сбрасывается схема, либо находится в "вечном сбросе" ("en" на "земле"). Рама достаточно 500 Килобайт = 0,5 Мб

Madjestik58
Offline
Зарегистрирован: 03.03.2019

Спасибо. Вечером попробую проверить EN.

Тогда возьму TTGO MiniESP32 WRoverB и T8 v1.7. Как раз в квадратные подрозетники с усилком 3118 моно и VSкой влезают. Плотненько, но утрамбовываются.

Madjestik58
Offline
Зарегистрирован: 03.03.2019

Рама достаточно 500 Килобайт = 0,5 Мб

Так мало памяти? Бинарники же 1,5Мб весят.

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

бинарники на флэшку пишутся

Madjestik58
Offline
Зарегистрирован: 03.03.2019

Значит мы недопоняли друг друга. Я имел ввиду, надо ли уже брать ESP с 16 Мбайтами памяти или 4 Мбайт этого предостаточно, и шансов что разработчик раздует прошивку мало.

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

мало, 4 мб это для прошивки которую пишет один чел (не команда программеров) - овердохера.

conler
Offline
Зарегистрирован: 29.09.2012

дел

BlackMax
Offline
Зарегистрирован: 24.09.2018

to pilnikov 

  p = dline[lnr].str.c_str() ; // Выдает ошибку invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]

 

//***********************************************************************************************
//                                D S P _U P D A T E _ L I N E                                  *
//***********************************************************************************************
// Show a selected line                                                                         *
//***********************************************************************************************
void dsp_update_line ( uint8_t lnr )
{
  uint8_t         i ;                                // Index in string
  uint8_t*         p ; //заменил
  //const char*    p ;
 
  p = dline[lnr].str.c_str() ; // Выдает ошибку invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
 
  dline[lnr].len = strlen ( p ) ;
  //dbgprint ( "Strlen is %d, str is %s", len, p ) ;
  if ( dline[lnr].len > 16 )
  {
    if ( dline[lnr].pos >= dline[lnr].len )
    {
      dline[lnr].pos = 0 ;
    }
    else
    {
      p += dline[lnr].pos ;
    }
    dline[lnr].len -= dline[lnr].pos ;
    if ( dline[lnr].len > 16 )
    {
      dline[lnr].len = 16 ;
    }
  }
  else
  {
    dline[lnr].pos = 0 ;                             // String fits on screen
  }
  dline[lnr].pos++ ;
  tft->scursor ( 0, lnr ) ;
  for ( i = 0 ; i < dline[lnr].len ; i++ )
  {
if ( (( *p >= 0x20 ) && ( *p <= 0x7A )) | (( *p >= 0x41 ) && ( *p <= 0xC7 )) )  // заменил
   // if ( ( *p >= ' ' ) && ( *p <= '~' ) )            // Printable?
    {
      tft->print ( *p ) ;                            // Yes 
 
    }
    else
    {
      tft->print ( ' ' ) ;                           // Yes, print space
    }
    p++ ;
  }
  for ( i = 0 ; i < ( 16 - dline[lnr].len ) ; i++ )  // Fill remainder
  {
    tft->print ( ' ' ) ;
  }
  if ( *p == '\0' )                                  // At end of line?
  {
    dline[lnr].pos = 0 ;                             // Yes, start allover
  }
}
 
 
BlackMax
Offline
Зарегистрирован: 24.09.2018

to pilnikov

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

Можно взять ардуину посвежее (у меня 13ая) либо в условиях добавить 6 штук эфок *p >= 0xFFFF FF20 ко всем 0х...

BlackMax
Offline
Зарегистрирован: 24.09.2018

Del

BlackMax
Offline
Зарегистрирован: 24.09.2018

to pilnikov
Arduino 1.8.3. Попробую эфок напихать и ide 13 подсоберу

Madjestik58
Offline
Зарегистрирован: 03.03.2019

 TTGO T8 V1.7. На EN ноль вольт. Кинул перемычку на 3В, и теперь стартует плата. Так что у кого такая же плата будет - нужен будет небольшой колхоз.

Madjestik58
Offline
Зарегистрирован: 03.03.2019

И вопрос - PSRAM сам автоматом подтягивается? Как понять, что она видна. Залит конфиг на 2 энкодера, 16,17 пины не задействованы (их и нет на TTGO). Вот стартовый лог:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:3564
load:0x40078000,len:9372
ho 0 tail 12 room 4
load:0x40080400,len:5848
entry 0x400806d8
I (135) main: starting app_main()
I (135) main: RAM left: 4391968
E (145) main: Running partition type 0 subtype 16 (offset 0x00010000)
I (165) main: Partition init done...
D (225) eeprom: saveDeviceSettings
Log level is now ESP_LOG_DEBUG
I (395) vs1053: VS1053 LFreq: 1403508
I (395) vs1053: VS1053 HFreq: 6153846
I (4895) vs1053: VS1053/VS1003 detected. MP3Status: 40, Version: 4
I (4895) vs1053: SCI_Status  = 0x40
I (4895) vs1053: SCI_Mode (0x4800) = 0x4802
I (4895) vs1053: SCI_ClockF = 0x8800
I (4895) vs1053: VS Version (VS1053 is 4) = 4
I (4905) vs1053: I2S Speed: 0
I (4905) VS1053 Patches: plugin size 8896 4448
I (4905) VS1053 Patches: plugin start: 7 1 8050 6
 
I (5255) vs1053: volume: 68
I (5255) main: hardware initialized
D (5275) GPIO: get_esplay err 0x1102
I (5305) main: LCD Type 192
I (5305) addonucg: lcd init  type: 192, Rotat: 0
I (5355) ucg_hal: UCG_COM_MSG_POWER_UP: 80 ns 
I (5355) ucg_hal: ... Adding spi lcd bus  Speed= 25000000.
I (5475) addonucg: lcd init Color type: 192
I (5535) addonucg: X: 160, yy: 128, y: 10
 
I (5565) main: Hardware init done...
I (5565) main: audio_output_mode 4
One of I2S=0, I2S_MERUS, DAC_BUILT_IN, PDM, VS1053
I (5565) main: Set Song buffer to 420k
I (5565) main: Set baudrate at 115200
I (5575) main: Release 1.9, Revision 7
I (5575) main: SDK v3.3.1-95-gc38bf3534-dirty
I (5585) main: Heap size: 3951388
I (5955) main: Volume set to 68
D (5985) GPIO: get_esplay err 0x1102
I (5985) main: t0 task: 3ffb9908
I (6005) main: starting wifi
I (6015) wifi: wifi driver task: 3ffbafe0, prio:23, stack:3584, core=0
I (6025) wifi: wifi firmware version: 3135e1d
I (6025) wifi: config NVS flash: enabled
I (6025) wifi: config nano formating: disabled
I (6025) wifi: Init dynamic tx buffer num: 32
I (6035) wifi: Init data frame dynamic rx buffer num: 32
I (6035) wifi: Init management frame dynamic rx buffer num: 32
I (6045) wifi: Init management short buffer num: 32
I (6045) wifi: Init static tx buffer num: 16
I (6055) wifi: Init static rx buffer size: 1600
I (6055) wifi: Init static rx buffer num: 10
I (6065) wifi: Init dynamic rx buffer num: 32
WIFI TRYING TO CONNECT TO SSID 2
E (6165) wifi: esp_wifi_disconnect 1153 wifi not start
I (6165) main: connecting toshome
I (6245) wifi: mode : sta (84:0d:8e:3b:7a:3c)
I (6375) wifi: new:<1,1>, old:<1,0>, ap:<255,255>, sta:<1,1>, prof:1
I (6375) wifi: state: init -> auth (b0)
I (6375) wifi: state: auth -> assoc (0)
I (6385) wifi: state: assoc -> run (10)
I (6405) wifi: connected with toshome, aid = 3, channel 1, 40U, bssid = 74:4d:28:1b:5c:0e
I (6405) wifi: security type: 3, phy: bgn, rssi: -75
I (6415) wifi: pm start, type: 1
 
E (6415) event: invalid static ip
I (6415) main: Wifi connected
I (6575) wifi: AP's beacon interval = 102400 us, DTIM period = 1
 
DNS: 192.168.1.1  
IP: 192.168.1.40
 
D (7075) eeprom: saveDeviceSettings
E (7475) main: mDNS Init ok
E (7475) main: mDNS Hostname: karadio32
D (7475) renderer: init I2S mode 4, port 0, 16 bit, 44100 Hz
I (7475) renderer: chip revision 1
I (7505) renderer: i2s intr:0
I (7855) main: RAM left 3876508
I (7855) main: uartInterfaceTask task: 3ffd8e5c
I (7865) main: clientTask task: 3ffdbc34
I (7875) servers: watermark: 0xab4  2740
I (7875) servers: telnetServer_sock socket: 52, errno: 0
I (7875) servers: Webserver socket: 53, errno: 0
I (7875) main: serversTask task: 3ffdc9bc
D (7995) GPIO: g_get_active_buttons err 0x1102
D (8025) GPIO: get_esplay err 0x1102
D (8075) addon: ADC Channel: 255
D (8075) addon: event_ir: 3ffddaac
D (8075) addon: event_lcd: 3ffddb40
I (8085) addon: rmt_nec_rx_task task: 3ffddc38
I (8085) addon: task_lcd task: 3ffdefcc
D (8085) addon: task_lcd Started, LCD Type 192
D (8125) GPIO: lcd_blv3
D (8205) NEC: RMT finished
I (8215) main: task_addon task: 3ffdd8fc
I (8985) main:  Init Done
READY. Type help for a list of commands
##CLI.ICY0#: at IP 192.168.1.40
##CLI.ICY0#: Ready
 
pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
I (135) main: RAM left: 4391968
4 391 968 байт
своей рам у есп примерно 192 000 байт
вывод - подключена внешняя рам размером примерно 4к
Madjestik58
Offline
Зарегистрирован: 03.03.2019

Спасибо. Вот конфиг под два энкодера ST7735 при PSRAM

key,type,encoding,value
label_space,namespace,,
L_LABEL,data,string,tft18_psram_alexey.csv
L_COMMENT,data,string,This is the standard configuration for a wrover.
gpio_space,namespace,,
K_SPI,data,u8,2
P_MISO,data,u8,19
P_MOSI,data,u8,23
P_CLK,data,u8,18
P_XCS,data,u8,32
P_RST,data,u8,12
P_XDCS,data,u8,33
P_DREQ,data,u8,34
P_ENC0_A,data,u8,15
P_ENC0_B,data,u8,27
P_ENC0_BTN,data,u8,5
P_ENC1_A,data,u8,39
P_ENC1_B,data,u8,36
P_ENC1_BTN,data,u8,35
P_BTN0_A,data,u8,255
P_BTN0_B,data,u8,255
P_BTN0_C,data,u8,255
P_BTN1_A,data,u8,255
P_BTN1_B,data,u8,255
P_BTN1_C,data,u8,255
P_I2C_SCL,data,u8,255
P_I2C_SDA,data,u8,255
P_I2C_RST,data,u8,255
P_LCD_CS,data,u8,13
P_LCD_A0,data,u8,14
P_LCD_RST,data,u8,2
P_IR_SIGNAL,data,u8,255
P_I2S_LRCK,data,u8,25
P_I2S_BCLK,data,u8,26
P_I2S_DATA,data,u8,22
P_TOUCH_CS,data,u8,255
P_JOY_0,data,u8,255
P_JOY_1,data,u8,255
P_LED_GPIO,data,u8,255
P_ADC_KBD,data,u8,255
P_BACKLIGHT,data,u8,4
option_space,namespace,,
O_LCD_TYPE,data,u8,192
O_LCD_ROTA,data,u8,0
O_LCD_OUT,data,u32,30
O_DDMM_FLAG,data,u8,1
custom_ir_space,namespace,,
K_UP,data,string,
K_LEFT,data,string,
K_OK,data,string,
K_RIGHT,data,string,
K_DOWN,data,string,
K_0,data,string,
K_1,data,string,
K_2,data,string,
K_3,data,string,
K_4,data,string,
K_5,data,string,
K_6,data,string,
K_7,data,string,
K_8,data,string,
K_9,data,string,
K_STAR,data,string,
K_DIESE,data,string,
K_INFO,data,string,
Madjestik58
Offline
Зарегистрирован: 03.03.2019

Схема по которой всё работает

https://imgur.com/V0xnx9A

https://imgur.com/a/KEGPkTk