Connecting multiple I2C devices lets you use many sensors or modules with just two wires. This saves space and wiring complexity.
Connecting multiple I2C devices in Arduino
Wire.begin();
// For each device, use its unique I2C address
Wire.beginTransmission(device_address);
// Send or request data
Wire.endTransmission();Each I2C device must have a unique address to avoid conflicts.
Use Wire.begin() once in setup() to start I2C communication.
Wire.begin(); Wire.beginTransmission(0x40); // Device 1 address // communicate with device 1 Wire.endTransmission(); Wire.beginTransmission(0x41); // Device 2 address // communicate with device 2 Wire.endTransmission();
Wire.begin(); // Read from device 1 Wire.requestFrom(0x40, 2); while (Wire.available()) { char c = Wire.read(); // process data } // Read from device 2 Wire.requestFrom(0x41, 2); while (Wire.available()) { char c = Wire.read(); // process data }
This program shows how to talk to two I2C devices with addresses 0x40 and 0x41. It sends a command and reads one byte from each device, then prints the data to the Serial Monitor.
#include <Wire.h> void setup() { Serial.begin(9600); Wire.begin(); Serial.println("Starting I2C communication with two devices..."); } void loop() { // Communicate with device at address 0x40 Wire.beginTransmission(0x40); Wire.write(0x00); // example command Wire.endTransmission(); Wire.requestFrom(0x40, 1); if (Wire.available()) { int data1 = Wire.read(); Serial.print("Data from device 0x40: "); Serial.println(data1); } // Communicate with device at address 0x41 Wire.beginTransmission(0x41); Wire.write(0x00); // example command Wire.endTransmission(); Wire.requestFrom(0x41, 1); if (Wire.available()) { int data2 = Wire.read(); Serial.print("Data from device 0x41: "); Serial.println(data2); } delay(2000); // wait 2 seconds before next read }
Make sure each device has a unique I2C address; some devices allow changing their address with pins.
Use pull-up resistors (usually 4.7kΩ) on SDA and SCL lines if your board or devices don't have them built-in.
Check device datasheets for their I2C addresses and commands.
Multiple I2C devices share the same two wires but must have unique addresses.
Use Wire.begin() once, then communicate with each device by its address.
Pull-up resistors and correct wiring are important for reliable communication.
Practice
Solution
Step 1: Understand I2C wiring basics
I2C devices share two wires: SDA (data) and SCL (clock).Step 2: Identify how devices are distinguished
Devices use unique addresses so the master knows which device to talk to.Final Answer:
Each device has a unique address to identify it on the bus -> Option CQuick Check:
Unique addresses allow multiple devices on same wires [OK]
- Thinking devices use separate wires
- Assuming different clock speeds separate devices
- Believing devices use different power pins to communicate
Solution
Step 1: Recall the correct function to start I2C
The Arduino Wire library uses Wire.begin() to start the I2C bus as master.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.Final Answer:
Wire.begin(); -> Option BQuick Check:
Wire.begin() starts I2C master bus [OK]
- Using Wire.begin(address) to start master
- Calling non-existent Wire.init() or Wire.start()
- Not calling Wire.begin() at all
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);Solution
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).Step 2: Check the Serial output commands
Serial.print(temp1) prints 25, then ", ", then Serial.println(temp2) prints 30 with newline.Final Answer:
25, 30 -> Option DQuick Check:
Read values match device addresses in order [OK]
- Mixing up device addresses and values
- Assuming output is reversed
- Thinking code causes compile 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);
Solution
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.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.Final Answer:
Requesting from 0x51 instead of 0x50 causes no data -> Option AQuick Check:
Address mismatch causes no data read [OK]
- Confusing write and requestFrom addresses
- Forgetting to call Wire.begin() once
- Thinking Wire.write() before requestFrom() is invalid
Solution
Step 1: Understand I2C bus initialization
Wire.begin() must be called once to initialize the bus as master before any communication.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.Step 3: Evaluate other options
Calling Wire.begin() multiple times is unnecessary. Using separate wires defeats I2C design. Assigning same address causes conflicts.Final Answer:
Call Wire.begin() once, then read each sensor by its unique address with Wire.requestFrom() -> Option AQuick Check:
One Wire.begin(), unique addresses, shared wires [OK]
- Calling Wire.begin() multiple times
- Trying separate wires for each I2C device
- Using same address for multiple devices
Ready to prove it?
Pass the test and this pattern moves unknown
