Back before all of the bluetooth speaker options we have today were available, wireless speaker options were fairly expensive and limited. I decided to challenge my electronic and fabrication skills by building my own custom speaker. The design consists of a few different modules wired together with an Arduino controlling it all. Here is my original (heavily revised) schematic:
The different electronic modules consists of a power regulator for both battery charging and power management supplying most components with a 3.3v power rail, a BC127 bluetooth module, class D audio amplifier, real time clock module, RGB backlit LCD display, PRAM chip for persisting settings, and an Arduino pro mini which controls all these sub-components. Some of the components require 5v to operate so a boost converter is used as well. A rotary encoder and six DIP switches make up all the controls for menu navigation, play/pause, next/previous, volume and pairing mode. The most challenging part the project was actually getting the bluetooth module to communicate with the Arduino microcontroller using the serial data line. Another stumbling block I ran into with this project was the LCD which did not work initially, most likely from the heat applied to it while soldering the pins. A replacement LCD fixed the issue. Finally, once the unit was working as a basic bluetooth speaker I quickly realized some of the additional functions I wanted to add (e.g., RGB light changing to the music, digital frequency meter, etc.) would not be possible due to the SRAM flash memory constraints on the Arduino Pro mini itself. This might have been solvable by swapping the Arduino’s ATEMGA chip for a one with more flash storage or developing a sophisticated paging mechanism to PRAM, but I simply decided to leave it as it was.
The main interface for the speaker consists of an LCD text-based menu with a push button rotary encoder which facilitates menu browsing and selection with a single click, navigate back with a double click and finally a press and hold to return to the main menu.