Mixed Voltage I2C

I have a project where a pro-mini acts as a primary controller for a hydroponics setup. Part of that setup is an I2C LCD with buttons that lets you set (among other things) the lights-on and lights-off times. I want to add a Wemos D1 Mini that communicates with the pro-mini on its shared bus to the LCD to control the light cycle whereby the pro-mini tells the D1 what the on- and off-times are, then the D1 monitors the time from the internet, and alerts the pro-mini at the proper times.

So I'm wondering how you go about doing that, considering the D1 mini is not 5V tolerant. Since the pro-mini is running at 5V, I'm guessing simply pulling SDA and SCL up to 3.3V wouldn't be enough since all the communication coming out of the pro-mini would still be 5V, right? Or does all the communication happen though pins being pulled low, meaning this would work?

Alternatively, would putting the whole I2C bus on a voltage divider like pictured below be sufficient? This image shows SDA and SCL coming from the pro-mini, going through the voltage divider after being pulled high to 5V, then going on out to the rest of the components on the bus. VCC = 5V.



I am quite confused with how things are connected and function. You can't have one I2C master (Wemos) talk to another I2C master (pro mini). You CAN have Wemos talk to the LCD, and at another time have pro mini talk to the same LCD via logic level shifter. But, I think it's better if you redesign what part does what. Such as: LCD connects to pro mini via I2C. Wemos connects to pro mini via software serial port. You can have Wemos TX connect to pro mini RX and Wemos RX via a voltage divider connected to pro mini TX. Design a simple protocol between the two controllers.

Sorry for the lack of clarity. In this scenario, the pro-mini would be Master with LCD and D1 both being slaves (assuming the issues of making an esp8266 a slave have been worked out - I hear rumors they have, but I haven't delved into it yet).

I thought about serial as well since that would be easy to do with level-shifting, and wouldn't interfere with any other pre-existing connections, but I hadn't read too much about it yet. The few examples I've looked at all dealt with sending char's over serial, and I'll need to send a small uint8_t array. If you know of any examples to do that, it would be appreciated.

I recommend instead of trying with resistors active level shifters like these:


If Di I2C slave has not been worked out in the arduino universe, check if the MicroPython universe has this already in place.

Thanks for that. Do these provide a cleaner signal than the resistor-method?

I love that so many places include the Eagle files for their boards. :-)