It’s going to be hard to do everything from scratch, especially as the complexity of the project increases. But even with many abstractions, so long as you understand what specific roles they play and how they make your life easier, you’ll continue to have control over your project and have it be as minimally black-box as possible.
With the use of the LCD module, sending data streams to the screen was relatively simple. And that’s the only difference with this project from the ones I worked on in the past, the added layer of interfacing with an LCD. The ATmega328P has enough memory to be able to use the <stdio> library, as well as an oscillator with an adequate frequency that I didn’t have to use an external crystal.
But as is the case with any project of this level of complexity, it is important to break it up into manageable parts that will serve as stepping stones to leveling up complexity incrementally.
Here's the link to the full article on Medium.