Bird
Raised Fist0
Arduinoprogramming~10 mins

Connecting multiple I2C devices in Arduino - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Connecting multiple I2C devices
Start I2C Bus
↓
Scan for Devices
↓
Identify Device Addresses
↓
Connect Devices with Unique Addresses
↓
Communicate with Each Device
↓
Handle Data Separately
↓
End Communication
This flow shows how the Arduino starts the I2C bus, finds devices, connects to each with unique addresses, and communicates with them one by one.
Execution Sample
Arduino
Wire.begin();
Wire.beginTransmission(0x3C);
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
This code initializes I2C, then sends data to two devices with addresses 0x3C and 0x68 separately.
Execution Table
StepActionDevice AddressData SentResult
1Initialize I2C bus--Bus ready
2Begin transmission0x3C-Started communication with device 0x3C
3Write data0x3C0x00Data queued for device 0x3C
4End transmission0x3C-Data sent to device 0x3C
5Begin transmission0x68-Started communication with device 0x68
6Write data0x680x00Data queued for device 0x68
7End transmission0x68-Data sent to device 0x68
💡 All devices communicated with separately using their unique addresses.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5After Step 6After Step 7
currentDevicenone0x3C0x3Cnone0x680x68none
dataBufferemptyempty0x00emptyempty0x00empty
Key Moments - 2 Insights
Why do we need to use different addresses for each I2C device?
Each device on the I2C bus must have a unique address so the Arduino knows which device to talk to, as shown in steps 2 and 5 where different addresses 0x3C and 0x68 are used.
Can we send data to multiple devices at the same time on I2C?
No, the Arduino communicates with one device at a time by starting and ending transmission separately for each device, as seen in steps 2-4 and 5-7.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what device address is used at step 5?
A0x3C
B0x68
C0x00
DNo device
💡 Hint
Check the 'Device Address' column at step 5 in the execution_table.
At which step is data actually sent to the device 0x3C?
AStep 4
BStep 2
CStep 3
DStep 5
💡 Hint
Look for 'End transmission' action for device 0x3C in the execution_table.
If both devices had the same address, what would happen in the communication?
ABoth devices receive data correctly
BArduino stops communication
COnly one device responds, causing conflicts
DData is sent to a new address automatically
💡 Hint
Recall the key moment about unique addresses and how Arduino communicates with one device at a time.
Concept Snapshot
Connecting multiple I2C devices:
- Each device must have a unique address.
- Use Wire.begin() to start I2C.
- Communicate by beginTransmission(address), write(data), endTransmission().
- Talk to devices one at a time.
- Addresses avoid conflicts on the bus.
Full Transcript
This lesson shows how to connect multiple I2C devices to an Arduino. The Arduino starts the I2C bus with Wire.begin(). It then communicates with each device separately by using the device's unique address. For example, it sends data to device 0x3C first, then to device 0x68. Each communication starts with beginTransmission(address), then data is written, and finally endTransmission() sends the data. Devices must have different addresses so the Arduino knows who to talk to. The execution table shows each step clearly. This method avoids conflicts and ensures each device gets the right data.

Practice

(1/5)
1. What is the main reason multiple I2C devices can share the same two wires on an Arduino?
easy
A. They use different clock speeds to avoid conflicts
B. Each device uses a separate data wire
C. Each device has a unique address to identify it on the bus
D. They communicate one at a time using different power pins

Solution

  1. Step 1: Understand I2C wiring basics

    I2C devices share two wires: SDA (data) and SCL (clock).
  2. Step 2: Identify how devices are distinguished

    Devices use unique addresses so the master knows which device to talk to.
  3. Final Answer:

    Each device has a unique address to identify it on the bus -> Option C
  4. Quick Check:

    Unique addresses allow multiple devices on same wires [OK]
Hint: Remember: unique addresses let devices share wires [OK]
Common Mistakes:
  • Thinking devices use separate wires
  • Assuming different clock speeds separate devices
  • Believing devices use different power pins to communicate
2. Which Arduino code snippet correctly initializes the I2C bus for multiple devices?
easy
A. Wire.init();
B. Wire.begin();
C. Wire.begin(0x3C);
D. Wire.start();

