Lukas Fassler from Soldernerd shares his experience designing a bi-directional voltage level translator and manufacturing the board with DirtyPCBs.
While most of my microcontroller designs run on 3.3 volts there is still the occasional 5 volt design. Or I do something with an Arduino. So the need may arise to interface between logic working at different voltage levels. There are several ways of doing this, depending on your needs. Things are relatively simple as long as you know in advance which side is transmitting and which side is receiving. It gets more difficult if the communication is bi-directional or with buses such as I2C that are bi-directional by nature.
Bi-Directional Voltage Level Translator – [Link]