loading
Picture of I2C between Arduinos

Maybe sometimes we want to share the workload of one Arduino with another. Or maybe we want more digital or analog pins. Inter-Integrated Circuit or I2C (pronounced I squared C) is the best solution.

I2C is an interesting protocol. It's usually used to communicate between components on motherboards in cameras and in any embedded electronic system.

Here, we will make an I2C bus using two Arduinos. We will program one master Arduino to command the other slave Arduino to blink its built-in LED once or twice depending on the received value.

In order to build this we need the following "ingredients":

  • 2 Arduinos
  • Jumper cables
This instructable and many more can be found in my Arduino Development Cookbook available here. :D

 
Remove these adsRemove these ads by Signing Up

Step 1: How to connect them

Picture of How to connect them
I2C.png

Follow these steps to connect two Arduino UNOs using I2C:

  1. Connect pins A4 and A5 on one Arduino to the same pins on the other one.
  2. The GND line has to be common for both Arduinos. Connect it with a jumper.

We also have a schematic and a "breadboard" implementation, both easy to follow. Luckily, it's a simple implementation.

Remember never to connect 5 V and 3.3 V Arduinos together. It won't
hurt the 5V Arduino, but it will certainly annoy its 3.3 V brother!
1-40 of 67Next »
XydenK14 days ago

Hi,

I dunno any one asked before,so I asked again.

How to make Slave to Sent data to Master Arduino??

cornelam (author)  XydenK13 days ago
Hi,

The Slave cannot directly write to the Master.
However, the master can request data from the Slave.
Here is a link to the procedure:
https://www.arduino.cc/en/Tutorial/MasterReader
tayebz115 days ago

good

hi,can anyone tell hoe to send a variable string using I2c protocol??

I want to send the variable type String name dataString using i2c protocol,wire library, Wire.write() function

cornelam (author)  abhishekbaghel18 days ago

Write a for loop from 0 to the length of the string you want to write and for each iteration just put Wire.wirte(dataString[index]);

esg.82720 days ago

hello im quite new to arduino im trying to build a slider for my camera, with a tft screen and a stepper motor, i own a leonardo and a UNO is it possible to link these 2 together for one to work with the motor and the other to work with the screen?

cornelam (author)  esg.82720 days ago

Yes, it is possible and I2C is one of the possible communication protocols which can connect them.

Mody Ashraf21 days ago

Thanks For explaining the i2c concept

pradipkhare1 month ago

Hi Cornel,

First of all thank you very much for explaining the I2C concept using Arduino in a simple and straight forward way. I used your example and it worked like a charm (but after replacing old methods with read() and write() in new version of Arduino).

You helped me to generate interest in using the i2C communication than USART, where I struggled lots of to get the right values and not the garbled data.

However, I have a question, in my case, if master also has to receive response from the slave after they performed the action- let's called it acknowledgement. Could you pls provide your an expert advice how to achieve this? In other words, how to achieve bidirectional communication by Master and Slave ?

Currently, in UART, we can achive this by using both Tx & Rx at the same time.

Once again thanks for your support and publishing this topic here.

Regards,

Pradip

pmap932 months ago

Good Day!

This is really interesting, thanks for sharing!

Question though, how's the pin assignments ? Like, if MEGA is master then UNO is slave. D1 on Mega remains as pin 1 and the D1 of UNO would be what in coding?

Sorry if it doesn't seem clear, I'm learning Arduino :D

cornelam (author)  pmap932 months ago
Hello,

I don't really understand your question.
The digital pins have nothing to do with I2C, however, in general the pin numbers are the same across Arduinos.
For example, if you do digitalWrite(10, HIGH); It will do the same thing on all Arduino models - make pin 10 High...

Hope this helps.

You can also check my newly published book: Arduino Development Cookbook by Cornel Amariei on Amazon.

Best regards,
Cornel
pmap93 cornelam2 months ago

OH, because I have an arduino UNO where the pins are all used up (CNC machine). I plan to buy another to incorporate an LCD display to my project, therefore I'll need to connect the LCD pins on another UNO.

But since Im connecting the two Arduinos together, do I still have to program them both separately or add the LCD codes to the master?

firermans932 months ago

hello i want to make 1 master using mega 2560 and slave using 2 unit uno,how can my mega recognize the address of the uno to avoid sending data mistake,please help me

regard

cornelam (author)  firermans932 months ago
Hello,

The Mega has to be set as master and it has to know the addresses of the 2 Uno slaves.
Each Uno slave will have a different address.

Best regards,
Cornel

hi....i want to rum two DC servo motors with arduino uno board, but i know that one uno board can move only two servo motors, but by interfacing two arduino uno, can i able to move 4 servo motors ... with some time delays ofcourse.

help me plz..in this regard

Live2Tinker4 months ago

Hello, I'm not sure if anyone has asked this or not, but doesn't the arduino uno have 2 pins above pin AREF labeled SCL and SDA? Can't these pins be used without interfering with other pins? Plus, is it possible to use the internal pull-ups over externat ones?

In the arduino uno analog pin A4 and analog pin A5 work as SDL and SCL

cornelam (author)  Live2Tinker4 months ago
Hello,

