Why I2C is used with Raspberry Pi - Performance Analysis
When using I2C communication with Raspberry Pi, it is important to understand how the time taken grows as more devices or data are involved.
We want to know how the time to send or receive data changes when the number of devices or data size increases.
Analyze the time complexity of sending data to multiple I2C devices connected to Raspberry Pi.
for device in devices:
i2c.start()
i2c.send_address(device.address)
for byte in data:
i2c.send_byte(byte)
i2c.stop()
This code sends the same data bytes to each device on the I2C bus one by one.
Look at what repeats in the code:
- Primary operation: Sending each byte of data to each device.
- How many times: For each device, the inner loop sends all bytes of data.
As the number of devices or data bytes grows, the total sending time grows too.
| Input Size (devices x data bytes) | Approx. Operations |
|---|---|
| 10 devices x 5 bytes | 50 sends |
| 100 devices x 5 bytes | 500 sends |
| 100 devices x 100 bytes | 10,000 sends |
Pattern observation: The total operations grow by multiplying the number of devices by the number of bytes sent.
Time Complexity: O(n x m)
This means the time grows proportionally to the number of devices (n) times the number of data bytes (m) sent to each device.
[X] Wrong: "Sending data to multiple devices takes the same time as sending to one device."
[OK] Correct: Because each device requires its own communication session, the time adds up for each device multiplied by the data size.
Understanding how communication time grows with devices and data helps you design efficient Raspberry Pi projects and explain your reasoning clearly in technical discussions.
"What if we send different amounts of data to each device? How would the time complexity change?"
Practice
Solution
Step 1: Understand I2C wiring
I2C uses just two wires: SDA (data) and SCL (clock) to connect devices.Step 2: Recognize device addressing
Each device on the I2C bus has a unique address, allowing multiple devices on the same two wires.Final Answer:
It uses only two wires to connect multiple devices with unique addresses. -> Option CQuick Check:
I2C = Two wires + multiple devices [OK]
- Thinking each device needs its own wire
- Believing I2C is wireless
- Assuming only one device can connect
Solution
Step 1: Identify how to enable I2C
Raspberry Pi usessudo raspi-configto enable interfaces like I2C.Step 2: Confirm correct method
Within raspi-config, under Interface Options, you can enable I2C properly.Final Answer:
Use the commandsudo raspi-configand enable I2C under Interface Options. -> Option AQuick Check:
Enable I2C via raspi-config [OK]
- Skipping enabling I2C before use
- Editing wrong config files
- Assuming installing tools enables I2C
import smbus bus = smbus.SMBus(1) address = 0x48 value = bus.read_byte(address) print(value)What does this code do?
Solution
Step 1: Understand SMBus usage
smbus.SMBus(1)opens I2C bus 1 on Raspberry Pi.Step 2: Analyze read_byte call
bus.read_byte(address)reads one byte from device at address 0x48.Final Answer:
Reads one byte of data from the I2C device at address 0x48 and prints it. -> Option AQuick Check:
read_byte(address) = read data [OK]
- Confusing read_byte with write_byte
- Thinking SMBus(1) is invalid
- Assuming no device communication happens
import smbus bus = smbus.SMBus(1) address = 0x40 value = bus.read_byte(0x40) print(value)But it raises an IOError. What is the likely problem?
Solution
Step 1: Understand IOError cause
IOError usually means no device responds at the given address.Step 2: Check device connection
If sensor is not connected or powered, Raspberry Pi can't read data, causing error.Final Answer:
The sensor is not connected or powered properly at address 0x40. -> Option BQuick Check:
IOError = device missing or unpowered [OK]
- Changing SMBus number unnecessarily
- Confusing read_byte with write_byte
- Assuming address 0x40 is invalid
Solution
Step 1: Understand I2C wiring advantage
I2C uses two wires (SDA and SCL) shared by all devices.Step 2: Recognize unique addressing
Each sensor has a unique address (0x20, 0x21, 0x22), so Raspberry Pi can talk to each separately on the same wires.Final Answer:
I2C allows all sensors to share the same two wires, using unique addresses to communicate separately. -> Option DQuick Check:
Two wires + unique addresses = multiple devices [OK]
- Thinking each sensor needs separate wires
- Believing I2C is wireless
- Assuming only one device can connect
Ready to prove it?
Pass the test and this pattern moves unknown