Solution

  1. Step 1: Recall the correct function to start I2C

    The Arduino Wire library uses Wire.begin() to start the I2C bus as master.
  2. Step 2: Check other options for correctness

    Wire.begin(0x3C) sets device as slave with address 0x3C, not for master init. Wire.init() and Wire.start() do not exist in Wire library.
  3. Final Answer:

    Wire.begin(); -> Option B
  4. Quick Check:

    Wire.begin() starts I2C master bus [OK]
Hint: Use Wire.begin() once to start I2C bus [OK]
Common Mistakes:
  • Using Wire.begin(address) to start master
  • Calling non-existent Wire.init() or Wire.start()
  • Not calling Wire.begin() at all
3. Given this Arduino code snippet, what will be the output on the Serial Monitor if device at address 0x40 returns 25 and device at 0x41 returns 30?
Wire.begin();
Wire.beginTransmission(0x40);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x40, 1);
int temp1 = Wire.read();
Wire.beginTransmission(0x41);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x41, 1);
int temp2 = Wire.read();
Serial.print(temp1);
Serial.print(", ");
Serial.println(temp2);
medium
A. Compilation error
B. 30, 25
C. 0, 0
D. 25, 30

Solution

  1. Step 1: Understand the communication sequence

    The code requests one byte from device 0x40, reads it as temp1 (25), then requests one byte from 0x41, reads it as temp2 (30).
  2. Step 2: Check the Serial output commands

    Serial.print(temp1) prints 25, then ", ", then Serial.println(temp2) prints 30 with newline.
  3. Final Answer:

    25, 30 -> Option D
  4. Quick Check:

    Read values match device addresses in order [OK]
Hint: Match device address to read value order [OK]
Common Mistakes:
  • Mixing up device addresses and values
  • Assuming output is reversed
  • Thinking code causes compile error
4. This Arduino code tries to read from two I2C devices but always reads zero. What is the likely error?
Wire.begin();
Wire.beginTransmission(0x50);
Wire.write(0x01);
Wire.endTransmission();
Wire.requestFrom(0x50, 1);
int val1 = Wire.read();
Wire.beginTransmission(0x50);
Wire.write(0x02);
Wire.endTransmission();
Wire.requestFrom(0x51, 1);
int val2 = Wire.read();
Serial.println(val1 + val2);
medium
A. Requesting from 0x51 instead of 0x50 causes no data
B. Missing Wire.begin() call
C. Using Wire.write() before Wire.requestFrom() is wrong
D. Serial.println() cannot print integers

Solution

  1. Step 1: Analyze device addresses used

    The code writes to 0x50 twice but requests data from 0x50 first, then 0x51 second. If 0x51 device is not connected, no data is returned.
  2. Step 2: Understand impact on read values

    Reading from 0x51 returns no data, so Wire.read() returns 0, causing sum to be zero or incorrect.
  3. Final Answer:

    Requesting from 0x51 instead of 0x50 causes no data -> Option A
  4. Quick Check:

    Address mismatch causes no data read [OK]
Hint: Check device addresses match in all calls [OK]
Common Mistakes:
  • Confusing write and requestFrom addresses
  • Forgetting to call Wire.begin() once
  • Thinking Wire.write() before requestFrom() is invalid
5. You want to connect three I2C temperature sensors with addresses 0x48, 0x49, and 0x4A to an Arduino. Which of the following is the best approach to read all sensors reliably?
hard
A. Call Wire.begin() once, then read each sensor by its unique address with Wire.requestFrom()
B. Call Wire.begin() before reading each sensor separately
C. Use separate SDA and SCL wires for each sensor to avoid conflicts
D. Assign the same address to all sensors and read them one by one

Solution

  1. Step 1: Understand I2C bus initialization

    Wire.begin() must be called once to initialize the bus as master before any communication.
  2. Step 2: Read sensors by unique addresses on shared bus

    Each sensor has a unique address; read each by calling Wire.requestFrom() with that address on the same SDA and SCL lines.
  3. Step 3: Evaluate other options

    Calling Wire.begin() multiple times is unnecessary. Using separate wires defeats I2C design. Assigning same address causes conflicts.
  4. Final Answer:

    Call Wire.begin() once, then read each sensor by its unique address with Wire.requestFrom() -> Option A
  5. Quick Check:

    One Wire.begin(), unique addresses, shared wires [OK]
Hint: Initialize once, read each device by unique address [OK]
Common Mistakes:
  • Calling Wire.begin() multiple times
  • Trying separate wires for each I2C device
  • Using same address for multiple devices
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard