logo elektroda
logo elektroda
X
logo elektroda

Internet radio and audio file player on ESP32-S3

MAJSTER XXL 197121 2147
ADVERTISEMENT
Treść została przetłumaczona polish » english Zobacz oryginalną wersję tematu
📢 Listen (AI):
  • #1501 21748429
    MAJSTER XXL
    Level 29  
    And what would you say about adding RSS news display to the radio in the v3 version, I practiced the Polsat News Polska channel, you can probably also choose another channel from those available on the website: https://www.polsatnews.pl/kanaly-rss/
    I just chose this content: https://www.polsatnews.pl/rss/polska.xml

    In the main loop I added a new function, which is called every 1 minute and in each cycle displays one news item from all those available in turn:
    Code: C / C++
    Log in, to see the code



    View of Arduino IDE showing RSS logs from Polsat News feed


    Device screen showing RSS news from Polsat News about Independence Day message
    Radio display shows RSS news feed from Polsat News Polska channel
    LCD screen showing an RSS feed message from the Polsat News Polska channel
    Device screen displays an RSS news item from Polsat News about Katowice's transformation.
  • ADVERTISEMENT
  • #1502 21748435
    DJCheester
    Level 27  
    Hello this radio is slowly becoming an e-gazette 😀
    I for one am in favour.

    Greetings...
  • #1503 21748442
    irysbox
    Level 13  
    and I'm of the opinion that you have a laptop for information :) the radio should have typical audio functions plus time, date sleep alarm and that's it, nobody stares at the screen all the time and grabs information, switches on the radio and listens to it mainly
  • #1504 21748461
    DJCheester
    Level 27  
    Maybe so but not everyone has a permanent laptop on their desk switched on, such information can sometimes come in handy.

    If it was to be the radio itself then a colour screen is already something overkill that the radio is designed for 😀

    But everyone can (and should) have their own opinion, and I'm still in favour 😀

    Greetings ...

    Added after 4 [minutes]:

    Majster and tell me how do you get this information onto the screen i.e. how does the radio get it, do you pull this RSS data from the website or is it some strips on the TV pages and how do you get the link to put it on the screen ?
  • #1505 21748513
    robgold
    Level 22  
    Hello,
    i uploaded new version Evo 3.19.32 to my GitHub Dzikakun Link
    I have also added a "merged" file to the build directory this time, this can be uploaded using the standard ESP flash tool by uploading the BIN from address 0x0000

    What's new ?

    Power modes
    The radio after power up checks what was the reason for the reset, if it is the result of a power outage it goes into "Standby" mode. I have added a full reset also with RTC registers. Radio can be switched on/off both with IR remote control (red handset) and encoder2 (1x click 0.5 sec turns radio on, to turn off hold down until "POWER OFF" appears)

    Timer in "Standby"
    When the radio is switched off by remote control in this mode, the screen can remain off (black) or display a full-screen clock. Configuration takes place via the website - settings tab. Due to the fact that a new variable has been added to the config.txt file, please run the settings on the www page and re-write the configuration file

    OLED clock display showing time 19:41 in standby mode


    Sleep mode
    Use the green handset button to set the sleep mode. This function works as in Yamaha, Denon, Marantz tuners. With the first click we set the time from 90minutes to 15 minutes. (90->75->60->45->30->15->OFF). If the information about the set sleep time disappears from the display, from now on pressing the sleep button invokes the function showing the set time, another pressing switches sleep off according to the principle 1x click show sleep setting, another click sleep OFF. On the display in all modes the icon of the three letters "Z" appears - "ZZZ" as an indication of the activated SLEEP mode.

    OLED display showing SLEEP 90 MIN in green letters
    Radio display with OLED screen showing current station and active SLEEP mode icon


    No network mode
    In no-network mode when the WiFi manager starts up, the IR remote control works from now on to a limited extent, the radio can be switched off (red handset), and a reset can be performed using the 'back' button. This is a nod to those who use the HotSpot for internet and sometimes forget to switch it on.

    Radiobrowser
    A new 'Radiobrowser' button has appeared in the menu tab. This is a page that uses Radiobrowser servers to search for any radio station in the world. There is a "PLAY" button on the page, which sends the address of the stream and allows you to play the station immediately on the radio. The radio in this mode displays "URL" as the station number, while the bank number disappears from the display. At the moment, it is not possible to automatically transfer links to the selected Bank.
    NOTE: In order for the Radiobrowser website to work, the browser.html file located in the "SD card content" directory must be uploaded to the SD card or SPIFFS memory

    Screenshot of Evo Web Radio menu highlighting the Radio Browser API option
    Radio display shows WIHT-FM ZC Main station with AAC stream and signal indicators.
    Radiobrowser interface showing rock radio stations from the USA with Play buttons



    Volume function "Fadein-Fadeout"
    I have added the "Fadein", "Fadeout" function. Now the station change is done with a pleasing mute and volume. This has eliminated the crackling that sometimes occurred when switching stations. Also in SLEEP mode, when the radio has counted down the preset "bedtime", it will start to slowly mute and then switch off.

    Scrolling through the station list
    I have restored the option to scroll through the station list in the so-called "loop" mode, i.e. being on a station e.g: 99 scrolling by one station will set the list to position no: 1.

    Updating banks with stations
    I am slowly getting around to updating all the banks. A great many stations no longer work, many are duplicated between banks. There will probably be a lot of empty space. At the moment the following have been refreshed:
    Bank1 (treating this one as my list of favourite, handy stations)
    Bank16 contains HiRes FLAC stations

    The rest of the banks are coming soon.
  • ADVERTISEMENT
  • #1506 21748526
    DJCheester
    Level 27  
    Hello, I have a question, I turn the radio off with the bar and also turn it on with the bar, from what I read in the latest version after switching it on it goes into standby mode, is that so?

    If so, would it not be possible to configure somewhere in the code that the radio in such a situation would start as before ?

    PS thanks for including the reset of the radio from the remote control when there is no AP.

    Greetings....
  • #1507 21748528
    irysbox
    Level 13  
    if anyone is looking for feet for the case, I recommend this: it is aluminium cut from 2 parts (black and gold) and you can make black feet and gold feet from it I cleaned a little bit the side of the black one and piled the thread and there are black and silver feet and the other one gold :) whoever prefers :) when I finish the radio I will show how it looks like still waiting for one detail :) https://allegro.en/offer/galley-furniture-gol...lack-metal-loft-glamour-radelated-17527212106
  • #1508 21748534
    robgold
    Level 22  
    @DJCheester Exactly as you wrote i.e. turning on the strip also requires turning on the remote or encoder. It's easy to disable this in the code (I'll add the appropriate configuration in the next revision) For a quick reference: find the code snippet and just comment it out like this:

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


    change to:
    Code: C / C++
    Log in, to see the code
  • #1509 21748536
    DJCheester
    Level 27  
    Thanks for the quick reply, I'll be uploading this tomorrow to comment.

    Regards...
  • #1510 21748537
    Lechuuu
    Level 13  
    @robgold You do such a job it's a shock.... all other projects can go into hiding. Respect and thanks for your time on this project.
  • ADVERTISEMENT
  • #1511 21748539
    DJCheester
    Level 27  
    I am of the same opinion, this is the best developed internet radio I have fired up and I have fired up all the versions in this topic. The only thing missing for me personally is the MP3 player from the SD card, if that was there it would be beautiful, but my colleague Robgold gave it up, well that's a shame. But it's still beautiful.

    Greetings ...
  • #1512 21748581
    bolszoy
    Level 11  
    DJCheester wrote:
    In the library manager you have ESP by espressif installed and there is a version we (at least I) use 3.20



    Greetings....



    I understand, so I have the latest one.



    And the audioI2S library the latest one you install and swap the files in the library directory you enter from the SRC directory and swap the ones downloaded from Github kol Robgold.

    Greetings....
    I'll do that already tomorrow.

    Admiration and respect for your knowledge.
  • #1513 21748612
    DJCheester
    Level 27  
    That is, both in the core and in the AudioI2S library you have to swap files.

    From the start, it looks like this.
    You install the Arduino IDE

    Next

    To this you install the ESP board
    esp32 by Espressif System 3.2.0

    After installing the core, that is what you have to do above, you have to do the first file swap (these files are responsible for the correct playback of FLAC stations - these streams on the original files stutter - after the swap the game plays without clipping)

    You go to Github by Robgold here

    https://github.com/dzikakuna/ESP32_radio_evo3...eplace%20in%20Arduino%20for%20FLAC%20stations

    And you download this file and unzip it and there you have two files which you have to swap with the files in this location

    C:\Users\xxx\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.4-2f7dcd86-v1\esp32s3\lib

    Where xxx is your computer name you need to check what computer name you have and enter there instead of XXX

    Next you download the libraries from the library manager in the Arduino IDE environment.

    To compile Robgold's radio you need all these libraries

    AsyncTCP by ESP32Async 3.3.6
    ESP Async WebServer by ESP32Async 3.7.2
    ESP-audioI2S-master by schreibfaul1 3.4.2 (here I do not have a newer version listed in the library manager in arduino 2.1.1)
    U8g2 by olivier 2.35.30
    WiFiManager by tzapu 2.0.17
    ezButton by ArduinoGetStarted.com 1.0.4

    Once you have downloaded all of them, now for the second file swap, go into the documents on your computer then the Arduino and libraries folder where you will have folders with all the libraries you just downloaded.

    Now download another ZIP from Github by Robgold from here

    https://github.com/dzikakuna/ESP32_radio_evo3/tree/main/src/ESP32_radio_evo3.19/Arduino/libs

    This file AudioI2Scommit.....

    You unzip and copy the contents of this folder.

    Then go to documents / Arduino / libraries / ESP32-audioI@S-master / SRC /

    And there you remove everything that is there and winnow out the ones you extracted earlier from the AudioI2Scommit file.

    Now you select the ESP32-S3 board and COM port (of course you should install the CH343 driver for the ESP board beforehand so that Windows sees it correctly)

    Now you go to Github again here

    https://github.com/dzikakuna/ESP32_radio_evo3/tree/main/src/ESP32_radio_evo3.19

    And here is the Arduino configuration file, view this screenshot for yourself and set up the ESP board configuration as shown in the screenshot.

    Now after all these moves you should be able to compile and upload to the ESP board correctly.

    Greetings....

    Added after 11 [minutes]:

    And by the way, if you want to load the software of the master, you will need other libraries which you will have to download through the library manager, but I can write you about that tomorrow because today I do not remember them by heart.

    Greetings ...
  • #1514 21748808
    hevet
    Level 18  
    Interesting fact, at my place silence after winning the latest version, upload 3.19.19 sound works, version 3.19.32 no sound, library from the project.
  • #1515 21748987
    DJCheester
    Level 27  
    At me after uploading version 3.19.32 the sound is ;)
    Also libraries from the project as described above.

    Greetings ...
  • #1516 21749000
    hevet
    Level 18  
    Just strange, I don't know what is going on. After winning the previous version the sound works.
  • ADVERTISEMENT
  • #1517 21749005
    DJCheester
    Level 27  
    Oh, and also for colleague @bolszoy, when compiling the Mayster you additionally need the libraries

    Adafruit BusIO by Adafruit 1.17.4
    Adafruit GFX Library by Adafruit 1.12.3
    Arduinojson by Benoit Blanchon. 7.4.2

    Well, and the question of version the latest does not at all mean the best, at least I have tested these versions.

    Greetings ....
  • #1518 21749130
    hevet
    Level 18  
    robgold wrote:
    @DJCheester Exactly as you wrote, i.e. turning on the strip also requires switching on with a remote control or encoder. It's easy to disable this in the code (I'll add the appropriate configuration in the next revision) For a quick reference: find the code snippet and just comment it out like this:

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


    change to:
    Code: C / C++
    Log in, to see the code
    It helps, but only when I restart the radio, the sound is there, when I switch off with the remote control and switch on the sound is not there.


    Added after 4 [hours] 49 [minutes]:

    There's a babble somewhere, after commenting out these lines, the sound will return, but you always have to unplug the esp from the power supply and plug it back in, otherwise it's silence. That is, after poweroff from the remote, the sound will not be there. @DJCheester that would explain why you have sound, because you commented out the option to put the radio to sleep when power returns and you turn the radio off with the strip, and after a power restart the sound will be there.
  • #1519 21749369
    DJCheester
    Level 27  
    I mean it wasn't quite as you write.

    After this change, the radio switched off with the strip when switched on automatically went to power off.

    I spoke to wheels. Robgold and he still recommended that I change it to be like before.

    Find the two code fractions:

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

    replace with:

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


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


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


    Maybe this will help. The radio now fires up as before i.e. full start when the strip is engaged.

    Regards...

    Added after 5 [minutes]:

    Tomorrow morning I will check that the power button on mine works as you write i.e. power strip, then power off remote, then remote 2x power button remote and see if there is sound. I will let you know. Because I haven't checked that so far.

    Regards...
  • #1520 21749384
    hevet
    Level 18  
    @DJCheester , after starting sleep is gone and sound is there, but after switching off and on with remote control sound is gone, power reset needed.
  • #1521 21749396
    robgold
    Level 22  
    Hello, I have uploaded version 3.19.33 to GitHub with a few fixes:

    - corrected lack of responsiveness to numeric buttons and station selection with OK button confirmation when playing from the url radio-browser (after waiting 4 sec. the station changed but with OK confirmation it did not)
    - new configuration file, added option to disable sleep after power failure
    - Radio-browser version 1.8 now detects the IP/host from which it is started (previously, evoradio.local was fixed)
    - Update of the Info tab in the Menu
    - Slight modification of the start-up screen


    As for the sound problems, I have no idea why you have them. The radio after waking up does a RESET and in the "changeStation" function if the MUTE flag is not on it does a FadeIn
    if (volumeFadeOn && !volumeMute) { startFadeIn(volumeValue);} else if (!volumeMute) {audio.setVolume(volumeValue);}
    So it doesn't matter that going to standby or sleep performs a mute because the only option to get out of it anyway is power ON, which calls:
    RESET -> REG_WRITE(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_SYS_RST); // Full hardware restart as from reset button

    And this again reloads the stations from scratch and in the changeStation function will set the volume to that stored in the volume.txt file
    What value do you have there ?


    You can comment out this line (in the changeStation function), make it permanent:
    audio.setVolume(volumeValue);

    disable the handleFadeIn(); function in the main loop and see if it works.
    The Fadein/out enable flag is permanently sewn into the becnie program with a value of 1 ( bool volumeFadeOn = 1;)
  • #1522 21749402
    hevet
    Level 18  
    @robgold I found the solution, you need to change

    esp_light_sleep_start(); // USING ESP

    to

    esp_deep_sleep_start(); // USING ESP on

    and the sound works even with the option to sleep when power returns.
  • #1523 21749420
    robgold
    Level 22  
    @hevet these are completely two different ESP sleep modes. In deep sleep you wake up to any remote control button (even a stranger's) because you do a restart in light you wake up to YOUR remote control button and where you fell asleep,

    Do a memory cleanup and upload the program via Arduino or ESP Tool.
    After all, there are no miracles here, it has to work unless you manually modified something in the program.
  • #1524 21749424
    hevet
    Level 18  
    OK, I know but otherwise with me there is no sound, I'll stay with that.

    Ps. Will you upload the new version on Platformio too?
  • #1525 21749436
    robgold
    Level 22  
    >>21749424 It's on GitHub. Choc I'm slowly leaning towards moving away from uploading Platformio files.
    Bede will just test that it compiles correctly but without uploading files.

    It won't work for you because an interrupt from the Timer from the RTC clock will wake up your radio and do a reset. What bothers me is your lack of sound. Show what you have in the logs on the terminal.
  • #1526 21749462
    hevet
    Level 18  
    debug changeStation -> Read station from PSRAM
    debug changeStation -> Station name: Yanosik Radio Bank 1 Station 6
    debug changeStation -> Currently selected station: 62
    debug changeStation -> Link to station: http://stream.rcs.revma.com/7vhveccrnquvv
    info: ....... inputBufferSize: 655349 bytes
    audio_logs: Audio.cpp:303 buffers freed, free Heap: 194756 bytes␛[0m
    info: ....... connect to: "stream.rcs.revma.com" on port 80 path "/7vhveccrnquvv"
    info: ....... Connection has been established in 58 ms
    last URL: ... http://stream.rcs.revma.com/7vhveccrnquvv
    debug SPIFFS -> We save the bank: 1
    debug SPIFFS -> Saving stations: 62
    debug SPIFFS -> File station_nr.txt already exists.
    debug SPIFFS -> Update station_nr.txt on SPIFFS card
    debug SPIFFS -> The file bank_nr.txt already exists.
    debug SPIFFS -> Update bank_nr.txt on SPIFFS card.
    info: ....... redirect to new host "http://n44a-eu.rcs.revma.com/7vhveccrnquvv?rj-ttl=5&rj-tok=AAABmnljAtkAb26MLh-ipVPjrQ"
    info: ....... next URL: "http://n44a-eu.rcs.revma.com/7vhveccrnquvv?rj-ttl=5&rj-tok=AAABmnljAtkAb26MLh-ipVPjrQ"
    audio_logs: Audio.cpp:816 playlistFormat NONE, dataMode HTTP_RESPONSE_HEADER, streamType: WEBSTREAM␛[0m
    debug displayDimmer -> displayDimmerActive: 0
    info: ....... station name: -
    audio_logs: Audio.cpp:4669 playlistFormat NONE, dataMode AUDIO_DATA, streamType: WEBSTREAM␛[0m
    info: ....... AACDecoder has been initialized
    info: ....... stream ready
    info: ....... syncword found at pos 0
    info: ....... stream title: Only You - Shouse & Cub Sport
    info: ....... AAC HeaderFormat: ADTS
    info: ....... Channels: 2
    info: ....... SampleRate (Hz): 44100
    info: ....... BitsPerSample: 16
    info: ....... without SBR
    info: ....... evt_bitrate: 94147
    info: ....... estimated bitrate (b/s): 94147
    debug IR -> NEC code OK:9D6211EE MSB-LSB: 778846B9 ADR:B9 CMD:88
    debug IR -> pulse 9ms:9023 4.5ms:4447 1690us:1636 690us:523
    21
    info: ....... Closing web file "http://stream.rcs.revma.com/7vhveccrnquvv"
    info: ....... AACDecoder has been destroyed
    debug power -> I put ESP to sleep, power off


    *wm:AutoConnect: SUCCESS
    *wm:STA IP Address: 192.168.1.135
    Connected to the WiFi network
    mDNS started, address: evoradio.local in browser
    debug PWR -> power OFF when power returns
    debug PWR -> clock function f_displayPowerOffClock: 1
    21
    debug PWR -> power off


    debug changeStation -> Read station from PSRAM
    debug changeStation -> Station name: Yanosik Radio Bank 1 Station 6
    debug changeStation -> Currently selected station: 62
    debug changeStation -> Link to station: http://stream.rcs.revma.com/7vhveccrnquvv
    info: ....... inputBufferSize: 655349 bytes
    audio_logs: Audio.cpp:303 buffers freed, free Heap: 194740 bytes␛[0m
    info: ....... connect to: "stream.rcs.revma.com" on port 80 path "/7vhveccrnquvv"
    info: ....... Connection has been established in 43 ms
    last URL: ... http://stream.rcs.revma.com/7vhveccrnquvv
    debug SPIFFS -> We save the bank: 1
    debug SPIFFS -> Saving stations: 62
    debug SPIFFS -> File station_nr.txt already exists.
    debug SPIFFS -> Update station_nr.txt on SPIFFS card
    debug SPIFFS -> The file bank_nr.txt already exists.
    debug SPIFFS -> Update bank_nr.txt on SPIFFS card.
    info: ....... redirect to new host "http://n37a-eu.rcs.revma.com/7vhveccrnquvv?rj-ttl=5&rj-tok=AAABmnlmXJcAMUGuwfOUC6a4nw"
    info: ....... next URL: "http://n37a-eu.rcs.revma.com/7vhveccrnquvv?rj-ttl=5&rj-tok=AAABmnlmXJcAMUGuwfOUC6a4nw"
    audio_logs: Audio.cpp:816 playlistFormat NONE, dataMode HTTP_RESPONSE_HEADER, streamType: WEBSTREAM␛[0m
    debug displayDimmer -> displayDimmerActive: 0
    info: ....... station name: -
    audio_logs: Audio.cpp:4669 playlistFormat NONE, dataMode AUDIO_DATA, streamType: WEBSTREAM␛[0m
    info: ....... AACDecoder has been initialized
    info: ....... stream ready
    info: ....... syncword found at pos 0
    info: ....... stream title: NA SEN - URSZULA
    info: ....... AAC HeaderFormat: ADTS
    info: ....... Channels: 2
    info: ....... SampleRate (Hz): 44100
    info: ....... BitsPerSample: 16
    info: ....... without SBR
    info: ....... evt_bitrate: 94619
    info: ....... estimated bitrate (b/s): 94619

    Added after 1 [hour] 1 [minute]:

    Do a memory cleanup and upload the program via Arduino or ESP Tool.
    After all, there are no miracles here, it has to work unless you manually modified something in the program.

    I've tried it, I've got the pins changed, I'm using SPIFFS and not an SD card, that's all. I even took to uploading on a second ESP32S3, another PCM5102 and still the same.

    Added after 32 [minutes]:

    Ok, I have no idea, I don't want to agonise anymore, something is fiddled with and I don't know what, the radio is back on the shelf for now.
  • #1527 21749579
    efi222
    Level 21  
    hevet wrote:
    I even uploaded on a second ESP32S3, another PCM5102 and still the same.

    I suggest you still clear the system temp directory (before compiling) if you are compiling on Windows.
  • #1528 21749580
    hevet
    Level 18  
    On the other laptop I also tried it. After uploading the older version the sound comes back and there is no problem, it is with the new version that something is wrong.
  • #1529 21749607
    bolszoy
    Level 11  
    DJCheester you are great. It went like clockwork and I think you helped not only me. I've read the topic a few times and I can honestly say that it's hard to figure out which files for which version, what to change and where. Especially if you are a layman like me.
    Really great respect to the author of the project and colleagues who put so much into it, and so selflessly.

    Nonetheless, the coolest version is the one with buttons and encoders, because you can really rework the sate radio in a cool way and it was done o£.
  • #1530 21749612
    robgold
    Level 22  
    @hevet and what is your pin configuration ? Nothing fiddly there normal functions.
    Send me your ino file on priv.

    I've uploaded your file to my Platformio, just changed the configuration for my board and ALL WORKS.
    The radio plays perfectly and starts up correctly every time with sound, FadeIn and FadeOut works. I've had a look at what you have interesting in Banks with stations ;)


    I suspect that this OLED reset statement is causing problems. There have been many times that there are problems with this "-1" notation.
    #define RESET_OLED -1 // Reset pin for the OLED interface
    Change to anything else but not -1 and let us know if it helped.
    Evo Web Radio interface with radio station list and active station Eska2 playing


    Thanks for making me realise (through a quick code analysis) that I don't actually have a declaration for the OPUS codec.

    What extra does the second character conversion give you: transliterateToAscii(stationNameStream); ?


    Code: C / C++
    Log in, to see the code
📢 Listen (AI):

Topic summary

The discussion centers on the development of an internet radio and audio file player based on the ESP32-S3-WROOM-1 module, featuring a custom-designed prototype PCB with OLED display and user controls including rotary encoders and buttons. Key challenges addressed include pin spacing discrepancies in the ESP32-S3 module footprint, integration of Wi-Fi connectivity with dynamic station list updates, and handling of Polish character encoding on the OLED display. The project uses Arduino IDE (version 2.3.2) with ESP-IDF support and requires enabling PSRAM. Audio playback supports MP3, AAC, and FLAC streams, with the ESP32-audioI2S library recommended over the incompatible Audio library. Users reported issues with SPI MISO pin assignment causing bootloader conflicts, resolved by reassigning MISO to pin 35. The project incorporates WiFiManager for network configuration, EEPROM and SD card storage for saving last played station and settings, and includes plans for tone control via an external KA2107 equalizer and a CS8673 amplifier module. Problems with encoder input stability and memory limitations for Bluetooth A2DP on ESP32-S3 were noted. The community suggested alternatives like KaRadio and ESP32-MiniWebRadio projects. Debugging tips include serial terminal logs for HTTP errors and flash memory erasure to resolve boot loops. The project is open-source on GitHub, encouraging forks and modifications. Additional features under development include browser-based updates, directory navigation, and potential audio recording to SD card.
Summary generated by the language model.
ADVERTISEMENT