logo elektroda
logo elektroda
X
logo elektroda

Internet radio and audio file player on ESP32-S3

MAJSTER XXL 100371 1227
ADVERTISEMENT
Treść została przetłumaczona polish » english Zobacz oryginalną wersję tematu
  • #391 21398300
    robgold
    Level 20  
    @MAJSTER XXL .

    Throw IR taska priority to 0 on Core 1
    syntax (task, name, memory reserve, NULL, priority, NULL, Core)

    xTaskCreatePinnedToCore(ir_task, "ir_task", 2048, NULL, 0, NULL, 1);


    Otherwise it blocks the operation of the radio because it keeps looking for code.

    I threw in the volume control for a test and it works. Code below.
    It flies in the main loop. On me on this RC-406 the code VolumeUp is 0x14, VolumeDown is 0x15
    The problem is when you hold the button down for a long while it dumps the RMT driver.

    By the way I think you need to create void functions for: VolumeUp, VolumeDown, BankUp, BankDown.
    More and more often whether in the web server or remote control it copies the same blocks and you can just cancel.

    I have another old NEC IR receive function that was also dumping EPS but I have corrected it and it is test running on the other board. I will check this one further.

    The code is for the one based on Freenove.

    
    if(ir_recv.nec_available())
      {
        if (ir_recv.data() != 0xffffffff) 
        {
          Serial.printf("IR Protocol:%s, IR Code: %#x\r\n", ir_recv.protocol(), ir_recv.data());
          dataIr = reverse_bits(ir_recv.data(),32);
          address = (dataIr & 0xFF);
          command = (dataIr >> 16);
          
          Serial.printf("data:%#x\r\n",dataIr);
          Serial.printf("address:%#x\r\n",address);
          Serial.printf("command:%#x\r\n",command);
          
          displayStartTime = millis();
          timeDisplay = false;
          volumeSet = true;
          displayActive = true;
          
          if ((address == 185) && (command == 14))
          {
            Serial.println("Volume UP");
            volumeValue++;
              if (volumeValue > 21) {
                volumeValue = 21;
              }
            Serial.print("Wartość głośności: ");
            Serial.println(volumeValue);
            audio.setVolume(volumeValue);  // zakres 0...21
    
            // Używamy funkcji String() do konwersji liczby na tekst
            String volumeValueStr = String(volumeValue);  // Zamiana liczby VOLUME na ciąg znaków
            u8g2.clearBuffer();
            u8g2.setFont(u8g2_font_fub14_tf);
            u8g2.drawStr(65, 33, "VOLUME");
            u8g2.drawStr(163, 33, volumeValueStr.c_str());
            u8g2.drawRFrame(21, 42, 214, 14, 3);             // Rysujmey ramke dla progress bara głosnosci
            u8g2.drawRBox(23, 44, volumeValue * 10, 10, 2);  // Progress bar głosnosci
            u8g2.sendBuffer();
    
          }
    
    
         if ((address == 185) && (command == 15))
          {
            Serial.println("Volume Down");
           volumeValue--;
              if (volumeValue < 1) {
                volumeValue = 1;
              }
            Serial.print("Wartość głośności: ");
            Serial.println(volumeValue);
            audio.setVolume(volumeValue);  // zakres 0...21
    
            // Używamy funkcji String() do konwersji liczby na tekst
            String volumeValueStr = String(volumeValue);  // Zamiana liczby VOLUME na ciąg znaków
            u8g2.clearBuffer();
            u8g2.setFont(u8g2_font_fub14_tf);
            u8g2.drawStr(65, 33, "VOLUME");
            u8g2.drawStr(163, 33, volumeValueStr.c_str());
            u8g2.drawRFrame(21, 42, 214, 14, 3);             // Rysujmey ramke dla progress bara głosnosci
            u8g2.drawRBox(23, 44, volumeValue * 10, 10, 2);  // Progress bar głosnosci
            u8g2.sendBuffer();
            }
            address = 0; // zerujemy kod pilota IR
            command = 0;  
        }
      }
    
    .
  • ADVERTISEMENT
  • #392 21398381
    MAJSTER XXL
    Level 29  
    I managed to do the IR remote control operation without any additional libraries based on the pulse test, the strings returned are repeated enough that I can treat them as correct, although probably when I connect the logic analyser later on, errors will come out, but that's for later to work out.
    I have inserted a new function into the main loop:
    analyzePulseFromIR(); // Analyses the data from the IR receiver and recognises commands from the remote.

    and the preparation for the analysis looks like this:

    Code: C / C++
    Log in, to see the code
    .

    and the most important thing is that nothing gets dumped even when holding the button for a long time, below is a screen shot of how it works, I'll upload an update to github later:


    Screenshot of the Arduino IDE console showing code operation with an IR remote. .

    edit. it already works nicely to switch radio stations right and left on the remote, there is progress.
  • #393 21398420
    robgold
    Level 20  
    And I checked this other library <IRremote.hpp> and after setting everything up it also worked and doesn't lecture.

    Well it's time for the third version from you. :) .
    Just taking a quick look, it would be good to validate in these 32bit. In the NEC 2-bytes go directly 2 are negation.


    Screenshot of a serial monitor displaying data from a remote decoder connected to an ESP32 microcontroller. .


    @MAJSTER XXL .
    As far as I can see, the function in the interrupt (this one is probably tacked on to the ATTR) counts the pulse time difference and then you just have a simple comparison of > from 500us or > 1600us followed by a 32bit variable. No problem catching those initial 9ms in the NEC protocol ? I hooked up the receiver because I was already starting to wonder myself what it was sending to the ESP.

    Digital oscilloscope waveform showing a square signal with measurement data. .
    Oscilloscope signal graph showing electrical pulses in the NEC protocol. .

    I hooked up the trigger on GPIO15 to CHANGE, ISR functions to Interrupt
    Question where do you call the analysis of what is in the interrupt ? This data changes every ~560us.
  • #394 21398662
    MAJSTER XXL
    Level 29  
    @robgold I've uploaded to github my today's write-up regarding the implementation of the radio station switching control and volume control - it works reasonably well, although I've disabled the 4 byte compatibility check against the NEC standard, as I don't know exactly why a couple of buttons from the remote control, despite sending the same bytes repetitively are reported as incompatible with the NEC.
    Link to the file, you can test, and I'll check on the analyser later and adjust the timings in the program to make it as good as possible, as I may be losing something. I'm curious myself as to what this Chinese thing of mine is sending.

    https://github.com/sarunia/ESP32_radio_player_v2/blob/main/ESP32_radio_v2/ESP32_radio_v2.ino
  • #395 21398736
    robgold
    Level 20  
    Majster, I uploaded your sketch and it works but it is not very stable. I uploaded mine with the same code inserts and it gets FFFFFFFFFF.
    I was getting FFFF.... before too I thought I had set something wrong in the interrupt, but copy after copy it's the same thing just in different places in the program.

    It must be very time dependent. I still have the scroller, vumeter, web server running in the loop.
  • #396 21399137
    MAJSTER XXL
    Level 29  
    @robgold is corrected, as far as it will turn out in practice, I motivated myself and found my analyser and checked the timings and raw data carefully and included it in the code, I added a validation with the NEC protocol and so far it looks promising, by the way I learned from it without involving additional libraries, so we will have better control of the whole thing.
    Of course how will everything turn out after user testing, let's hope....

    Below is a snapshot of the serial and screen a of the analysis:


    Screenshot of a logic analyzer display showing decoding results of the NEC protocol. .
    Screenshot of Arduino IDE showing the serial port monitor. .
  • ADVERTISEMENT
  • #397 21399235
    robgold
    Level 20  
    I'll check right away if the fixes have helped anything. Generally the problem so far has been collecting one bit in the interrupt loop. In my case, the main loop doesn't work out so fast and as a result I don't collect these bits properly. As you've seen I've even already hooked up an oscilloscope because it wasn't working. When I cleared the main loop to zero I started to read the characters.

    Out of curiosity I increased the Freenov library memory resource in the task in core and now it works without any problem. Stably and repetitively you can hold the remote control button
    and it works correctly.

    However, the best work so far is the good old "<IRremote.hpp>" very fast, smooth and has not crashed once it recognises every protocol correctly. It also does not affect the operation of tasks that run in the background or on the screen.


    Edit:
    It works very poorly for me as if it doesn't assemble bits at all. Once it gets going after pressing the remote once, 1 in 20 I get the correct message.

    And yes once I've caught one command I think you have a MSB-LSB flipped command byte:
    IR code received: 9D62A857
    The NEC code is correct.
    Address: 9D
    Command: A8
    Other button

    For this remote I'm using, the correct address is 9D and the command 15. It looks like this A8 has the bit order swapped.
  • #398 21399515
    MAJSTER XXL
    Level 29  
    @robgold OK, in that case I'll still try to refine my code to handle the remotes, if you can please send code snippets to handle with IRremote.hpp, because I can't get started with it, it keeps rebooting my ESP32.
  • #399 21399655
    robgold
    Level 20  
    I spent half the night working on it - I got sucked into that damn radio ;) but somehow I find I write code best when everyone is asleep.

    Let's say I've solved the problem but I see some things to improve.
    Instead of checking in a loop void loop() which is time unstable I assigned the IR code check to Ticker for Timer2 . The timer calls every 300us. Since both functions ( pulsISR() and analyzePulseFromIR() ) are now working with interrupts then according to the interrupt handler instructions I wrote them as being written to RAM -> IRAM_ATTR

    void IRAM_ATTR analyzePulseFromIR()
    void IRAM_ATTR pulseISR()
    .

    Now the remote works very well, smoothly and independently of the main loop. All in all, it starts to work like any other library for IR with Timer.
    And most importantly the "scroller", web server, vumeter works and wifi manager works correctly.

    Disadvantages and what needs to be improved:
    Since analyzePulseFromIR() is now linked to an interrupt, such a program must be short and no subroutines must be executed in it, otherwise we will exhaust the ESP - we will run out of stack and there are only 8192 of them (you probably know this but I am writing so that other colleagues can understand).
    So if we start to add more button flags inside the function, at some point the stack will overflow.

    In my opinion, the analyzePulseFromIR() function should only set the IRcode and that's it. The code check needs to take place in the main loop and there the code will be assigned to the function and reset. At the moment everything works because we have both of us with just 4 arrow flags or as in my case V+, V-, Station+ and Station-.
    When the numeric button handling comes along, besides that someone might come up with a remote control with 30 buttons then there is a risk that the ESP will give up.

    I will upload on GitHub all three versions test, upload tell me what your impressions are.

    ESP32_radio_evo3.11 - based on Freenove, after increasing Tasks memory, works fine, a bit slow in my opinion.
    ESP32_radio_evo3.12 - based on <IRremote.hpp> - runs super fast, stable.
    ESP32_radio_evo3.13 - based on your readout and my timer interrupt solution. Works very smoothly, fast stable for now.

    Link to GitHub - tests .

    Someone looking from the side will say that we are reinventing the wheel but this is Our wheel :D .

    Edit:
    The spell is gone...I managed to get the ESP to reset once and that's already a bad sign. I'll rewrite the code checking into the main loop to keep the program working with the Timer to a minimum.
  • #400 21399710
    khoam
    Level 42  
    robgold wrote:
    Because analyzePulseFromIR() is now linked to an interrupt, such a program must be short and no subroutines must be executed in it, otherwise we will exhaust ESP - we will run out of stack and there are only 8192
    .
    In fact, the default stack size for the thread that executes loop() is 8192 and this value is set by the constant ARDUINO_LOOP_STACK_SIZE in the Arduino SDK. To set your own stack size, define this constant before importing Arduino.h:
    Code: C / C++
    Log in, to see the code
    .
    PlatformIO users can set themselves the size of this stack in platformio.ini:
    Code: Ini
    Log in, to see the code
    .

    As for "running out" of stack for a given thread, I would not rely on intuition, but would check how much of that stack is left in the thread using the function uxTaskGetStackHighWaterMark ():
    Code: C / C++
    Log in, to see the code
    .

    Added after 9 [minutes]:

    robgold wrote:
    IRAM_ATTR
    .
    Note that this area of RAM is also not made of rubber and it falls out to monitor its availability using heap_caps_get_free_size ():
    Code: C / C++
    Log in, to see the code
    .

    Most ESP32 "unexpected" reboots originate from insufficient IRAM or thread stack (arduino libraries are rarely optimised for this).
  • #401 21399776
    robgold
    Level 20  
    ESP writes out what is wrong with it. Admittedly not always explicitly but it tries ;) .
    As for changing the stack size, I know you can change it, you can even edit the main.cpp file in core, but I don't think it's about everyone changing the stack size in Arduino. Let's still try to "fight", I think that such things teach a lot.

    edit:
    @MAJSTER XXL .
    I made a version of evo3.14 where I threw away, the functions to assign the action when the button is pressed to the main loop.
    As my colleague @khoam hinted I threw out the stack information on the serial. It drops to 3148 and sticks at that level.
    In addition, I unzip and zip the interrupt when the code is recognised and when the action is executed because I don't think there is interrupt locking in ESP.
    I have not managed to get the ESP to reset so far.

    Thanks mate @khoam for the "insert" to read the stack value.

    Now, as easy as it is to scroll through the stations, it's starting to annoy me with their different volume levels.
    I'm wondering whether to average the VUmeter results in the function and do something like ARW (Automatic Gain Control).
  • #402 21399808
    khoam
    Level 42  
    robgold wrote:
    but I don't think that's the point of everyone changing the stack size in Arduino now.
    .
    I wasn't writing about every user. I was referring to the actual program code for this radio - it was written as if it was going to run on a PC, i.e. without taking into account what the limitations of ESP32 programming are. Adding more functionality only confirms this.
  • #403 21399844
    robgold
    Level 20  
    @khoam I absolutely will not deny that.
    Perhaps I have bad habits from writing on a PC. I am not a professional programmer. I am an electronics engineer I don't write code on a daily basis. I do it as a hobby. I know the limitations of embedded and I know that there are not unlimited resources here, you have to take care to "clean up" after yourself. As you can see, it doesn't always work out perfectly but I am counting on the help of others in this thread.
  • ADVERTISEMENT
  • #404 21399851
    khoam
    Level 42  
    robgold wrote:
    Additionally, I undo and fasten the interrupt after the code is recognised and after the action is executed because I don't think there is interrupt blocking in ESP.
    .
    There is in the form of defining critical sections, but you have to do it in "moderation".
  • #406 21399895
    khoam
    Level 42  
    robgold wrote:
    .
    Yes, example with taskENTER_CRITICAL() and taskEXIT_CRITICAL().

    Added after 3 [hours] 45 [minutes]: .

    I've had a more detailed look at that council code. Tasks related to audio, buttons, display, etc. are fired in loop(), that is, with a uniform priority of 1 (yes, this is set in the Arduino SDK). This is the lowest possible priority, 0 being IDLE only. I would suggest separating the tasks into separate threads and so, for example, the display handling can execute with a low priority, but the audio handling is rather with a higher one. It will be easier to manage these tasks. That's my three cents.
  • #407 21400318
    robgold
    Level 20  
    So PinTask audio and raise its priority ? As I remember well from the documentation the priority level in ESP is from 0 to 3, you can try it. Am I thinking right?
  • ADVERTISEMENT
  • #408 21400330
    khoam
    Level 42  
    Task priorities in ESP-IDF range from 0 (lowest priority) to CONFIG_FREERTOS_MAX_PRIORITIES - 1 (highest priority). The default value of CONFIG_FREERTOS_MAX_PRIORITIES is 25, meaning priorities from 0 to 24. Tasks for audio handling should run at medium priority, but higher than standard user tasks, i.e. between 5 and 10. WiFi handling is system priorities 11-20, so there will be no 'conflicts'.

    It is of course important to remember that tasks should regularly free up CPU resources for other tasks, using arduino delay() or explicitly vTaskDelay().
  • #409 21400405
    hevet
    Level 16  
    Hi after the break. I see the project is progressing at a great pace.
    Question for @robgold, I'm trying to compile your version 3.11 where there is a change from EEPROM to PSRAM, but I'm getting this error:


    2754 | psramData = (unsigned int8_t *)ps_malloc(PSRAM_length * sizeof(unsigned int8_t));
    | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | |
    | unsigned char*
  • #410 21400431
    MAJSTER XXL
    Level 29  
    @hevet I have the same on all versions from colleague @robgold from github.
  • #411 21400437
    hevet
    Level 16  
    Maybe @robgold can tell the secret on how to fix it. Although on github he has a compiled bin file for version 3.11. Is it possible to somehow upload the file via flasher or otherwise?

    Link to my old version from github, as I read you wanted to see something there.
    https://github.com/hevet/radio-player
  • #412 21400553
    khoam
    Level 42  
    hevet wrote:
    2754 | psramData = (unsigned int8_t *)ps_malloc(PSRAM_lenght * sizeof(unsigned int8_t));
    .
    Type unsigned int8_t * is incorrect. It should be uint8_t* or (according to the psramData variable declaration), unsigned int * .
    ps_malloc() returns void * .
  • #414 21400680
    robgold
    Level 20  
    There should be " unsigned char" in the PSRAM declaration. I don't know why my compiler didn't have a problem with this and it worked fine on Arduino 2.0.1 and yesterday I did an upgrade to 2.3.4 and it worked too. Correct it should be:

    unsigned char * psramData;
    psramData = (unsigned char *)ps_malloc(PSRAM_lenght * sizeof(unsigned char));
    .

    And what is the difference between a characterless unsigned int and a uint ? "u" stands for unsigned if my knowledge is not mistaken. Moreover, old compilers didn't have the notation "uint", but you wrote unsigned int, uint8_t or unsigned int8 or, if you prefer in the basic way, byte - 8 bits. We always keep a byte in memory. Whether the last oldest bit will indicate a character or not is already our declaration.


    Now some information for those who have problems with compiling "from scratch". Today I did an exercise on a foreign computer where there has never been an Arduino.

    - We install Arduino 2.3.4 - installation for all users (Arduino in Program Files, libraries in C:USER NAME -AppData - LocalArduino15 -libraries).
    - We download in tile libraries the package - ESP32 by Espressif (see image) .
    - We download the whole project from GitHub and into the aforementioned directory (C:YOUR USER NAMEAppDataLocalArduino15libraries) we copy the libraries
    - ESP32-audioI2S
    - ezButton
    - U8g2
    - WiFiManager

    Everything, the program compiles correctly. Sorry for the pictures but I had no way to take a screenshot.

    Screen view showing a list of Arduino libraries. .
    List of ESP32 boards to install in Arduino IDE. .
  • #415 21400709
    hevet
    Level 16  
    And how are you set:
    Flash size and Partition Scheme?
  • #416 21400738
    robgold
    Level 20  
    All the ESP32s I have are the 16N8 version which is 16MB Flash and 8 MB RAM.
    Huge APP 3MB, NO OTA, 1 MB SPIFSS

    Tool menu with ESP32 module settings. .
  • #417 21400742
    hevet
    Level 16  
    Thanks, managed to compile, works even :) .
  • #418 21400870
    simw
    Level 27  
    robgold wrote:
    Now info for those who have problems compiling "from scratch"
    .
    And the json from where?
    #include <ArduinoJson.h>
    ?
    The one as in the picture fits, but it is not installed by default.

    Screenshot showing the ArduinoJson library version 7.3.0 in a development platform. .
  • #419 21401801
    robgold
    Level 20  
    @MAJSTER XXL .

    I have incorporated your corrections into my sketch. Unfortunately I still found something average about the remote working.
    I started looking at that pulse analysis function and it seems to me that it was missing checking the start of the frame correctly.

    The IR receiver reads the code and outputs it negated (the output is an OC type with a 10k pull-up). The frame starts at 9ms but this pulse is NEGATIVE (have a look at the oscilloscope snapshot I took yesterday) In the interrupt handler you measure the pulse currently you start when it has a HIGH state and end when it has a LOW state. This way the 9ms pulse is never analysed because it cannot be measured.

    In the NEC protocol the "1" pulse lasts 1600us and the "0" pulse lasts 560us. Since we have the reverse logic this:
    Our pulse "1" lasts 2.25ms -> 2250us-560us = 1690us, the pulse "0" on the other hand lasts 1.25ms -> 1250us - 560us = 690us and such values must be analysed in the functions.

    I made in the void IRAM_ATTR pulseISR() detection of a negative pulse and entered it into the analysis. Now the function void IRAM_ATTR analyzePulseFromIR() must first detect a pulse of 9ms, then 4.5ms and then starts to analyse the individual bits and "insert" them into the IR_CODE variable.

    Since in the NEC protocol the bits come in an LSB-MSB configuration I did a rotation of the full 4 bytes i.e. "endian" swaps:

    We read LSB - MSB
    Address --- /Address --- Cmd --- /Cmd
    9D --- 62 --- 28 --- D7
    9D --- 62 --- A8 --- 57

    Rotation to MSB - LSB
    /Cmd --- Cmd --- /Address --- Address
    EB --- 14 --- 46 --- B9
    EA --- 15 --- 46 --- B9

    //9D6228D7 vol+ EB1446B9
    //9D62A857 vol- EA1546B9

    Now we have the remote control codes read correctly. I finally fold the address and code variable into one string and 0xADRCMD is formed. In my case B914 for the Kenwood standard in which I have the remote control. That is, remote control address B9 and command 14 -> VOL+

    The operation of the function void IRAM_ATTR analyzePulseFromIR() occurs in a Ticko Timer2 interrupt set to 50us (these are the timer times used by IR libraries) This gives us pretty good oversampling.

    I've thrown in additional variables that are assigned actual times of 9ms, 4.5ms and the last pulse of 1690us and 690us in the interrupt handler. This allows you to view how well the remote control "holds the timings" and what tolerance should be set for the TOLERANCE variable.

    On the terminal we get:
    NEC code OK:9D6228D7 MSB-LSB: EB1446B9 ADR:B9 CMD:14
    debug -- Analysis - pulse 9ms:8975 4.5ms:4601 1690us:1691 690us:621

    For those who wish to test with their remote control, a map of the remote control codes can be found in the DEFINE section at the beginning of the ino file.
    
    #define rcAdress 0xB9
    #define rcCmdVolumeUp 0xB914      // Głosnosc +
    #define rcCmdVolumeDown 0xB915    // Głośnosc -
    #define rcCmdArrowRight 0xB90B    // strzałka w prawo - nastepna stacja
    #define rcCmdArrowLeft 0xB90A     // strzałka w lewo - poprzednia stacja  
    #define rcCmdArrowUp 0xB987         // strzałka w góre - lista stacji krok do gory
    #define rcCmdArrowDown 0xB986     // strzałka w dół - lista stacj krok na dół
    #define rcCmdOk 0xB90E            // Przycisk Ent - zatwierdzenie stacji
    #define rcCmdSrc 0xB913
    #define rcCmdMute 0xB916
    #define rcCmdKey0 0xB900
    #define rcCmdKey1 0xB901
    #define rcCmdKey2 0xB902
    #define rcCmdKey3 0xB903
    #define rcCmdKey4 0xB904
    #define rcCmdKey5 0xB905
    #define rcCmdKey6 0xB906
    #define rcCmdKey7 0xB907
    #define rcCmdKey8 0xB908
    #define rcCmdKey9 0xB909
    
    .

    I have corrected the PSRAM from yesterday's discussion. Now the PSRAM declaration is char instead of unsigned int8_t
    In addition, when started, the station scrolling starts from the currently played station.

    I have uploaded the file with the above mentioned fixes to GitHub. Radio Evo3 rev3.14. Link .
    The remote now seems to work stably and reproducibly but still not perfectly.
    Will try to do compilations with the IR library and compare performance.

    To answer your question about the library Json then I have no idea. The foreman will have to comment. There is no weather in the Evo3.

    Oscilloscope screenshot showing IR remote signals. .
    Infrared signal diagram of the NEC protocol with annotated pulse durations.
  • #420 21401913
    MAJSTER XXL
    Level 29  
    @robgold great that you've embraced this analysis function, because you see.... on my analyser I had a normal high state, the probe connected directly to OUT without plugging into ESP32 and when I commanded the remote, first for 9ms a low state came in and then for 4,5ms a high state, so it confused me. Only I'll tell you that I had the 9ms pulses and the 4.5 ones enabled on the serial and they appeared normally after every even the shortest peak from the IR remote, so I don't get it anymore, my analyser is lying, I don't think so. I'll save the topic for the weekend as I won't have time to do it during the week. I'll just be peeking in for a while to read what's new, so keeping my fingers crossed.

    @simw Json the usual first off the shelf from Arduino, just need to get yourself an account on weatherman and supply a link with your own location as mine is Saw, plus an API key, good luck.


    Arduino IDE window with open ESP32 code and library manager showing ArduinoJson library selected. .

Topic summary

The discussion revolves around building an internet radio and audio file player using the ESP32-S3 microcontroller. The project includes features such as an OLED display, Wi-Fi connectivity, and audio playback capabilities. Users share their experiences with hardware setup, including issues with pin configurations, library compatibility, and troubleshooting compilation errors in the Arduino IDE. Suggestions for libraries, such as ESP32-audioI2S and WiFiManager, are provided to enhance functionality. Participants also discuss the importance of proper wiring, capacitor usage for encoders, and the potential for adding features like DLNA support and a web management interface for radio station management. Several users report on their progress, share code snippets, and offer solutions to common problems encountered during development.
Summary generated by the language model.
ADVERTISEMENT