Building a Secret Santa allocator and SMS sender using a Raspberry Pi Pico/MicroPython and SIM800L module
Over the past couple of years, I have explored several different ways to solve the problem of allocating Secret Santas for members of my family. Having spent a couple of months recently exploring microcontrollers, I decided that this year I would send out automatically allocated Secret Santas via SMS using a Raspberry Pi Pico, MicroPython, and a SIM800L GSM module.
The Build
The system I designed comprised a display (that I had used in a previous project), the Raspberry Pi Pico, and a SIM800L GSM module.
Upon boot, the system reads the supplied participants.json
file, which contains the participants’ names and phone numbers.
Once allocation commences, all participants are assigned a Secret Santa, with the resulting allocation notifications being sent out via SMS.
The display is used to report the current status throughout both the allocation and notification phases.
The final solution can be found on GitHub, with additional usage instructions included.
The Allocation Process
I decided to use the same technique I had employed in a previous year’s solution to allocate the Secret Santas.
This method applied a brute-force approach, which uniformly shuffled the given participants into pairs, returning the allocations if all pairs met the desired criteria (i.e. not oneself or within an exclusion listing).
Looking through the MicroPython documentation, however, I noticed that no array shuffle functionality was present.
As such, I opted to implement my own Fisher–Yates shuffle algorithm, which performed these capabilities that were lacking from the standard library.
MicroPython does, however, provide some of the high-level Python constructs I have grown accustomed to (such as zip
and all
), which produced a very succinct end solution.
Sending the SMS
The most interesting part of the entire project was exploring how you could send SMS messages using the Pico.
The SIM800L module is a GSM cellular chip that communicates with the microcontroller via UART.
I opted to build a small abstraction within MicroPython around communication with the SIM800L via AT
commands.
This abstraction handled the necessary initial configuration setup and connection to the mobile network provider.
Furthermore, it encapsulated the behaviour required to send an SMS to a given phone number.
Conclusion
This was by far my most enjoyable Secret Santa allocation system to design and build to date. Having the ability to begin the allocation process using a physical button and subsequently see progress reported on the display was very pleasing. I really look forward to exploring other ways in which I can use mobile network communication within projects like this in the future.