Yes, If you have a newer R3 board with independent SDA and SCL pins you can use those.
Also, no external resistors are required anymore, as they are built in.

Best regards,
Cornel
rtorres285 months ago

Hi, I'm having problems, with this stuff. I like to communicate an arduino Mega, UNO and 4 IR temperature sensors ( mlx90614 that use I2C communication ). The Uno will check temperature and send 1 byte if detect a temperature over the range that I will specify and 0 if not. The UNO and the sensors are both slaves (I dont know if this affect), and when I connect only UNO and Mega they communicate passing any data I want, If I connect UNO and the sensors it detect temperature, but when I communicate the 2 arduinos and the sensors the comunication stops and the sensors do not detect anything. How can I fix this?

CarnefixN6 months ago

Hi. I want to use this System with multiple Arduino Mega 2560.

From what i have understood, I don't need the Voltage connection as long as the devices get the same reference Voltage. So I would only need the CLOCK, DATA and GROUND connection.

Is that correct?

cornelam (author)  CarnefixN6 months ago
Hi, that is correct.
However, if you have some spare time, test it with and without the resistors and give me some feedback on it.

Thank you!

Best regards,
Cornel

Hi cornelam,

I looked into the wiring of the Mega 2560 board itself and found that the SDA and SCL already have each a 10kOhm resistance to 5V build in.

I work just fine without the external resistors you mentioned.

Greets CarnefixN

CarnefixN5 months ago

Hello cornelam,

I connected my 2 Mega 2560 together. The problem is that both of them have the same real time clock 'DS1307' which is in the I2C connection.

It has a fixed address 0x68(104). Is there a way to deactivate one without having to remove them?

Greets CarnefixN

donaldece2k155 months ago

Good Day Sir. Thank you for the wonderful guide regarding this protocol. I have tried sending data via I2C, arduino to arduino. numbers that is, or single character data's. If suppose I would like to send an array of characters, say INITIATE_PROTOCOL to another arduino in I2C, how would I assign the variables? will it be char*? Hoping for your reply. Thank you a lot again.

cornelam (author)  donaldece2k155 months ago
Hello,

Thank you for the wonderful words.
You can attempt the string class, it basically implements the char pointer.
http://arduino.cc/en/Reference/String

Tell me if it worked.
Have fun!

Best regards,
Cornel

hello,

i am doing work on arduino for the first time i want to
know that if i have 3 slave ..and all of them are sender and one master
receiver how master will address them ...i want code frm master side..

dan30086 months ago

you say "Devices have to share both 5V (Power) and GND (Ground)"

is there a reason for this? couldnt I just have both devices powered at the same voltage?

They have to get the same voltage reference.

akospenda6 months ago

Hey, I'm using this as comms between 2 arduinos. I got it to respond to a photoresistor via the slave but when I tried to add ultrasonic sensor they interact and neither of them work, any idea why?

ðkital6 months ago

hi i just wanna ask if i can make an arduino as master at the same time as slave on both arduino?

or can i send data from master to slave? and slave to master?

kinda confused.,

cornelam (author)  ðkital6 months ago
Hello,

The Arduino only has one I2C Bus, so you can only be either a Master or a Slave at any particular time.
A slave cannot write to a Master but a Master can request data from a slave. Here is an example:
http://arduino.cc/en/Tutorial/MasterReader

Best regards,
Cornel Amariei
upvectormail6 months ago

I just came across this instructable today and while the basics work fine, I found out the hard way that you don't need pull-up resistors anymore. In fact it doesn't work if you use them. The Arduinos I tried were Uno, Due and Leonardo and neither of them requires resistors between 5V and SDA or SCL. It's also prudent to look up the SDA and SCL pin mapping for the different types of Arduino (ie: Leonardo: 2 and 3, Uno: 4 and 5, Due, 20 and 21) in the documentation of the wire library: http://arduino.cc/en/pmwiki.php?n=Reference/Wire

Hi

You might be right about the no need for doing it, but Im using it with Uno and it works fine for me.

Hi. What is max distance between two arduinos allowable ? thank you

ImeshU9 months ago

Hi... thank you very much for sharing mach valuable information... but i'm having trouble using pin4 and pin5 as i am using a gsm shield.. it consumes pin 4 and pin 5...is there any possibility to use pin 9 and pin 10 or any other pin couple ??? i am new to arduino...thank you very much again...

Find out the address of the GSM shield comms and use any different address. Just solder the header or wires to A4 and A5 and connect to another Arduino.

frivolas11 months ago

Hi All!

Thanks cornelam for this instructable! Clear and easy to follow. I finally get a grasp on WTH is I2C.

Just a quick question, is there any particular convention to assign addresses to the slave devices? Can I just name any device as I want (1,2,3...116), or should I name them in a particular way?

Thanks!

Jayw2 frivolas8 months ago

You can use any address and it does not have to be in any particular order (although some are reserved; look it up online), although I tend to name them consequetely for the ease of programming :)

casonye8 months ago

Hi, I need a schematics for USING ARDUINO MICRO-CONTROLLER TO MANAGE THE MOVEMENT OF A FOUR BIT BINARY CODE OVER AN OPTICAL LINK

pkgdelion8 months ago

still need help!!!

1-40 of 67Next »